设计模式之开闭原则
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
(稳定的),代表的含义就是六大原则结合使用才会更稳定,做到真正的 “拥抱变化”。