开-闭 原则

2020-05-07  本文已影响0人  NoNothing

1.经典力学的基石是牛顿三大定律。面向对象的可复用设计的第一块基石,就是“开-闭”原则。
2.“开-闭”原则内容:一个软件实体应当对扩展开放,对修改关闭。英文原文:Software entities should be open for extension, but closed for modification. 这个原则说的是,应当可以在不修改源代码的情况下改变这个模块的行为。
3.“知固而不知革,物失其则;知革而不知固,物失其均”。关于此句的解释 开与闭的关系,类比固与革。
4.解决问题的关键在于抽象化。
5.“开-闭”原则从另外角度讲述,就是“对可变性的封装原则”,即找到一个系统的可变因素,将之封装起来。
6.要考虑你允许什么发生变化而不让这一变化导致重新设计。
7.“对可变性的封装原则”意味着亮点:① 一种可变性不应当散落在代码的很多角落里,而应当被封装到一个对象里面。② 一种可变性不应当与另一种可变性混合在一起。
8.里氏代换原则,任何基类可以出现的地方,子类一定可以出现。实现“开-闭”原则的关键步骤就是抽象化,里氏代换原则是对实现抽象化的具体步骤的规范。一般而言,违反里氏代换原则的,也违背“开-闭”原则。
9.依赖倒转原则,要依赖抽象,不要依赖实现。“开-闭”原则是目标,而达到这一目标的手段是依赖倒转原则。要想实现“开-闭”原则,就应当坚持依赖倒转原则。违反依赖倒转原则就不可能达到“开-闭”原则的要求。
10.合成/聚合复用原则,要尽量使用合成/聚合,而不是继承关系达到复用的目的。遵守合成/聚合复用原则是实现“开-闭”原则的必要条件。
11.迪米特法则,一个软件实体应当与尽可能少的其他实体发生相互作用。当一个系统面临功能扩展的时候,其中有一些模块,需要修改的压力比其他一些模块大。如果这些模块是相对孤立的,那么它们就不会将修改的压力传递给其他模块。即,一个遵守迪米特原则设计出来的系统在功能需要扩展时,会相对更容易地做到对修改的关闭。
12.接口隔离原则,应当为客户端提供尽可能小的单独的接口,而不要提供大的总接口。接口隔离原则与广义的迪米特法则都是对一个软件实体与其他软件实体的通信的限制。广义的迪米特法则要求尽可能限制通信的宽度和深度。接口隔离原则所限制的是通信的宽度,即,通信应当尽可能地窄。遵循接口隔离原则与迪米特法则,会使一个软件系统在功能扩展的过程当中,不会将修改的压力传递到其他的对象。
13.所有的设计模式都是对不同的可变性的封装,从而使系统在不同的角度上达到“开-闭”原则的要求。
14.学会问一个问题:这个设计模式可以对什么样的变换开放,以及它做到这一点所付出的代价是什么。通过这样的思考,可以更加透彻地了解这种模式对“开-闭”原则的支持程度,以及这种设计模式本身。
15.“将条件转移语句改写成为多态性” 是一条广为流传的代码重构做法。它的意思是说,将一个进行多次条件转移的商业逻辑封装到不同的具体子类中去,从而使用多态性代替条件转移语句。这一代码重构的做法并不能成为设计的原则,事实上,这一做法有明显的缺点:① 任何语言都提供条件转移功能,条件转移本身并不是错误的;② 使用多态性代替条件转移意味着大量的类被创建出来。比如,一个类有三个方法,每个方法都有一个三段的条件转移语句。如果将它们都用多态性代替的话,就会造成9个不同的类,很难想象设计师怎样能明白这九种组合成员之间的关系。
16.何时使用这种重构做法?应当从“开-闭”原则出发来做判断。如果一个条件转移语句确实封装了某种商务逻辑的可变性,那么将此种可变性封装起来就符合“开-闭”原则的设计思想了。但是,如果一个条件转移语句没有涉及重要的商务逻辑,或者不会随着时间的变化而变化,也不意味着任何的扩展性,那么它就没有设计任何有意义的可变性。这时候将这个条件转移语句改为多态性就是一种没有意义的浪费。这种对多态性的滥用叫做“多态性污染”。

上一篇 下一篇

猜你喜欢

热点阅读