开闭原则
由勃兰特·梅耶(Bertrand Meyer)提出,他在 1988 年的著作《面向对象软件构造》(Object Oriented Software Construction)中提出:软件实体应当对扩展开放,对修改关闭(Software entities should be open for extension,but closed for modification),这就是开闭原则的经典定义。
开闭原则 Open Closed Principie ,OCP
软件实体的行为应当不是修改实体,而是对实体进行扩展。
比如,有一个财务报表系统,已实现了财务数据的滚动,且负数显示红色的。但工作人员需要打印此报表数据,且需要对报表数据有其他格式要求。如果要满足这样的需求,需要考虑下,是否需要写新代码,老代码需要变更多少呢?
通过单一原则SRP进行实现,把计算财务数据,数据显示,打印数据的划分到不同职责中。通过分离后,还需要确认源码的依赖关系,确保变化之后不会影响到其他的组件,然后新功能的实现可以通过OCP原则,不进行修改而是通过扩展设计来完成实现。
实现方法
通过 “抽象约束、封装变化” 来实现开闭原则。使用抽象类或接口为实体定义一个稳定的抽象层,而可变的因素都封装在具体的实现类中。
所以,当软件发生变化时,只需要根据需求重新派生出一个实现类来扩展,严格遵守开闭原则。
abstract class Subject {
display():void {}
}
class Subject1 {
display() {
console.log('具体类1实现。。。')
}
}
class Subject12{
display() {
console.log('具体类2实现。。。')
}
}
开闭原则优点
- 对软件测试的影响:OCP原则是扩展设计,所以原有功能保持不变,那么软件测试时可以只测试扩展的部分
- 提高代码的可复用性:粒度越小,被复用的可能性越大
- 提供软件的可维护性:开闭原则使得软件的稳定性和延续性更高,这样就更易扩展和维护
开闭原则缺点
- 实现类多的话,容易导致需要过多维护不同具体类
- 容易导致衍生过度设计
场景介绍
比较熟悉的场景就是:插件和中间件。设计者将插件和中间件的扩展能力开发给使用者就必须遵守开闭原则。
所以,开闭原则的目标是让系统不发生重大的修改而易于扩展。这个目标是通过分割系统成各个组件,规划组件的依赖层级关系,保护高层级避免受低层级组件影响实现的。
参考资料: