1.单一职责原则(Single Responsibility Principle: SRP)
应该有且仅有一个原因引起类的变更。
===========================================================
There should never be more than one reason for a class to change.
注:该原则主要用在接口、类和方法中。
2.里氏替换原则(Liskov Substitution Principle: LSP)
如果对每一个类型为S的对象o1,都有类型为T的对象o2;使得以T定义的所有程序P在所有的对象o1都替换成o2时,程序P的行为不发生任何变化,那么类型S的类型T的子类型。(所有引用基类的地方必须能透明的使用其子类的对象)
===========================================================
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 where o1 is substituted for o2 then S is a subtype of T.(Functions that use pointers or references to base classes must be able to use object of derived classes without knowing it)
注:
(1)子类必须完全实现父类的方法(如果父类的某些方法在子类中已经发生“畸变”,则建议断开父子继承关系,转而采用依赖、聚集、组合等关系代替继承)
(2)子类可以自由扩展,子类对象可以代替父类,但父类对象不能代替子类对象
(3)子类覆盖或者实现父类的方法时输入参数可以被放大(子类中的方法输入参数可以和父类方法的输入参数同类型,或者是父类方法输入参数的父类型。保证如果子类与父类构成重载时传入子类对象调用的方法仍是父类的方法,如果子类重写了父类的方法,则传入子类对象调用的方法是子类的方法)
(4)覆盖或实现父类的方法时输出结果(返回值)可以被缩小(子类覆写或实现的方法的返回值必须与父类对应方法的返回值同类型或者是父类对应方法的返回值类型的子类)
3.依赖倒置原则
原则1:高层模块不应该依赖低层模块,两个都应该依赖抽象
原则2:抽象不应该依赖细节,细节应该依赖抽象
4.接口隔离原则
接口隔离的定义
(1)客户端不应该强行依赖它不需要的接口(Clients should not be forced to depend upon interfaces that they don't use)
(2)类间的依赖关系应该建立在最小的接口上(The dependency of one class to another one should depend on the smallest possible interface)
===========================================================
这里的接口是指:
(1)对象接口(Object Interface)
(2)类接口(Class Interface)
===========================================================
接口隔离原则使用时的规范:
(1)接口尽量小
(2)接口高内聚
(3)接口设计有限度
5.迪米特法则(Least Knowledge Principle: LKP)
“最小知识原则”,一个对象对其它对象有最少的了解,即一个类应该对自己需要耦合或调用的类知道得最少,只需要知道它所提供的接口就行。
===========================================================
过分使用迪米特原则,会产生大量这样的中介和传递类,导致系统复杂度变大。所以采用时要反复权衡,既做到结构清晰,又要高内聚低耦合。
6.开闭原则
用抽象构建框架,用实现扩展细节。