设计模式6大原则(6):开闭原则

来源:互联网 发布:无主之地2 for mac 编辑:程序博客网 时间:2024/05/17 06:25

开闭原则

开闭原则:Open Closed Principle(OCP)

       1988年,勃兰特·梅耶(Bertrand Meyer)在他的著作《面向对象软件构造(ObjectOriented Software Construction)》中提出了开闭原则,它的原文是这样:“Software entities should be open for extension,but closed formodification”。翻译过来就是:“软件实体应当对扩展开放,对修改关闭”。,讲得更通俗一点,就是:软件系统中包含的各种组件,例如模块(Modules)、类(Classes)以及功能(Functions)等等,应该在不修改现有代码的基础上,引入新功能。开闭原则中“开”,是指对于组件功能的扩展是开放的,是允许对其进行功能扩展的;开闭原则中“闭”,是指对于原有代码的修改是封闭的,即不应该修改原有的代码。

       软件实体应当对扩展开放,对修改关闭,那么什么是软件实体呢,一般分为如下几部分:

              1.项目或软件产品中按照一定的逻辑规则划分的模块;

              2.抽象和类

              3.方法

       当变化(新功能,新需求)来时,我没呢应该尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来完成变化,它是为软件实体的未来事件而制定的对现行软件开发设计进行约束的一个原则。

开闭原则是面向对象设计中“可复用设计”的基石,是Java世界里最基础的设计原则,是面向对象设计中最重要的原则之一,其它设计原则都是实现开闭原则的一种手段。举个例子,根据Java中的称谓,开闭原则就是抽象类,其他5个原则就是它的具体实现。

       下面我们说说开闭原则的重要性:

       1.对测试的影响:想想如果变化来了,我们扩展了一个方法,简单一个测试即可,但是如果修改了原有的代码,且不说修改多少代码(可能一个小功能牵扯n多代码),我们还要修改对应的单元测试类,还要重新进行全面测试,那个花费远比改代码花费的多的多。

       2.可提高复用性:我们知道,设计软件时,业务逻辑、模块等粒度越小,被复用的可能性才越大。开闭原则就是指导我们减少代码量,避免相同逻辑分散多个地方,避免维护人员修改一个微小的功能而在整个项目中导出找代码。怎么提高复用率呢?缩小逻辑粒度,直到一个逻辑不可再分为止。

       3.可提高可维护性:大家都应该知道,维护人员最乐意干的事就是扩展一个类,写新代码,而不是修改原来的代码,无论多么优秀还是多么糟糕,读别人代码是一件很痛苦的事,真是一种这么。开闭原则减少了维护人员修改的别人代码,更易于维护。

       4.开闭原则也是面向对象的要求:设计软件最开始时,就应该考虑到所有可能变化的因素,当然谁也不可能考虑的最全面,尽量考虑周全,预留接口或功能,等待“可能”转变为“现实”。

       那么,如何使用开闭原则呢,开闭原则是很虚的原则,其他原则都是开闭原则的具体实现方法,其实开闭原则也有一些具体的地方,我们工作中除了遵循其他设计原则,还有一些方法来保证开闭:

       1. 抽象约束,这个是多扩展开发的前提条件,有下面集中方法达到抽象约束:

              a)  通过接口或抽象类约束扩展,对扩展进行边界限定,不允许出现接口或抽象类之外的public方法;

              b)  参数类型、引用对象尽量使用接口或抽象类;

              c)  抽象层尽量保持稳定,抽象层修改,带来的成本比较大。

       2. 元数据控制模块行为,什么意思呢,元数据是指用来描述环境和数据的数据,就是配置参数。参数最好从文件中获得,数据库中获得,而不是写死在程序中,这样以后扩展时,可以达到不修改代码,而扩展功能的要求。

       3. 制定项目章程,对项目来说,约定优于配置。

       4. 封装变化

              a)  将相同的变化封装到一个接口或抽象类中,相同变化不应该分散到多个地方;

              b)  不同的变化封装到不同的接口或抽象类中,不同变化不应该出现在一个接口或抽象类中;

找出预计有变化的不稳定点,单独为这些不稳定的地方好好设计,保护变化,创建稳定的接口,23种设计模式就是从各个不同角度来对变化进行封装的。

       最后,开闭原则也仅仅是一个原则,拥抱变化的方法有很多,也并不局限于这6大原则,但是遵循这6大原则,能应对大多数情况。

原创粉丝点击