开放关闭原则

1,003 阅读3分钟

在面向对象的程序设计中,开放/关闭原则指出软件实体(类,模块,功能等)应对扩展开放,而对修改关闭;也就是说,这样的实体可以允许其行为得以扩展而无需修改其源代码。

五大设计原则(SOLID)

blog.csdn.net/A1344714150…

一、 单一职责原则

二、 开闭原则

三、 里氏替换原则

四、 接口分离原则

五、 依赖反转原则

Meyer的开闭原则

伯特兰德·迈耶(Bertrand Meyer)在他1988年的著作《Object Oriented Software Construction》中提出开放/封闭原理而广受赞誉。

  • A module will be said to be open if it is still available for extension. For example, it should be possible to add fields to the data structures it contains, or new elements to the set of functions it performs.

(如果一个模块仍可扩展,则称其为打开状态。例如,其应该可以向其包含的数据结构添加字段,或者向其执行的功能集添加新元素。)

  • A module will be said to be closed if [it] is available for use by other modules. This assumes that the module has been given a well-defined, stable description (the interface in the sense of information hiding).

(如果一个模块可供其他模块使用,则称该模块已关闭。这是假定该模块已被明确定义,稳定描述(该接口具有信息隐藏的意义)。)

在Meyer写作时,向库中添加字段或函数不可避免地需要根据该库对任何程序进行更改。Meyer针对这个难题提出的解决方案依赖于面向对象继承(特别是实现继承)的概念:

一个类是关闭的,因为它可以被编译,存储在库中,作为基线并由客户端类使用。但是它也是开放的,因为任何新类都可以将其用作父类,从而增加新功能。定义后代类时,无需更改原始类或打扰其客户。

什么时候会遇到开闭原则的问题

当一个软件如果新需求来,我们增加一些类来完成这些需求,原来的代码能不动就不动。

这里说的是新需求,那表示并不是程序设计之初。这并不代表,在程序设计之初就不需要考虑开闭原则的问题,但是对于不同的开发者,其经验和能力以及业务的了解程度并不相同,所以程序设计之初考虑的开闭原则的问题也在不同的程度上。

应对变化

在程序设计的时候,我们会思考或猜测哪些地方最有可能发生变化,然后构造出抽象来隔离这些变化。这时候可能考虑的并不周全。但我们可以在发送小变化的时候,就及早去想办法应对发生更大变化的可能,也就是说等到发生变化时,立即采取行动,重构代码。在我们最初编写代码时,假设变化不会发生,当发生变化的时候,我们就创建抽象来隔离同类的变化。

面对需求,对程序的改动是增加新代码进行,而不是更改现有的代码。

参考

  • 维基百科
  • 《设计模式》