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