JDependJava 代碼質(zhì)量評價
JDepend一個開放源代碼的可以用來評價Java程序質(zhì)量的優(yōu)秀工具,它遍歷Java class的文件目錄,以Java包(package)為單位,為每一個包/類自動生成 包的依賴程度,穩(wěn)定性,可靠度等的評價報告,根據(jù)這些報告,我們可以得到包或類之間的依賴關(guān)系,并分析出包的穩(wěn)定程度,抽象程度,是否存在循環(huán)依耐關(guān)系 等。
我們可以根據(jù)JDepend給出的報告數(shù)據(jù),分析出我們的包是否是可靠的,穩(wěn)定的,健壯的包,是否符合面向?qū)ο蟮脑O(shè)計原則。
一個具有穩(wěn)定性,擴展性,可維護性的軟件系統(tǒng)要求系統(tǒng)設(shè)計遵循面向?qū)ο蟮脑O(shè)計原則。一般來說,面向?qū)ο蟮脑O(shè)計原則要求滿足高聚合,低耦合,禁止循環(huán)依賴等基本原則。
如果存在包與面向?qū)ο蟮脑O(shè)計原則有抵觸,則有必要對這些包加以重新設(shè)計或抽象。
JDepend的主要功能
JDepend生成的Java包的質(zhì)量評價報告主要包括:
Number of Classes and Interfaces:實現(xiàn)類與抽象接口的數(shù)目
面向的設(shè)計原則之一The Stable Abstractions Principle (SAP):穩(wěn)定抽象等價原則指出了包的穩(wěn)定程度與它的抽象程度(接口的數(shù)目)成正比,也就是說,一個包內(nèi)包含的接口所占的比重越大,這個包就越穩(wěn)定。
Abstractness (A):包的抽象度。指一個包內(nèi)包含的抽象類或接口占整個包中的類的比重。該值處于0,1之間,若A=0,說明包內(nèi)不包含任何抽象類或接口;若A=1,說明包內(nèi)全部是抽象類或接口。包的抽象度與穩(wěn)定性之間的關(guān)系上面已經(jīng)作了說明。
Afferent Couplings (Ca):向心耦合。依賴該包(包含的類)的外部包(類)的數(shù)目(i.e. incoming dependencies),該數(shù)值越大,說明該包的擔(dān)當(dāng)?shù)穆氊?zé)越大,也就越穩(wěn)定。
Efferent Couplings (Ce):離心耦合。被該包依賴的外部包的數(shù)目(i.e. outgoing dependencies),該數(shù)值越大,說明該包越不獨立(因為依賴了別的包),也越不穩(wěn)定。
Instability (I):衡量一個包的不穩(wěn)定程度。I=Ce/(Ce+Ca)。它的值處于[0,1]之間。I=0時說明包是最穩(wěn)定的,反之I=1則說明包極不穩(wěn)定。
Distance from the Main Sequence (D): 該指標(biāo)主要用來評價包的抽象程度與穩(wěn)定程度的平衡關(guān)系,它可以用二維直線圖 A + I = 1 來表示。D=abs((A + I) - 1),也就是說D為 一個包的抽象度 + 包的不穩(wěn)定程度 - 1 的絕對值。一個理想的包是:完全抽象的(A=1),非常穩(wěn)定的(I=0),這時D=0;或者是:完全具體類構(gòu)成的包(A=0),非常不穩(wěn)定的 (I=1),這時同樣也有D=0。D=0說明包的抽象程度與穩(wěn)定程度是平衡的,反之D=1說明包的平衡程度被嚴(yán)重破壞。
Package Dependency Cycles:包的循環(huán)依賴度。
面向?qū)ο蟮脑O(shè)計原則之一:The Acyclic Dependencies Principle (ADP) - OO設(shè)計的無環(huán)依賴原則要求包之間不能有循環(huán)依賴關(guān)系。
JDepend為我們提供了上述許多高級功能,為我們設(shè)計健壯的包/類提供了重要的參考數(shù)據(jù),是一個不可多得的優(yōu)秀工具。
