原作者 Robert C. Martin
原文:http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf
引用页:http://www.objectmentor.com/resources/publishedArticles.html
4 Interface Segregation Principle(ISP,接口隔离原则)
Many client specific interfaces are better than one general purpose interface.
多个各客户端相关的接口优于一个通用接口。
ISP是另一种使组件得以广泛应用的技术。(The ISP is another one of the enabling technologies supporting component substrates such as COM).
这个原则本质很简单:如果你有一个类为多个客户提供服务,与其直接使用该类,不如为各客户的应用分别创建接口,再让这个类继承这些接口。好处是类的修改对这些客户透明,只要维持接口不变即可,即使以后这些接口由不同的类来实现,客户端也不会感知或需要修改。本质还是功能的内聚性。每个客户使用的功能有一定的内聚性,按这种内聚性来实现接口,比一个大一统的胖接口,更能准确表达接口要实现的功能,也更便于修改接口。
5 Principle of Package Architecture
在设计中类是必须的,但仅有类对设计是不够的。更大粒度上的包可以帮助我们让类更有序。但我们如何决定将哪些类放入哪些包中?下面三则包的内聚性准则可以参考。
1) The Release Reuse Equivalency Principle(REP)
The granule of reuse is the granule of release.
重用粒度即发布粒度。
2) The Common Closure Principle(CCP)
Classes that change together, belong together.
一起变动的类组织在一起
3) The Common Reuse Principle(CRP)
Classes that aren't reused together should not be grouped together.
不在一起重用的类不要组织在一起。
6 The Package Coupling Principles
1) The Acylic Dependencies Principle(ADP)
The dependencies between packages must not form cycle
包之间不得出现循环依赖。
循环依赖对工程的破坏性每个做过上规模项目的人都会深有体会。那么如何解除循环依赖,如原来A中部分功能要依赖于B,而要在B中加入的新功能又依赖于A,怎么办?有几个简单的办法:
a.将要加入的新功能放到一个新的包中去,使其依赖于A与B,这要就是一个依赖链,避免了循环依赖。
b.将A,B中为对方所依赖的功能抽象成接口,然后A,B都针对接口编程,这样A,B都只依赖于抽象接口,而没有了彼此的依赖。
2) The Stable Dependencies Principle
Depend in the direction of stability.
沿着稳定性的方向依赖。
即易变的模块依赖于稳定的模块,而非相反。何者易变?何者罕变?无依赖者罕变,依赖多者易变,盖其依赖者一变,其多相应变矣。
3) The Stable Abstraction Principle
Stable package should be abstract packages.
依赖链中低端难变,而上端易变。但按OCP原则,低端虽难变但不应难于扩展。故其应高度抽象以备扩展之需。
具象易变,抽象罕变。抽象居下以定架构,具象居上以扩功能。故具象依赖于抽象,而非抽象依赖于具象。