软件实体(类、模块、函数)等应该是可以扩展的,但是不可修改的
例如:前面的扩展window.onload函数
最重要的就是找出程序会变化的地方。
- hook
- 回调函数
- 发布订阅
- 模板方法
- 策略模式
- 代理模式
- 职责链模式
实际上,让程序保持完全封闭是不容易做到的。就算技术上做得到,也需要花费太多的时间和精力。而且让程序符合开放-封闭原则的代价是引入更多的抽象层次,更多的抽象有可能会增大代码的复杂度。
更何况,有一些代码是无论如何也不能完全封闭的,总会存在一些无法对其封闭的变化。作为程序员,我们可以做到的有下面两点。
- 挑选出最容易变化的地方,然后构造抽象来封闭这些变化
- 在不可避免发生修改的时候。尽量修改那些相对容易修改的地方。拿一个开源库来说,修改它的配置文件,总比修改它的源代码来的讲话。