1.共同封闭(CCP:The Common Closure Principle):
包中的所有类对于同一类性质的变化应该是共同封闭的。
一个包中所有的类应该对同一种类型的变化关闭。一个变化影响一个包,便影响了包中所有的类。
一个更简短的说法是:Classes that change together, belong together.一起修改的类,应该组合在一起(同一个包里)。
如果必须修改应用程序里的代码,我们希望所有的修改都发生在一个包里(修改关闭),而不是遍布在很多包里。
CCP原则就是把因为某个同样的原因而需要修改的所有类组合进一个包里。如果2个类从物理上或者从概念上联系得非常紧密,它们通常一起发生改变,那么它们应该属于同一个包。
CCP与开闭原则(OCP: Open Closed Principle)
两者有着很深的渊源关系,CCP的“关闭”(closure)就是OCP所提倡的:类应该对修改关闭,对扩展开放。但我们知道,100%的“关闭”是不现实的,我们在设计系统时,只能尽量地保持对大多数可预见的修改关闭。
CCP延伸了OCP的“关闭”概念,当因为某个原因需要修改时,把需要修改的范围限制在一个最小范围内的包里。
CCP原则帮助我们决定哪些类应该被放到同一个包里。
2.共同重用(CCP):
一组接口中应该是共同重用的。如果重用了组中的一个类,那么就要重用包中的所有的类。相互之间没有紧密联系的类不应该在同一组中。
这个原则强调了分类,就具有相同关系或者关联比较紧密的类应该分到一组中,方便修改和客户端的调用。
3.无依赖原则(ADP:Acyclic Dependencies Principle):
发布的多组接口中它们之间的依赖关系不能存在闭环。
包之间的依赖结构必须是一个直接的无环图形,也就是说,在依赖结构中不允许出现环(循环依赖)。如果包的依赖形成了环状结构,怎么样打破这种循环依赖呢?有2种方法可以打破这种循环依赖关系:
第一种方法是创建新的包,如果A、B、C形成环路依赖,那么把这些共同类抽出来放在一个新的包D里。这样就把C依赖A变成了C依赖D以及A依赖D,从而打破了循环依赖关系。
第二种方法是使用DIP(依赖倒置原则)和ISP(接口分隔原则)设计原则。
无环依赖原则(ADP)为我们解决包之间的关系耦合问题。在设计模块时,不能有循环依赖。
4. 稳定依赖原则(SDP:The Stable Dependencies Principle)
是为了解决包设计的依存问题的。
包之间的依赖关系都应该是稳定方向依赖的,包要依赖的包要比自己更具有稳定性。
包的依赖定义 :包A中的类利用包B中的类的场合,就称包A依赖于包B。
稳定依赖原则 :稳定就是没有变化。
稳定包 :
1.自己没有依赖其他包,也就是自己一个完全独立的。
2.其他有很多包依赖于自己。依赖的包越多,自己的责任越大。
不稳定包 :
1.自己依赖其他多个包,也就是自己不是独立的。
2.没有依赖于自己的其他包。也就是自己对其他包没有责任。
不稳定度的计算公式:I=Ce/(Ce+Ca)。
5.稳定抽象等价原则(SAP:The Stable Abstractions Principle )
最稳定的包应该是最抽象的包。不稳定的包应该是具体的包。包的抽象程度跟它的稳定性成正比。
换成另一个说法是:稳定的包应该是抽象的包。
包的稳定抽象等价原则:
上面说到包的稳定性:不容易改变的包应该具有更好的稳定性。一个包的抽象程度越高,它的稳定性就越高。反之,它的稳定性就越低。一个稳定的包必须是抽象的,反之,不稳定的包必须是具体的。
稳定的包的构成:
抽象类或接口通过子类继承扩展行为,这表示抽象类或接口比它们的子类更具有稳定性。总之,为了构成稳定的包,应该提高包内的抽象类或接口的比率;它们的子类可以放在另一个不稳定的包内,该包依赖上述稳定的包,从而遵循了稳定依赖原则(SDP)。
理想的体系结构应该是:
不稳定的(容易改变的)包处于上层:它们是具体的包实现
稳定的(不容易改变的)包处于下层:不容易改变,但容易扩展;接口比实现(具体的运行代码)在内在特性上更具有稳定性
稳定抽象等价原则(SAP)为我们解决包之间的关系耦合问题。在设计包结构时,稳定的包应该是抽象的(由抽象类或接口构成),不稳定的包应该是具体的(由具体的实现类构成)。