OCP开放闭合

软件应该是可以扩展的,但是不可以修改的。

对扩展都是开放的,模块式可以扩展来满足新的行为,我们可以改变模块的功能。

OCP的好处是,尽可能的减少修改模块的次数和范围,从而提高代码的可维护性,复用性。比如操作系统的升级补丁,在修复bug的情况下,肯定是越小越小。如果说OCP做的不好,每次修改需要修改大量的文件,那就会导致补丁很大。

对于修改是封闭的,在扩展模块的时候,不必改动源代码的二进制文件,不管是.o文件还是.dll文件都不用改动。

问题的核心是怎么样改变了模块的功能却又不改变模块的代码呢?

关键是抽象!

比如说,client类会调用server的一些接口,这样就会对server产生依赖,如果想换一个server,那就需要修改client,这就违反了,OCP。好的做法是让client依赖于一个接口,这样client不会关注server的具体实现。

    

需要注意的一点是,为什么叫client interface而不是叫server Base?因为抽象类和它客户的关系比和实现他们的类的关系更加重要。

真正的OCP是不可能会实现的,我们只能在可以预见的范围内分析软件的变化及不变,进行取舍。为了实现OCP而进行的过度的抽象是非常划不来的。

原文地址:https://www.cnblogs.com/HighFun/p/2607456.html