开闭原则是说,所有软件模块都应该可以扩展,但不可以修改。遵循这个原则的关键在于抽象化。我们在写一
个模块时,不论是一个类,还是一个构件,都应该认真思考它的真正功能,它对其它模块的依赖性,输入和输
出,等等。分离出它的可变部分(例如,用接口或外部配置等),对不变部分进行封装。这些不变部分就是这
个模块的本质。这里需要说明的是,在对不变部分进行封装时,我们如何定义不变的部分。在数学中,当我们
谈到不变量时,总是要指明它是在什么变化下的不变量。否则是没有意义的,因为在一种变化下的不变量很有
可能在另一种变化下就不是不变量了。所以,当我们定义不变的部分时,首先要明确它的变化范围。但是,在
软件开发中,很难事先准确的知道这些变化,很多时候是凭经验或行业知识来判断的。所以,这个原则多多少
少带有主观性,更像一个总纲而不像一个硬性的法律条文。Martin Fowler的书 Analysis Patterns讲解了一些实
际经验,有兴趣的读者可以参考。下面这些原则是讲如何安排依赖性使得模块具有良好的封闭性,可重用性和
可维护性。
依赖反向原则是说,要依赖于抽象,而不要依赖于具体。这也就是我们所说的:要针对接口编程,而不要针对
实现编程。之所以是倒置,是因为通常在开始依照需求编程时,我们几乎总是依赖于具体的实现。但是,这些
具体的实现都不易适应变化,所以要抽象出一些不变的,本质的功能,把可变的留到具体的实现中去。这种抽
象的过程是前面过程的反向,例如,当我们需要写出结果时,开始时可能会写到文件里,后来可能会写到网络
流里,等等。抽象的结果是写这个功能。针对接口编程是一个不可能过分强调的原则。接口就像高楼大厦中层
与层之间,户与户之间的防火墙;大船巨舰中的隔离舱。软件的更新有时就像水火一样难以预料和不可避免
(所以我们叫它软件而不是硬件),而接口会适当地屏蔽软件更新所带来的改动扩散(连锁传播)。通常,类
的依赖性由这个原则和组合/继承原则主导,而不是由继承主导。
3 接口分离原则(ISP,Interface Segregation Principle)
接口分离原则是说,不相关的功能应在不同的接口里。不然,在需要一个功能时也不得不同时也依赖于另一个
没必要的功能。例如,在早期的 EJB 中,数据库调用和远程调用混在一起,在不需要远程调用时恰好是最糟糕
的组合。这个原则说的是,接口的依赖性宽度越窄越好。下面的原则说的是接口的依赖性深度越浅越好。
4 迪米特法则(Law of Demeter)
Demeter 法则是说尽量不要有传递性,链型的依赖关系。不要和陌生人交谈,只和亲属和朋友交谈。在一个类
中,可以调用类里的其它方法,可以调用类属性的方法,可以调用方法中传递变量的方法,可以调用在方法中
声明的变量的方法。但不应该调用属性的属性的方法。
5 组合/继承原则(CRP,Composite Reuse Principle)
组合/继承原则是说,优先使用组合而不是继承。当我们用低级对象来构造高级对象时,应该用组合。一个系
统的框架也应该是由组合和接口构成的。下面的原则说明,继承仅仅是帮助实现,而不是帮助构造新的对象
的。
7 李斯可夫代换原则(Liskov Substitution Principle) Liskov代换原则是说,任何父类可以出现的地方,子类也可以出现。子类在改变父类属性状态时要遵守父类的 可以参考以下资料:
行为(即不能有更强的先决条件,只能有更弱的先决条件)。这就意味着无法用继承来构造行为差异很大的对
象。
http://www.objectmentor.com
http://c2.com/cgi/wiki?LawOfDemeter
联系客服