对于一个软件的实体(类,模块,函数等)应该是可以扩展的,但是不可被修改。
一、概要
开放/封闭原则(The Open-Closed Principle:OCP)是在面向对象设计中,类和模块等必须遵循以下规则:
◇ 对于功能的扩展因该是开放的,即可以追加机能。
◇ 对于修改是封闭的,即既存的机能的实体是不可以修改的。
以上两条规则就是说“软件实体应当在不修改的前提下扩展”
开放/封闭原则(OCP)是面向对象设计的最基本的原则。也是之后的面向对象设计原则,
Package设计原则以及设计模式的基础。
二、OCP的优点
◇ 很好的扩展性。OCP的对于扩展的开发原则,当系统要扩展或者添加新的行为的时候
只需要添加 另外实现的模块即可。
◇ 提供软件的安定性、稳定性。OCP的修改封闭原则,要在不修改既存代码的基础上
进行机能的追加,对原机能影响很小,确保了安全性,同时也保证了原有机能的稳定性。
◇ 再利用性。根据OCP原则设计的类和模块,一般都是可以设计出可重用的机能的抽象和接口等。
同时,软件的各部分的耦合度也会很低,,使程序模块互换成为可能;
三、OCP实现的手法
实现OCP关键在于抽象,抽象出来的东西是不变的,具体的实现继承于抽象,所以保证了对修改的Close,
而抽象的实现方式有多种,可以随需添加,当然这也就是对扩展的Open。 另外要求的是技术包括,
多态 Polymorphism,接口 Interface,继承 Inheritance. 一般的抽象步骤如下:
◇ 分析机能。
◇ 定义出不需要修改的可以被再利用的Interface。
◇ 通过继承Interface类,来实现机能的扩展和追加。
另外在对可变性进行封装的时候也应该注意以下几点:
◇ 识别系统有可能变化的地方。
◇ 不要将一种可变形散布在多处代码,而应该封装起来。
◇ 不要将一种可变性与另外一种可变性混在一起。
◇ 两种安全的实现开闭原则的设计模式是:Strategy pattern(策略模式),
Template Methord(模版方法模式)。
◇ 依据开闭原则,我们尽量不要修改类,只扩展类,但在有些情况下会出现一些比较怪异的
状况,这时可以采用几个类进行组合来完成。
◇ 将可能发生变化的部分封装成一个对象,如: 状态, 消息,,算法,数据结构等等,
封装变化是实现"开闭原则"的一个重要手段,如经常发生变化的状态值,如温度,气压,颜色,积分,
排名等等,可以将这些作为独立的属性,如果参数之间有关系,有必要进行抽象。
对于行为,如果是基本不变的,则可以直接作为对象的方法,否则考虑抽象或者封装这些行为。
但是,由于软件的不确定性等原因,要想100%的按照OCP原则来进行软件设计是很困难的,
所以,我们实际过程中应该是尽可能的遵守OCP原则,而不是一味必须所有的都要遵守。