开闭原则视频链接:https://www.bilibili.com/video/BV1WE411c7kE/
开闭原则是一种思想方法,没有具体实际操作的方法,它指导我们如何建立一个稳定的、灵活的同时具有延续性的系统。开闭原则是面向对象程序设计的最终目标,目标则是设计一个对扩展开放、对修改关闭的系统。
开闭原则问题由来:
在软件的生命周期内,因为变化、升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试。
解决方法:
当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。
开闭原则定义:
一个软件实体(包括了软件模块、类、实体和方法等)应该对扩展开放,对修改关闭。
开闭原则的作用:
对软件测试的影响: 软件遵守开闭原则的话,软件测试时只需要对扩展的代码进行测试就可以了,因为原有的测试代码仍然能够正常运行。
可以提高代码的可复用性: 粒度越小,被复用的可能性就越大;在面向对象的程序设计中,根据原子和抽象编程可以提高代码的可复用性。
可以提高软件的可维护性: 遵守开闭原则的软件,其稳定性高和延续性强,从而易于扩展和维护。
以上看完了过后应该会对开闭原则有个初步的了解,我们再来细致拆分下以便对开闭原则有深入了解:
“开”:指的是可以在源代码的基础上进行扩展,比如继承,接口,抽象类等。其实这也就对应于“对扩展开放”,意味着模块的行为是可以扩展的,这当然也要求程序员在写源码的时候就要考虑到未来的扩展与变化,高瞻远瞩,进行合理设计。
“闭”:指的是原本封装好的代码不允许做更改的操作。这自然是对应于“对修改关闭”,对模块行为进行扩展时,不必改动模块的源代码。其实这种行为也是为了保证接口功能尽量单一,不与其他的功能发生耦合,那么这样子的话也不会产生修改源码的必要性了。
如何使用开闭原则:
- 抽象约束
第一,通过接口或者抽象类约束扩展,对扩展进行边界限定,不允许出现在接口或抽象类中不存在的public方法;
第二,参数类型、引用对象尽量使用接口或者抽象类,而不是实现类;
第三,抽象层尽量保持稳定,一旦确定即不允许修改。
- 元数据(metadata)控制模块行为
元数据就是用来描述环境和数据的数据,通俗地说就是配置参数,参数可以从文件中获得,也可以从数据库中获得。
Spring容器就是一个典型的元数据控制模块行为的例子,其中达到极致的就是控制反转(Inversion of Control)
- 制定项目章程
在一个团队中,建立项目章程是非常重要的,因为章程中指定了所有人员都必须遵守的约定,对项目来说,约定优于配置。
- 封装变化
对变化的封装包含两层含义:
第一,将相同的变化封装到一个接口或者抽象类中;
第二,将不同的变化封装到不同的接口或抽象类中,不应该有两个不同的变化出现在同一个接口或抽象类中。
总而言之,开闭原则是面向对象设计中最重要的原则之一,用抽象构建框架,用实现扩展细节。
参考资料:https://www.cnblogs.com/muzongyan/archive/2010/08/05/1793454.html
原文地址:https://www.cnblogs.com/veda0612/p/12548872.html