开闭原则

开闭原则

编辑

 
本词条缺少 概述信息栏名片图,补充相关内容使词条更完整,还能快速升级,赶紧来 编辑吧!

目录

1简介

2概述

3实现方法

4OCP

  梅耶原则
  多态原则

5好处

6相互关系

 
 

1简介编辑

每一部分都可以独立保持开放或关闭

每一部分都可以独立保持开放或关闭[1]

开闭原则(OCP)是 面向对象设计中“可复用设计”的基石,是面向对象设计中最重要的原则之一,其它很多的设计原则都是实现 开闭原则的一种手段。
1988年,勃兰特·梅耶(Bertrand Meyer)在他的著作《面向对象软件构造(Object Oriented Software Construction)》中提出了 开闭原则,它的原文是这样:“Software entities should be open for extension,but closed for modification”。翻译过来就是:“软件实体应当对扩展开放,对修改关闭”。这句话说得略微有点专业,我们把它讲得更通俗一点,也就是: 软件系统中包含的各种组件,例如 模块(Modules)、 (Classes)以及 功能(Functions)等等,应该在不修改现有代码的基础上,引入新功能。 开闭原则中“开”,是指对于组件 功能的扩展是开放的,是允许对其进行功能扩展的; 开闭原则中“闭”,是指对于原有代码的修改是封闭的,即不应该修改原有的代码。

2概述编辑

遵循 开闭原则设计出的模块具有两个主要特征: [1]  
(1)对于扩展是开放的(Open for extension)。这意味着模块的行为是可以扩展的。当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为。也就是说,我们可以改变模块的功能。
(2)对于修改是关闭的(Closed for modification)。对模块行为进行扩展时,不必改动模块的源代码或者二进制代码。模块的二进制可执行版本,无论是可链接的库、DLL或者.EXE文件,都无需改动。

3实现方法编辑

实现 开闭原则的关键就在于“抽象”。把系统的所有可能的行为抽象成一个抽象底层,这个抽象底层规定出所有的具体实现必须提供的方法的特征。作为 系统设计的抽象层,要预见所有可能的扩展,从而使得在任何扩展情况下,系统的抽象底层不需修改;同时,由于可以从抽象底层导出一个或多个新的具体实现,可以改变系统的行为,因此系统设计对扩展是开放的。
我们在 软件开发的过程中,一直都是提倡需求导向的。这就要求我们在设计的时候,要非常清楚地了解用户需求,判断需求中包含的可能的变化,从而明确在什么情况下使用 开闭原则
关于系统可变的部分,还有一个更具体的对可变性封装原则(Principle of Encapsulation of Variation, EVP),它从 软件工程实现的角度对 开闭原则进行了进一步的解释。EVP要求在做系统设计的时候,对系统所有可能发生变化的部分进行评估和分类,每一个可变的因素都单独进行封装。
我们在实际开发过程的设计开始阶段,就要罗列出来系统所有可能的行为,并把这些行为加入到抽象底层,根本就是不可能的,这么去做也是不经济的。因此我们应该现实的接受修改拥抱变化,使我们的代码可以对扩展开发,对修改关闭。 [2]  

4OCP编辑

梅耶原则

勃兰特·梅耶一般被认为一旦完成,一个类的实现只应该因错误而修改,新的或者改变的特性应该通过新建不同的类实现。新建的类可以通过继承的方式来重用原类的代码。衍生的子类可以或不可以拥有和原类相同的接口。梅耶的定义提倡实现 继承。具体实现可以通过继承方式来重用,但是接口规格不必如此。已存在的实现对于修改是封闭的,但是新的实现不必实现原有的接口。

多态原则

在20世纪90年代, 开闭原则被广泛的重新定义由于抽象化接口的使用,在这中间实现可以被改变,多种实现可以被创建,并且多态化的替换不同的实现。相比梅耶的使用方式,多态 开闭原则的定义倡导对抽象基类的继承。接口规约可以通过继承来重用,但是实现不必重用。已存在的接口对于修改是封闭的,并且新的实现必须实现那个接口。
罗伯特·C·马丁1996年发表的文章《 开闭原则》是使用这种方法的启发式著作。 [3]  在2001年,Craig Larman把 开闭原则关联到了Alistair Cockburn的名为受护的变量的模式以及David Parnas关于信息隐藏的讨论。 [4]  

5好处编辑

如果一个 软件系统符合 开闭原则的,那么从 软件工程的角度来看,它至少具有这样的好处:
可复用性好。
我们可以在软件完成以后,仍然可以对软件进行扩展,加入新的 功能,非常灵活。因此,这个 软件系统就可以通过不断地增加新的组件,来满足不断变化的需求。
可维护性好。
由于对于已有的 软件系统的组件,特别是它的抽象底层不去修改,因此,我们不用担心软件系统中原有组件的稳定性,这就使变化中的软件系统有一定的稳定性和延续性。

6相互关系编辑

开闭原则具有理想主义的色彩,它是 面向对象设计的终极目标。因此,针对 开闭原则的实现方法,一直都有 面向对象设计的大师费尽心机,研究 开闭原则的实现方式。后面要提到的 里氏代换原则(LSP)、 依赖倒转原则(DIP)、 接口隔离原则(ISP)以及 抽象类(Abstract Class)、 接口(Interface)等等,都可以看作是 开闭原则的实现方法。
 
 

软件设计模式原则

 开闭原则  里氏代换原则  依赖倒转原则  接口隔离原则  抽象类
 

参考资料
  • 1.  罗伯特 C.马丁;迈卡 马丁 .敏捷软件开发:原则、模式与实践(C#版) .美国 :人民邮电大学 ,2008年1月 :93-101 .

  • 2.  Dino Esposito;Andrea Saltarello .Microsoft.NET企业级应用架构设计 .美国 :人民邮电出版社 ,2010年6月 :71-72 .

  • 3.  罗伯特 C.马丁 "The Open-Closed Principle", C++ Report, January 1996

  • 4.  "Protected Variation: The Importance of Being Closed", IEEE Software May/June 2001, pp. 89-91

猜你喜欢

转载自coolwhy1.iteye.com/blog/2087976