謝超超,楊 柳
(中南大學(xué) 軟件學(xué)院,湖南 長(zhǎng)沙 410000)
軟件的應(yīng)用領(lǐng)域越來越廣,軟件的質(zhì)量也越來越受到關(guān)注和重視。軟件復(fù)雜性很大程度上影響到軟件質(zhì)量的好壞,其度量是軟件度量的重要方面。隨著面向?qū)ο筌浖夹g(shù)的廣泛應(yīng)用,面向?qū)ο筌浖?fù)雜性度量也顯得尤為重要。面向?qū)ο蠖攘康幕灸繕?biāo)[1]和已存在的傳統(tǒng)軟件度量的目標(biāo)一致:即更好地理解產(chǎn)品的質(zhì)量,評(píng)估過程的效果,從而控制開發(fā)過程,以提高軟件質(zhì)量。
當(dāng)前,已有很多面向?qū)ο筌浖攘糠椒ū惶岢?,并在不斷被?yàn)證及成熟。這些度量方法包括LK度量[2]、CK度量[3]、Li度量[4]和 MOOD度量[5]等。但是這些度量方法依然存在缺陷,需要不斷進(jìn)行研究和改進(jìn),以使這些度量更易于應(yīng)用,從而更好地指導(dǎo)面向?qū)ο筌浖脑O(shè)計(jì)、開發(fā),提高軟件質(zhì)量[6]。
本文分析了針對(duì)類層面的CK度量和針對(duì)系統(tǒng)層面的MOOD度量。這兩種度量都只是分散地針對(duì)軟件的某一個(gè)特定層面進(jìn)行,在實(shí)際應(yīng)用過程中,難以讓人們同時(shí)綜合類與類之間關(guān)系和系統(tǒng)級(jí)別這兩個(gè)層次的度量,致使無法更加系統(tǒng)全面地掌握軟件系統(tǒng)的復(fù)雜度。因此本文在分析CK度量和MOOD度量的基礎(chǔ)上,對(duì)CK度量進(jìn)行改進(jìn),提出優(yōu)化的度量方法OCK(Optimized CK),并與MOOD度量相結(jié)合,提出了一個(gè)較為優(yōu)化的面向?qū)ο筌浖?fù)雜性度量方法OSCM(Optimized Software Complexity Metrics),以方便人們更快捷、有效地分析面向?qū)ο筌浖到y(tǒng)的復(fù)雜度。
自20世紀(jì)90年代以來,面向?qū)ο蠹夹g(shù)興起并被廣泛應(yīng)用起來,人們逐漸開始研究有關(guān)面向?qū)ο筌浖亩攘縖7]。不斷有面向?qū)ο筌浖攘糠椒ū惶岢觯壳爸饕拿嫦驅(qū)ο筌浖攘糠椒ㄓ校篖K度量、CK度量、Li度量以及MOOD度量等。本文介紹面向?qū)ο筌浖?fù)雜性度量:CK度量和MOOD度量。
Chidamber和Kemerer等人于1994年提出的CK度量[3],是目前使用最為廣泛的度量體系之一,是面向?qū)ο筌浖惣?jí)別度量方法,其中包括6條適用于面向?qū)ο笤O(shè)計(jì)的度量準(zhǔn)則[8]。
(1)每類加權(quán)方法數(shù) WMC(Weighted Method per Class)。WMC是一個(gè)類方法復(fù)雜度的加權(quán)總和。類WMC越大,對(duì)子類的可能影響越大,但其通用性和可復(fù)用性越差。
(2)繼承樹 深 度 DIT (Depth of Inheritance Tree)。DIT指從本類節(jié)點(diǎn)到根節(jié)點(diǎn)的繼承樹中路徑的最大深度,根節(jié)點(diǎn)值為0,以下各級(jí)依次遞增。DIT值越大,則其可能繼承方法數(shù)越多,復(fù)用程度越高,但預(yù)測(cè)其行為將更困難,同時(shí)設(shè)計(jì)越復(fù)雜。
(3)每類孩子數(shù) NoC(Number of Children)。 NOC 是繼承樹中一個(gè)類的直接孩子數(shù)。NOC越大,重用性越好,但其父類抽象性減弱,測(cè)試越困難。
(4)對(duì) 象 類 之 間 耦 合 度 CBO (Coupling Between Object Classes)。一個(gè)類的CBO指的是和其有耦合關(guān)系的類的數(shù)目。CBO越大,則類的可重用性越弱,且修改和測(cè)試越復(fù)雜。
(5)類響應(yīng) RFC(Response For a Class)。 RFC 是本類方法數(shù)加上被本類方法調(diào)用的方法的個(gè)數(shù)總和。RFC越大,類越復(fù)雜,且對(duì)該類進(jìn)行測(cè)試和調(diào)試也越困難。
(6)方法內(nèi)聚缺乏度 LCOM (Lack of Cohesion in Methods)。LCOM是相似度為零的方法對(duì)數(shù)量減去相似度不為零的方法對(duì)數(shù)量,相似度是兩個(gè)方法訪問相同屬性的程度。類的LCOM越大,方法內(nèi)聚度越弱,則類可以分解為兩個(gè)或更多的子類。
MOOD度量是另一個(gè)著名的度量體系,是由Abreu等人于1994年針對(duì)軟件系統(tǒng)層次提出的[5]。MOOD度量從面向?qū)ο蟮姆庋b性、繼承性、耦合性和多態(tài)性4個(gè)方面給出面向?qū)ο筌浖?個(gè)度量指標(biāo)。
(1)封裝性度量。封裝性由類中的屬性和方法實(shí)現(xiàn),因此封裝性通過屬性隱藏因子AHF(Attribute Hiding Factor)和方法隱藏因子 MHF(Method Hiding Factor)表示系統(tǒng)中所有類的屬性和方法的隱藏程度。隱藏因子的值越大,系統(tǒng)中信息隱藏得越好。
(2)繼承性度量。繼承性通過屬性繼承因子AIF(Attribute Inheritance Factor)和 方 法 繼 承 因 子MIF(Method Inheritance Factor)表示系統(tǒng)中所有類的屬性和方法的繼承程度。繼承因子的值越大,系統(tǒng)中信息繼承的程度越高。
(3)耦合性度量。耦合性通過耦合因子CF(Coupling Factor)表示系統(tǒng)中所有類之間的耦合程度,但不將繼承關(guān)系考慮進(jìn)去。CF越大,類之間耦合越頻繁。
(4)多態(tài)性度量。多態(tài)性通過多態(tài)因子PF(Polymorphism Factor)表示系統(tǒng)中所有類方法使用多態(tài)機(jī)制的程度。
面向?qū)ο筌浖?fù)雜性度量方法雖已得到發(fā)展和完善,但依舊存在一定的缺陷。首先分析CK度量的不足,并在CK度量的基礎(chǔ)上提出改進(jìn)的度量方法OCK。然后結(jié)合OCK度量和MOOD度量的優(yōu)點(diǎn)從而提出較為優(yōu)化的面向?qū)ο筌浖?fù)雜性度量OSCM。
(1)WMC只考慮方法成員,沒有考慮屬性成員對(duì)類復(fù)雜性的影響[9],也沒有根據(jù)類成員可見性的不同區(qū)別看待各成員對(duì)類復(fù)雜性的影響,類公有成員,保護(hù)成員和私有成員各自對(duì)類復(fù)雜性影響程度大小不同。因此,在WMC的基礎(chǔ)上提出類的復(fù)雜性CPC(Complexity Per Class)度量指標(biāo)。
式中 a、b、c、d、e 為調(diào)節(jié)因子,a、b 可以適當(dāng)?shù)胤从吵鰧傩院头椒▽?duì)類復(fù)雜性的影響程度不一樣;c、d、e則可以反映出公有成員,保護(hù)成員和私有成員對(duì)類復(fù)雜性的不同影響程度,這些值是通過大量的類復(fù)雜性度量實(shí)踐獲取的經(jīng)驗(yàn)值, 且 ad>e。WAC(Weighted Attributes per Class)是每類加權(quán)屬性數(shù),WACu是加權(quán)公有屬性數(shù),WACo是加權(quán)保護(hù)屬性數(shù),WACv是加權(quán)私有屬性數(shù),WMCu是加權(quán)公有方法數(shù),WMCo是加權(quán)保護(hù)方法數(shù),WMCv是加權(quán)私有方法數(shù)。CPC值越大,類越復(fù)雜,其通用性和可復(fù)用性越差。
(2)DIT無法度量多重繼承,遇到多重繼承時(shí)會(huì)出現(xiàn)歧義[6]。而且當(dāng)考慮多重繼承時(shí),僅根據(jù)繼承樹深度難以全面地判斷類繼承復(fù)雜性,還需要結(jié)合類的祖先類個(gè)數(shù)來進(jìn)行分析,故提出多重繼承樹復(fù)雜性CMIT(Complexity of Multi-Inheritance Tree)度量指標(biāo)。
式中a、b為調(diào)節(jié)因子,可以表示多重繼承樹深度DMIT(Depth of Multi-Inheritance Tree)和祖先類數(shù)目 NOF(Number Of Fathers)對(duì)CMIT值的影響程度大小。DMITi是指本類的每個(gè)父類的DMIT值,繼承樹根節(jié)點(diǎn)的DMIT值為0,max為取最大值函數(shù)。NOFi是指本類的每個(gè)父類的NOF值,本類中沒有任何父類時(shí),其NOF值為 0。CMIT綜合考慮了多重繼承樹深度和祖先類數(shù)目?jī)蓚€(gè)因子,其值越大,則復(fù)用程度越高,但不可預(yù)測(cè)性也越高。
(3)NOC只計(jì)算了直接繼承的孩子數(shù),并未將間接繼承的孩子數(shù)計(jì)算進(jìn)來。因此可定義每個(gè)類的所有子孫數(shù)NOAC(Number Of All Children)用來計(jì)算所有子孫數(shù)目。
式中,NOACi是指本類的每個(gè)直接孩子類的NOAC值。當(dāng)沒有直接孩子類時(shí),其NOAC值為0。
(4)CBO只是計(jì)算和本類耦合的類的數(shù)目,沒有對(duì)不同類型耦合的強(qiáng)度進(jìn)行區(qū)分,而是假設(shè)所有的耦合關(guān)系強(qiáng)度是相同的,而且忽略了最強(qiáng)的耦合關(guān)系即繼承耦合。為了考慮到不同的耦合關(guān)系,包括關(guān)聯(lián)、繼承和實(shí)現(xiàn)耦合,提出了類型間所有耦合ACBT(AllCoupling Between Type)度量指標(biāo)。
式中a、b、c為調(diào)節(jié)因子,是度量實(shí)踐中獲取的經(jīng)驗(yàn)值,可反映出關(guān)聯(lián)耦合、繼承耦合和實(shí)現(xiàn)耦合在ACBT計(jì)算中的權(quán)值。關(guān)聯(lián)耦合數(shù)NAC (NumberofAssociation Coupling)是系統(tǒng)中所有被本類關(guān)聯(lián)的類型(類或接口)的數(shù)目, 繼承耦合數(shù)NIC (NumberofInheritance Coupling)是系統(tǒng)中類型(類或接口)所繼承的所有類型(類或接口)的數(shù)目,實(shí)現(xiàn)耦合數(shù)NRC (Numberof Realization Coupling)是系統(tǒng)中本類所實(shí)現(xiàn)的所有接口的數(shù)目。ACBT越大,類的可重用性可能越弱。
(5)RFC沒有考慮本類方法和被本類方法調(diào)用的方法分別對(duì)類復(fù)雜性的影響程度,只是簡(jiǎn)單地計(jì)算它們的總和。因此,提出類加權(quán)響應(yīng)WRFC(Weighted Response For a Class)度量指標(biāo)。
式中a、b為調(diào)節(jié)因子,是度量實(shí)踐中獲取的經(jīng)驗(yàn)值,可表現(xiàn)出本類方法和被本類方法調(diào)用的方法對(duì)類加權(quán)響應(yīng)值的影響程度的大小。NMC(Number of Methods a Class)是本類方法數(shù),NCMC(Number of Called Methods a Class)是被本類方法調(diào)用的方法數(shù)。
(6)LCOM存在一定的缺陷,沒有將類的實(shí)例變量數(shù)計(jì)算進(jìn)來,但實(shí)際上類的實(shí)例變量數(shù)對(duì)類內(nèi)聚性有一定的影響。假設(shè)一個(gè)類的LCOM較小,甚至為0,根據(jù)CK可以推斷出該類具有較好的內(nèi)聚性,但實(shí)際上可能因?yàn)樵擃悡碛写罅康膶?shí)例變量,所以其內(nèi)聚性及封裝性不容樂觀。因此,在LCOM的基礎(chǔ)上提出類內(nèi)聚缺乏度LCOC(Lack of Cohesion in Class)度量指標(biāo)。
LCOM同CK度量里定義的LCOM。假設(shè)一個(gè)類有n個(gè)方法 M1,…,Mn,Ij是方法 Mj中實(shí)例變量的集合,|Ij|為計(jì)算Ij集合中的元素個(gè)數(shù)。LCOC值越大,則類的內(nèi)聚性及封裝性越弱。
根據(jù)上述對(duì)CK度量方法的分析與改進(jìn),提出優(yōu)化的 CK 度量方法 OCK,其包括 CPC、CMIT、NOAC、ACBT、WRFC、LCOC等6個(gè)相對(duì)應(yīng)的度量指標(biāo),每個(gè)度量指標(biāo)針對(duì)性地彌補(bǔ)每點(diǎn)缺陷。例如,采用OCK度量的CPC能綜合考慮一個(gè)類的屬性和方法以及不同可見性成員對(duì)該類復(fù)雜性的影響;CMIT度量指標(biāo)解決了多重繼承的度量問題,消除歧義;NOAC值涵蓋了一個(gè)類的所有子孫;ACBT依據(jù)耦合類型的不同分配不同的權(quán)值從而度量類的耦合性等等。
OCK度量方法雖在CK度量的基礎(chǔ)上進(jìn)行了改進(jìn),但仍存在一些缺陷。首先OCK度量沒有對(duì)多態(tài)性進(jìn)行度量,多態(tài)對(duì)整個(gè)系統(tǒng)的復(fù)雜性有很大影響;其次OCK與CK度量一樣主要是針對(duì)類層面,在系統(tǒng)層面沒有很好的度量指標(biāo)。MOOD度量也存在一定的不足。比如,MOOD度量沒有對(duì)類方法和屬性以及類之間的關(guān)系進(jìn)行研究,也沒有完整定義抽象性和復(fù)雜性[10]。
此外,繼承性和耦合性也是面向?qū)ο蟮幕咎匦?,將軟件類層面和系統(tǒng)層面的繼承性、耦合性度量結(jié)合起來可以更好地反映軟件整體的復(fù)雜度。但單獨(dú)的OCK度量和MOOD度量都只考慮了繼承和耦合的單個(gè)方面的復(fù)雜性,不能可靠地對(duì)軟件進(jìn)行整體評(píng)價(jià)。因此針對(duì)這兩種度量方法進(jìn)行改進(jìn),補(bǔ)充每個(gè)度量方法缺少的方面,從而提出新的面向?qū)ο筌浖?fù)雜性度量方法OSCM如下,與OCK度量和MOOD度量的比較如表1所示。
表1 OCK、MOOD、OSCM 度量匯總
度量1使用CPC度量指標(biāo)對(duì)類復(fù)雜性進(jìn)行度量。
度量 2 使用 AIF,MIF,CMIT和 NOAC等 4個(gè)度量指標(biāo)對(duì)繼承性進(jìn)行度量。既有對(duì)系統(tǒng)級(jí)別繼承性的度量,又有對(duì)類級(jí)別繼承性的度量。
度量3使用AHF,MHF和LCOC等3個(gè)度量指標(biāo)對(duì)封裝性進(jìn)行度量。既有對(duì)系統(tǒng)級(jí)別封裝性的度量又有對(duì)類級(jí)別封裝性的度量。
度量4使用PF度量指標(biāo)對(duì)多態(tài)性進(jìn)行度量。
度量5使用CF,ACBT和WRFC等3個(gè)度量指標(biāo)對(duì)耦合性進(jìn)行度量。CF的度量粒度不夠細(xì)[6],加上類級(jí)別的ACBT和WRFC就能更好得衡量整體耦合性。
上述5條度量法則即為改進(jìn)提出的OSCM度量方法。OSCM度量綜合考慮了OCK度量和MOOD度量的優(yōu)缺點(diǎn),可同時(shí)針對(duì)軟件類級(jí)別和系統(tǒng)級(jí)別進(jìn)行度量,有效地彌補(bǔ)CK度量和MOOD度量的不足。
本文在CK度量和MOOD度量的基礎(chǔ)上,對(duì)CK度量進(jìn)行改進(jìn)完善,提出OCK度量方法。再集成OCK度量和MOOD度量的優(yōu)點(diǎn),提出面向?qū)ο筌浖?fù)雜性度量OSCM。OSCM可較全面、可靠地對(duì)面向?qū)ο筌浖?fù)雜性進(jìn)行度量,優(yōu)化度量結(jié)果。
[1]PRESSMAN R S.軟件工程實(shí)踐者的研究方法[M].梅宏譯.北京:機(jī)械工業(yè)出版社,2002.
[2]LORENZ M, KIDD J.Object-Oriented Software Metrics: A Practical Guide[M].New Jersey: Prentice-Hall,1994.
[3]CHIDAMBER S R,KEMERER C F.A metrics suite for object oriented design[J].IEEE Transaction on Software Engineering, 1994,20(6):476-493.
[4]Li Wei. Another metric suite for object-oriented programming[J].Journal of Systems and Software, 1998,44(2): 155-162.
[5]ABREU F B.MOOD-metrics for object-oriented design[C].Proc of the 9th Annual Conference on Object-Oriented Programming Systems, Languages, and Applications.New York:ACM Press,1994.
[6]張偉.面向?qū)ο筌浖?fù)雜性度量研究[D].武漢:武漢理工大學(xué),2007.
[7]吳光金.面向?qū)ο筌浖?fù)雜性度量方法的研究 [D].重慶:重慶大學(xué),2008.
[8]倫立軍,丁雪梅,李英梅.面向?qū)ο筌浖攘考夹g(shù)研究[J].計(jì)算機(jī)應(yīng)用研究,2002,19(12):40-42.
[9]馬志新,徐德啟,杜偉杰.面向?qū)ο筌浖攘緾&K方法的研究與改進(jìn) [J].電子科技大學(xué)學(xué)報(bào),2006,35(3):396-398.
[10]李大鵬,郭平,陳新宇.一種集成類層次和系統(tǒng)層次的面向?qū)ο筌浖?fù)雜性度量集 [J].計(jì)算機(jī)研究與發(fā)展(增刊),2010,47:237-242.