开放和关闭到底是什么
我们可以看一下对于开闭原则的定义:
软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的。
或者更简洁:对扩展开放,对修改关闭。
其实我们可以把扩展和修改进行细分。
扩展:增加原来没有的功能。
修改:对已经含有的功能做规则上的更改。
这里面的开闭是以功能为单位,比较成功的应用就是插件,插件的增加和删除,并不会干扰系统中的其他插件,插件间也相互独立。
如何确保关闭
要确保关闭需要做到一下两点
抽象化:确定其核心功能
轻量化:减少无关依赖项,做到功能最简。
功能交叉、覆盖面广是很难保证关闭的。
如何做到开放
抽象(abstract)和接口(interface)是必不可少的,重写(override)可在原有功能的概念上更改不同的实现方式,接口不仅含有override的好处,而且对功能的划分更加友好,基于扩展函数的使用,可对不同功能进行相应的扩展。
扩展的核心是依赖数量和方向上的控制。
和依赖反转有什么区别
开闭原则的关注点是对功能变更的应对手段。依赖反转的关注点是对分层策略、模块解耦的控制。