Robert C. Martin名著《敏捷软件开发:原则、模式与实践》一书第20章“包的设计原则”提到了几个很重要的设计原则。这篇文章主要看下涉及包的依赖性和稳定性的3个设计原则ADP/SDP/SAP。熟悉这3个设计原则之后,我们再看下度量工具jDepend的使用。
1.ADP(Acyclic Dependencies Principle)
无循环依赖原则,这个比较简单,就是包之间不允许有循环依赖。
2.SDP(Stable Dependencies Principle)
稳定依赖原则,包应该朝着稳定的方向进行依赖。比如我们有3个包A、B、C,其中A依赖于B,B依赖于C,SDP原则要求包的稳定性关系是A<=B<=C。也就是说越高层的包越不稳定,越底层的包越稳定。稳定意味一旦修改,工作量会非常的大。具有很多输入依赖关系的包是非常稳定的,因为如果修改它,那么所有依赖它的其他包都要修改。比如J2EE项目,一般会分为action层、service层、dao层、vo层,它们之间一般会存在如下的依赖关系:
我们称vo是最稳定的,action是最不稳定的。因为一旦我们修改vo,那么action、service、dao都需要修改;如果我们修改action,那么service、dao、vo都不会受影响。可以看到:包的输入依赖越多就会越稳定,也就越难以修改。
现在我们看下如何通过数据指标来度量包的稳定性。我们定义3个指标:Ca、Ce、I。
Ca:输入耦合(Afferent Coupling),指处于该包的外部并依赖于该包中的类的类的数目。
Ce:输出耦合(Effernet Coupling),指处于该包的内部并依赖于该包外的类的类的数目。
I:不稳定性(Instability),其中I = Ce / (Ca + Ce),该度量的取值范围是[0, 1]。I=0 表示该包具有最大的稳定性,I=1 表示该包具有最大的不稳定性。
当一个包的I度量值为1时,意味着没