总结自
面向对象的设计原则(PDF -〉
中科院软件所互联网软件技术实验室. 陈烨
OCP原则(开闭原则)
模块的代码是可扩展的,可以通过继承、组合等来扩展模块的功能。
模块的代码是不可以修改的,即不可以修改原来模块中的代码。
符合OCP的程序只能通过增加代码而不是更改现有代码来变化。
一种可变性不应当散落在代码的各个角落,而应当被封装在一个对象里,
同时,一种可变性不应当与另一种可变性混合起来。
如果代码中遇到很多instance of的判断,而且当功能扩展时,可能还会
增加类型,是否可以考虑更改原来的instance of结构(见原文OCP实例)
这样,当类型增加时,可以只需添加一个接口的实现。无需更改原来代码。
LSP原则(LSP原则)
什么时候才能正确使用继承?即S什么时候才是T的真正子类?LSP原则
指出:
若对于每一个类型S的对象s1,都存在一个T的类型t1,使得在所有针对
T编写的程序P中,用s1替换t1后,程序的行为功能不变,则S是T的子类型。
文中举了一个矩形和正方形的例子,正方形继承自矩形,但是,当使用正方
形实例替换矩形之后,程序的行为功能变掉了。即方法f(rectangle r)执行
不再具有原来的行为功能了。
行为功能才是软件关注所关注的问题,所有派生类的行为功能必须和客户程序
对其基类期望的一致。
DIP原则(依赖倒置原则)
糟糕的设计:很难添加新的功能,因为每一处改动都会影响系统中过多的模块
当你做了一处改动,却导致系统的另一模块发生了问题,很难在别的应用程序
重用现在的模块,因为他不能从现有的应用程序独立的提取出来。
糟糕的设计是因为过强的耦合关系,解耦的方法就是使用依赖导置原则。
依赖倒置的基本原则是这样的:
高层模块不应该依赖于低层模块,二层应该依赖于抽象。
抽象不应该依赖于细节,细节应该依赖于抽象。
在java中,面向接口编程就是依赖倒置的一个体现。
实践中,应该从问题的具体细节中分离出抽象,以抽象的方式对类进行耦合。
依赖倒置的主要缺点就是导致大量的类的生成,由于系统中并不是每个类都会
产生变化,明确确定不发生变化的东西可以不使用该原则。
ISP原则(接口隔离)
这个容易理解,一个类对另一个类的依赖应当是建立在最小接口基础上的,使用
多个专门的接口比使用单一的总接口要好。
CARP(合成复用原则)
在新对象里面使用已有的一些对象,通过对已有对象的委派达到复用目的。
一般认为,合成优于继承。
LoD (迪米特原则)
“不要和陌生人说话”,即一个对象应当对其他对象有尽可能少的了解,这也是
为了减少耦合性。
一个类尽量只于自己的朋友交谈,朋友的条件是这样的:
(1)当前对象本身
(2)当前对象的方法传进来的参数变量
(3)当前对象创建的对象
(4)当前对象的实例变量如果是一个聚集,那么聚集中的元素也都是朋友
迪米特法则的主要用意是控制信息的过载。在将迪米特法则运用到系统
设计中时,要注意下面的几点:
1)在类的划分上,应当创建有弱耦合的类。
2)在类的结构设计上,每一个类都应当尽量降低成员的访问权限。
3)在类的设计上,只要有可能,一个类应当设计成不变类。
4)在对其他类的引用上,一个对象对其对象的引用应当降到最低。
2)在类的结构设计上,每一个类都应当尽量降低成员的访问权限。
3)在类的设计上,只要有可能,一个类应当设计成不变类。
4)在对其他类的引用上,一个对象对其对象的引用应当降到最低。