1. 单一职责原则
定义:有且仅有一个原因引起类的变更
There should never be more than one reason for a class to change.
优点:
-
类的复杂性降低
-
可读性高
-
可维护性提高
-
变更引起的风险降低
很难做到。
接口一定要做到单一职责,类的设计尽量做到只有一个原因引起变化。
2. 里氏替换原则
-
第一种定义,也是最正宗的定义:
If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T,the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T.
(如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型。)
-
第二种定义:
Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.
(所有引用基类的地方必须能透明地使用其子类的 对象。)
通俗说来:只要父类能出现的地方子类就可以出现,且替换为子类也不会产生任何异常和错误。
-
子类必须完全实现父类的方法:如果子类不能完整地实现父类的方法,建议断开继承关系,采用依赖、聚集、组合等关系代替继承
-
子类可以有自己的个性
-
覆盖(overload)或实现父类方法时输入参数可以被放大
-
覆写(override)或实现父类的方法时输出结果可以被缩小
3. 依赖倒置原则
High level modules should not depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details.Details should depend upon abstractions.
-
高层模块不应该依赖低层模块,二者都应该依赖其抽象
-
抽象不应该依赖细节
-
细节应该依赖抽象
依赖倒置原则在Java语言中的表现就是:
-
模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的。
-
接口或抽象类不依赖于实现类
-
实现类依赖接口或抽象类
就是不要依赖于实现类,要依赖于接口
4. 接口隔离原则
-
实例接口 class
-
类接口 interface
定义:
Clients should not be forced to depend upon interfaces that they don't use.(客户端不应该依赖它不需要的接口。)
The dependency of one class to another one should depend on the smallest possible interface.(类间的依赖关系应该建立在最小的接口上。)
总的来说:建立单一接口,不要建立臃肿庞大的接口。即接口尽量细化,接口中的方法尽量少。
-
接口尽量小:小是有限度的,不能违反单一职责原则。
-
接口要高内聚:高内聚就是提高接口、类、模块的处理能力,减少对外的交互。
-
定制服务:只提供访问者需要的方法
-
接口设计是有限度的
5. 迪米特法则
定义:又称为最少知识原则(Least Knowledge Principle LKP)。一个对象应该对其他对象由最少的了解。
-
只和直接的朋友交流。每个对象必然会与其他对象由耦合关系。
-
朋友间也是有距离的:要求对外公布尽可能少的public方法和非静态public 变量
-
是自己的就是自己的:如果一个方法放在本类中,既不增加类间关系,也对本类不产生负面影响,那就放置在本类中。
-
谨慎使用Serializable:
核心观念:类间解耦,弱耦合。
6. 开闭原则
Software entities like classes,modules and functions should be open for extension but closed for modifications.(一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。)
开闭原则:我们应尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有代码来完成变化。
开闭原则是最基础的一个原则,前五个原则都是开闭原则的具体形态,开闭原则才是真正的精神领袖。
-
开闭原则对测试的影响
-
开闭原则可以提高复用性
-
开闭原则可以提高可维护性
-
面向对象开发的要求
-
Single Responsibility Principle:单一职责原则
-
Open Closed Principle:开闭原则
-
Liskov Substitution Principle:里氏替换原则
-
Law of Demeter:迪米特法则
-
Interface Segregation Principle:接口隔离原则
-
Dependence Inversion Principle:依赖倒置原则