开放-封闭原则指出:软件的实体(类、模块、函数等)应该是可以扩展的,但是不可修改的。
遵循开放-封闭原则设计出的模块具有两个主要的特征:
1. “对于扩展是开放的” (Open for extension)。
这意味着模块的行为是可以扩展的,当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为,换句话说,我们可以改变模块的功能。
2. “对于更改是封闭的” (Closed for modification)。
对模块行为进行扩展时,不必改动模块的源代码或者二进制代码,模块的二进制可执行版本,无论是可链接的库、DLL或JAVA 的.jar文件,都无需改动。
一般而言,无论模块是多么的“封闭”,都会存在一些无法对之封闭的变化,没有对于所有情况都贴切的模型。
遵循OCP的代价也是昂贵的。创建正确的抽象是要花费开发时间和精力的。同时,那些抽象也增加了软件的复杂性。开发人员有能力处理的抽象数量也是有限的。显然,我们希望把OCP的应用限定在可能会发生的变化上。
隔离变化:
1. “只受一次愚弄”,这意味着在我们最初编写代码时,假设变化不会发生;当变化发生时,我们就创建抽象来隔离以后发生的同类变化。
2. 刺激变化。
- 我们首先编写测试
- 我们使用很短的迭代周期进行开发——一个周期为几天而不是几周
- 我们在加入基础结构之前就开发特性,并且经常性的把那些特性展示给涉众
- 我们首先开发最重要的特性
- 尽早的、经常的发布软件
OCP是面向对象设计的基础,也是很复杂的规则,我们需要在日常的开发中不断的去研究和发现它。