代码评价工具JDepend

本文介绍如何使用JDepend工具评估Java代码质量,包括类与接口的数量、稳定性、可重用性和可维护性。详细解释了工具生成的报告中涉及的概念,如传入耦合、传出耦合、抽象性度量等,并提供了实际分析结果的例子。
JDepend( http://www.clarkware.com/software/JDepend.html )是代码质量评价工具。遍历所有类生成每个包的依赖程度,稳定性,可靠度等报告。

重点在三个方面: extensibility可扩展, reusability可重用, maintainability可维护。

主要根据Robert C. Martin氏提出的面向对象设计原则,JDepend生成的Java包的质量评价报告主要包括:

Number of Classes and Interfaces :实现类与抽象接口的数目。The Stable Abstractions Principle (SAP):稳定抽象等价原则 指出了包的稳定程度与它的抽象程度(接口的数目)成正比,也就是说,一个包内包含的接口所占的比重越大,这个包就越稳定。
Abstractness (A) :包的抽象度。指一个包内包含的抽象类或接口占整个包中的类的比重。该值处于0,1之间,若A=0,说明包内不包含任何抽象类或接口;若A=1,说明包内全部是抽象类或接口。包的抽象度与稳定性之间的关系上面已经作了说明。
Afferent Couplings (Ca) :向心耦合。依赖该包(包含的类)的外部包(类)的数目,该数值越大,说明该包的担当的职责越大,也就越稳定。
Efferent Couplings (Ce) :离心耦合。被该包依赖的外部包的数目,该数值越大,说明该包越不独立(因为依赖了别的包),也越不稳定。
Instability (I) :衡量一个包的不稳定程度。I=Ce/(Ce+Ca)。(见我前面的博客(
面向对象:稳定依赖原则(SDP) ))
Distance from the Main Sequence (D) :该指标主要用来评价包的抽象程度与稳定程度的平衡关系,它可以用二维直线图 A + I = 1 来表示。D=abs((A + I) - 1),也就是说D为 一个包的抽象度 + 包的不稳定程度 - 1的绝对值。一个理想的包是:完全抽象的(A=1),非常稳定的(I=0),这时D=0;或者是:完全具体类构成的包(A=0),非常不稳定的(I=1),这时同样也有D=0。D=0说明包的抽象程度与稳定程度是平衡的,反之D=1说明包的平衡程度被严重破坏。
Package Dependency Cycles :包的循环依赖度。
The Acyclic Dependencies Principle (ADP) - OO设计的无环依赖原则 要求包之间不能有循环依赖关系。

安装官方网站的做法感觉有点麻烦,作为eclipse的插件来使用比较方便。下载地址(http://andrei.gmxhome.de/jdepend4eclipse/links.html )。

下载后把jar文件放到eclipse的plugins目录下,重启eclipse。然后在工程中选择要出报告的包或者这个src文件夹,然后点击右键,然后点击run JDepend analysis就启动了。这样根据分析结果我们更加容易发现我们面向对象设计原则中的一些问题,从而加以改善。

分析结果例子:

-------------------------------------------------------------------------------------------------------------------------------

JDepend (参阅 Resources)工具生成的报告,您可以有效地判定代码是否实现了确定的架构。

其中涉及到一些概念

传入耦合Afferent Couplings (Ca)

在图 1 中,可以看到一个包 com.acme.ascp.exception 具有一个值为 4 的传入耦合。这并不奇怪,因为 webdaoutilfrmwrk 包都希望利用一个公共的异常框架。


图 1. 传入耦合的符号
传入耦合的符号

如图 1 所示,exception 包具有一个值为 4 的传入耦合(或者叫做 Ca),这并非是件坏事。异常层次结构很少会出现很大的改变。监视 exception 包的传入耦合是个好主意,然而,由于彻底改变了这个包中的行为或契约,所以将引起它的四个依赖包全都出现连锁反应。

传出耦合Efferent Couplings (Ce)

如果传入耦合是一些依赖于某个特定组件的组件的话,那么传出耦合则是某个特定组件所依赖的一些组件。可以把传出耦合看作传入耦合的逆转

对于更改如何影响代码来说,传出耦合的引号意义与传入耦合的类似。例如,图 4 描述了 com.acme.ascp.dao 包,它具有一个值为 3 的传出耦合(或者叫做 Ce):


图 4. dao 包中的传出耦合
dao 包中的传出耦合

如图 4 所示,com.acme.ascp.dao 包依赖于 org.apache.log4jcom.acme.ascp.utilcom.acme.ascp.exception 组件来履行其行为契约。与传入耦合中一样,依赖性级别本身并不是什么坏事。重要的是您对耦合的了解以及耦合如何影响对相关组件的更改。

与传入耦合一样,抽象性度量在传出耦合中起作用。在 图 4 中,com.acme.ascp.dao 包完全是具体的;因此它的抽象性为 0。这表示其传出耦合包含 com.acme.ascp.dao 的组件自己会变得脆弱,因为 com.acme.ascp.dao 包与 3 个附加的包具有传出耦合。如果它们中的一个(比如说 com.acme.ascp.util)发生更改,将会在 com.acme.ascp.dao 中发生连锁反应。因为 dao 无法通过接口或抽象类隐藏注入细节,所以任何更改都可能影响它的依赖组件。

参见:

1.追求代码质量: 软件架构的代码质量

http://www.ibm.com/developerworks/cn/java/j-cq04256/ 

2.让开发自动化: 断言架构可靠性

http://www.ibm.com/developerworks/cn/java/j-ap07107/

3. 提高代码质量的Eclipse插件之JDepend

http://www.blogjava.net/hengheng123456789/archive/2007/01/30/96675.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值