一、开闭原则的定义
Software entities like classes,modules and functions should be open for extension but closed for modifications
一个软件实体、如类、模块、函数等应该对扩展开放,对修改封闭。
这也是开放封闭原则的核心思想:对扩展开放,对修改封闭.
二、 如何实现开放封闭原则
“需求总是变化”,“世界上没有一个软件是不变的”。这里投射出的意思是:需求总是变化的,可是对于软件设计者来说,如何才能做到不对原有系统修改的前提下,实现灵活的扩展, 这就是开闭原则要实现的。
在设计系统的时候,不可能设想一次性把需求确定后, 后面就不改变了,这不科学也不现实。
既然需求是一定会变化的,那么如何优雅的面对这种变化呢何设计可以使软件相对容易修改,不至于需求一变。就要把整个程序推到重来/p>
开封-封闭原则。设计软件要容易维护且不容易出问题的最好办法,就是多扩展,少修改。
2.1 依赖与抽象
实现开放封闭的核心思想就是面对抽象编程,而不是面对具体编程,因为抽象相对稳定。
让类依赖于固定的抽象(抽象类 or 接口),所以对修改是封闭的;而通过面向对象的继承和多态机制,可以实现对抽象体的继承,通过覆写其方法来改变固有行为,实现新的扩展方法,所以对于扩展就是开放的。这是实施开放封闭原则的基本思路。
2.2 落地开闭原则
如果当前设计不符合开放封闭原则,则必须进行重构。常用的设计模式主要有模板方法设计模式和策略设计模式。
而封装变化,是实现这开闭原则的重要手段,将经常发生变化的部分封装为一个类。
2.3 开闭原则重要性
1. 对测试的影响
开闭原则可是保持原有的测试代码仍然能够正常运行,我们只需要对扩展的代码进行测试就可以了。
2. 可以提高复用性
在面向对象的设计中,所有的逻辑都是从原子逻辑组合而来的,而不是在一个类中独立实现一个业务逻辑。只有这样代码才可以复用,粒度越小,被复用的可能性就越大。
3. 提高可维护性
应为对修改开放,在有新需求时,添加新的功能即可,不会影响现有的功能,所以极大的方便了维护。
三、 案例分析
案例一: 数据导出文件
需求:导出 A 项目与 B 项目的业务数据文件
3.1 实现一
首先看看,这个代码,初看是符合需求,但再想想,要是增加一种项目的数据导出呢。如:C 项目
首先要写个 CProject() 方法,再在 BusinesType(int tp) 增加一种类型。 这就违背了开闭原则-对扩展开发,对修改关闭。增加一个方法,修改了一处代码。
3. 2 实现二
- 首先建立一个抽象接口,创建一个用于获取数据文件流方法
- 创建 A B 项目具体获取数据文件流的类,实现抽象接口获取数据文件流方法
- 创建业务数据数据导出上下文类,用于获取项目文件流
如果此时我们再添加 C 项目数据导出,只需添加对 C 项目的数据导出类并实现接口即可。
这样在扩展时既没有对类进行修改,也不影响现有的功能。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!