《设计模式之美》笔记:设计准则
SOLD准则
| 设计准则 | 缩写 | 解释 | 反作用 | 实操 |
|---|---|---|---|---|
| 单一职责准则 | SRP | 一个类或者者模块只负责完成一个职责(或者功能)。 | 细粒度太细会降低代码内聚,影响代码的可维护性。 | 先写一个粗粒度的类满足业务需求,根据实际需要持续重构。 |
| 开闭准则 | OCP | 增加一个新功能应该是,在已有代码基础上扩展代码(新添加模块、类、方法等),而非修改已有代码(修改模块、类、方法等)。 | 支持这一准则的关键是预留扩展点,但要小心过度设计。 | 只需改动不破坏原有的代码的正常运行,没有破坏原有的单元测试,我们即可以说这是一次合格的代码改动。 |
| 里氏替换准则 | LSP | 子类对象能够替换程序中父类对象出现的任何地方,并且保证原来程序的逻辑行为不变及正确性不被破坏。这作为一个设计准则,指导继承关系中子类该如何设计。 | – | 按照协议来设计,子类在设计的时候,要遵循父类的行为商定,包括函数公告实现的功能,对输入、输出、异常的商定,注释里特殊说明等,子类只能改变内部实现逻辑。 |
| 接口隔离准则 | ISP | 接口的调用者或者者使用者不应该强迫依赖它不需要的接口。 | ||
| 依赖反转准则 | DIP | 高层模块不要依赖底层模块,高层模块和底层模块应该通过笼统来互相依赖。 | 实际上平时的业务代码开发中,高层模块依赖底层模块没有任何疑问。这条准则主要用来指导框架层面的设计。 |
KISS准则 – 尽量保持简单。
- 不要使用同事可能不懂的技术来实现代码。
- 不要重复造轮子,要善于使用已经有的工具类库。
- 不要过度优化。不要过度使用少量奇淫技巧(比方,位运算代替算术运算、复杂的条件语句代替if-else、使用少量过于底层的函数等)来优化代码,牺牲代码的可读性。
YAGNI准则 – You Ain’t Gonna Need it.
- 不要去设计当前用不到的功能;不要去编写当前用不到的代码。核心思想就是:不要过度设计。
- 比方,假如暂时只用Redis存储配置信息,以后可能会用到ZooKeeper。那么在未用到ZooKeeper之前,我们没必要提前编写这部分代码。但是,这并不是说我们不需要考虑代码的扩展性。我们还是要预留好扩展点,等到需要的时候,再去实现ZooKeeper存储配置信息这部分代码。
DRY准则 – Don’t Repeat Yourself.
- 区分三种典型代发重复情况:实现逻辑重复,功能语义重复,代码执行重复。
- 有时,虽然代码的实现逻辑相同,但语义不同,那么它并不违背DRY准则。对于重复代码的问题,可以通过笼统成更细粒度函数的方式处理。(isValidUserName()跟isValidPassword()的例子)
- 功能语义重复的情况,通常都违背了DRY准则。(isValidIp()跟checkIfIpValid()的例子)
- 代码执行重复,也通常是违背DRY准则的,应该尽量优化。
- 延伸:如何提高代码的复用性?
- 减少代码耦合
- 满足单一职责准则
- 模块化
- 业务与非业务逻辑分离
- 通用代码下沉
- 继承、多态、笼统、封装
- 应用模板等设计模式
- 辩证:实际上,除非有非常明确的复用需求,否则为了暂时用不到的复用需求,花费太多的时间、精力,投入太多的开发成本,并不是一个值得推荐的做法。也违背了YAGNI准则。
LOD准则(迪米特法则) – 不该有直接依赖关系的类之间,不要有依赖;有依赖关系的类之间,尽量只依赖必要的接口。
- 高内聚:以类举例,相近的功能应该放到同一个类中,不相近的功能不要放到同一个类中。
- 松耦合:以类举例,类与类之间的依赖关系简单清晰。即便两个类有依赖关系,一个类的代码改动不会或者者很少导致依赖类的代码改动。
- 辩证:设计准则本身没有对错,只有是否用对之说。不要为了应用设计准则而应用设计准则,我们在应用设计准则的时候,肯定要具体问题具体分析。
- 例子:序列化和反序列化能否应该分拆成两个接口?答案是看情况。
- 假如Serialization类,只包含两个操作,没有太大必要分拆,否则就违反了高内聚思想。但假如Serialization类增加了更多功能,比方反序列化的函数变成了三个,一旦任一反序列化操作有代码改动,我们都需要检查测试所有依赖Serialization的代码能否还能正常工作。而其实部分使用者并没必要理解反序列化的“知识”,它们仅用到序列化。那么我们应该按照迪米特法则,将反序列化和序列化的功能隔离开来。
- 例子:序列化和反序列化能否应该分拆成两个接口?答案是看情况。
说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 《设计模式之美》笔记:设计准则
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 《设计模式之美》笔记:设计准则