摘自:《敏捷软件开发:原则、模式与实践》 Robert C.Martin【著】,邓辉【译】
类设计原则:
(1) SRP,单一职责原则(The Single Responsibility Priciple):
就一个类而言,应该仅有一个引起它变化的原因。
(2) OCP,开放封闭原则(The Open-Close Priciple):
软件实体(类、模块、函数等)应该是可以扩展的,但是不可修改;封闭是建立在抽象的基础上的,我们应该只对程序中频繁变化的部分进行抽象,拒绝不成熟的抽象与抽象本身一样重要!OCP背后的主要机制是抽象、多态和继承。
(3) LSP,Liskov替换原则(The Liskov Substitution Priciple):
子类型必须能够替换掉它们的基类型。对于LSP的违反常常会导致使用运行时类型识别(RTTI)(使用一个显式的if语句或者if/else链来确定一个对象的类型)。
(4) DIP,依赖倒置原则(The Dependency Inversion Priciple):
高层模块不应该依赖于底层模块,二者都应该依赖于抽象;抽象不应该依赖于细节;细节应该依赖于抽象。事实上,使用new来创建对象的任何时候,我们都违反了DIP;但有时,这种违反是无害的,例如依赖于稳定不变的具体类。
(5) ISP,接口隔离原则(The Interface Segregation Interface):
不应该强迫客户依赖于他们不用的方法。接口属于客户,不属于它们所在的类层次结构。
胖类(fat class)会导致它们的客户程序之间产生不正常的并且有害的耦合关系。当一个客户程序要求该胖类进行一个改动时,会影响到所有其他的客户程序。因此,客户程序应该仅仅依赖于它们实际调用的方法。通过把胖类的接口分解为多个特定与客户程序的接口,可以实现这个目标,每个特定于客户程序的接口仅仅声明它的特定客户或者客户组调用的那些函数。接着,该胖类就可以继承所有特定于客户的接口,并实现它们。这就解除了客户程序和它们没有调用的方法间的依赖关系,使得客户程序之间互不依赖。分离客户就是分离接口!
包设计-内聚原则:
(1) REP,重用发布等价原则:
重用的粒度就是发布的粒度。
(2) CCP,共同封闭原则:
包中的所有类对于同一类性质的变化应该是共同封闭的。 一个变化若对一个包产生影响,则将对该包中的所有类产生影响,而对于其他的包不造成任何影响。
(3) CRP,共同重用原则:
一个包中的所有类应该是共同重用的。如果重用了包中的一个类,就应该重用包中的所有类。
包设计-耦合原则:
(1) ADP,无环依赖原则:
在包的依赖关系图中不允许存在环。
(2) SDP,稳定依赖原则:
朝着稳定的方向进行依赖。
(3) SAP,稳定抽象原则:
包的抽象程度应该和其稳定程度一致。