跳转到内容

开闭原则

维基百科,自由的百科全书

面向对象编程领域中,开闭原则 (The Open/Closed Principle, OCP) 规定“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的”[1],这意味着一个实体是允许在不改变它的源代码的前提下变更它的行为。该特性在产品化的环境中是特别有价值的,在这种环境中,改变源代码需要代码审查单元测试以及诸如此类的用以确保产品使用品质的过程。遵循这种原则的代码在扩展时并不发生改变,因此无需上述的过程。

开闭原则的命名被应用在两种方式上。这两种方式都使用了继承来解决明显的困境,但是它们的目的,技术以及结果是不同的。

梅耶开闭原则

伯特兰·迈耶一般被认为是最早提出开闭原则这一术语的人,[来源请求]在他1988年发行的《面向对象软件构造》中给出。这一想法认为一旦完成一个类的实现只应该因错误而修改,新的或者改变的特性应该通过新建不同的类实现。新建的类可以通过继承的方式来重用原类的代码。衍生的子类可以或不可以拥有和原类相同的接口。

梅耶的定义提倡实现继承。具体实现可以通过继承方式来重用,但是接口规格不必如此。已存在的实现对于修改是封闭的,但是新的实现不必实现原有的接口。

多态开闭原则

在20世纪90年代,由于抽象化接口的使用,开闭原则被广泛的重新定义。在这中间实现可以被改变,多种实现可以被创建,并且多态的替换不同的实现。

相比梅耶的使用方式,多态开闭原则的定义倡导对抽象基类的继承。接口规约可以通过继承来重用,但是实现不必重用。已存在的接口对于修改是封闭的,并且新的实现必须,至少,实现那个接口。

罗伯特·C·马丁英语Robert_C._Martin1996年发表的文章《开闭原则》[2]是使用这种方法的启发式著作。在2001年,Craig Larman把开闭原则关联到了Alistair Cockburn英语Alistair Cockburn的名为“受护的变量”(Protected Variations)的模式以及David Parnas关于信息隐藏的讨论。[3]

参见

  • SOLID - “SOLID”中的 O 指代了开闭原则

引用

  1. ^ Meyer, Bertrand. Object-Oriented Software Construction. Prentice Hall. 1988. ISBN 0-13-629049-3. 
  2. ^ Robert C. Martin "The Open-Closed Principle", C++ Report, January 1996 互联网档案馆存档,存档日期2015-09-05.
  3. ^ "Protected Variation: The Importance of Being Closed", IEEE Software May/June 2001, pp. 89-91 [1]页面存档备份,存于互联网档案馆

外部链接