ougato Sharing changes the world

设计模式之开闭原则

2021-04-23
ougato

设计模式之开闭原则

6.1 开闭原则的定义

  • 哲学上,矛盾法则既对立统一的法则,是维护辩证法的最根本法则。
  • 一个软件实体如类,模块和函数应该对扩展开放,对修改关闭。

3W原则:

  • Waht - 是什么
  • Why - 为什么
  • How - 怎么做

6.2 开闭原则的庐山真面目

  • 软件实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化,软件实体包含(抽象、类、方法、模块)。

  • 在非金融类项目中对货币处理时,只保留两位精度时,设计在运算过程中扩大 100 倍,在需要展示时再缩小 100 倍,减少精度带来的误差。

  • 开闭原则对扩展开放,对修改关闭,并不意味着不做任何修改,底层模块的变更,必然要有高层模块进行耦合,否则就是一个孤立无意义的代码片段。

6.3 为什么要采用开闭原则

  • 开闭原则是单一职责原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特法则的抽象类;好比牛顿第一定律在力学、勾股定律在几何学、质能方程在相依相对论中的地位。

提高复用性:

  • 在面向对象的设计中,所有的逻辑都是从院子逻辑组合而来的,而不是在一个类中独立实现一个业务逻辑,只有这样的代码才可以复用,颗粒度越小,被复用的可能性就越大,缩小逻辑颗粒度,知道一个逻辑不可再拆分为止。

提高可维护性:

  • 维护人员最乐意做的事情是扩展一个类,而不是修改一个类,不要让他在原有的代码海洋里游戈完毕后在修改,那是对维护人员的一种折磨和摧残。

面向对象开发要求:

  • 软件总会有可变的需求,留下属于自己的接口,等待 “可能” 转变为 “现实”。

6.4 如何使用开闭原则

抽象约束:

  • 通过接口或抽象类约束扩展,对扩展进行边界限定,不允许在实现类中出现接口或抽象类没有的 public 方法。
  • 参数类型、引用对象尽量使用接口或者抽象类,而不是实现类。
  • 抽象层尽量保持稳定,一旦确定即不允许修改。

元数据(metadata)控制模块行为:

  • 配置参数来改变程序的行为。

制定项目章程:

  • 章程中指定了所有人员都必须遵守的约定,团队需要一个较长时间的磨合,对项目来说,约定优于配置。

封装变化:

  • 将相同的变化封装到一个接口或抽象类中。
  • 将不同的变化封装到不同的接口或抽象类中,不应该出现两个不同的变化出现在同一个接口或抽象类中。
  • 找出预计有变化的点,我们为这些变化点创建稳定的接口,封装可能发生的变化,一旦发觉到有变化,就可以进行封装。

六大原则:

  • Single Responsibility Principle
    • 单一职责原则
  • Open Closed Principle
    • 开闭原则
  • Liskov Substitution Principle
    • 里氏替换原则
  • Law of Demeter
    • 迪米特法则
  • Interface Segregation Principle
    • 接口隔离原则
  • Dependence Inversion Principle
    • 依赖倒置原则
  • 把这 6 个原则的首字母去重联合起来, SOLID (稳定的),代表的含义就是六大原则结合使用才会更稳定,做到真正的 “拥抱变化”。

Comments

Content