摘要:對現(xiàn)有著名的類內(nèi)聚度度量進(jìn)行了較深入的分析,指出了各自存在的缺陷與不足,并在此基礎(chǔ)上考慮到類內(nèi)聚度受到類內(nèi)有可能與外界組件產(chǎn)生耦合的成員的負(fù)面影響,提出了對CCM(C)再次修正后的MCCM2(C)。
關(guān)鍵詞:面向?qū)ο? 軟件度量; 內(nèi)聚度
中圖分類號(hào):TP311.5文獻(xiàn)標(biāo)志碼:A
文章編號(hào):1001-3695(2007)07-0040-03
0引言
軟件開發(fā)的目標(biāo)是開發(fā)出高內(nèi)聚和低耦合的系統(tǒng)[1]。內(nèi)聚應(yīng)該是模塊成分之間的相互關(guān)系。一個(gè)高內(nèi)聚的模塊就是具有一個(gè)基本功能的模塊,一個(gè)內(nèi)聚性很好的模塊是很難被分離的。根據(jù)內(nèi)聚的等級將內(nèi)聚分類。其中一致內(nèi)聚是最低級的內(nèi)聚,也是軟件開發(fā)者最不想要的內(nèi)聚;功能內(nèi)聚是最高級的內(nèi)聚,是開發(fā)者追求的內(nèi)聚。內(nèi)聚標(biāo)志著一個(gè)模塊內(nèi)各個(gè)元素彼此結(jié)合的緊密程度,即它度量單個(gè)模塊所完成的諸項(xiàng)任務(wù)在功能上相互關(guān)聯(lián)的程度。軟件設(shè)計(jì)力求做到高內(nèi)聚,理想內(nèi)聚的模塊只完成一項(xiàng)相對完整的任務(wù)。通常,中等程度的內(nèi)聚也是可以采用的,而且效果與高內(nèi)聚差不多;低內(nèi)聚不理想,一般不使用。
內(nèi)聚和耦合是密切相關(guān)的[2]。模塊內(nèi)的高內(nèi)聚往往意味著模塊間的松耦合。內(nèi)聚和耦合都是進(jìn)行模塊化設(shè)計(jì)的有力工具。但實(shí)踐表明,內(nèi)聚更重要,應(yīng)該把更多的注意力放到提高模塊的內(nèi)聚度方面。
面向?qū)ο蠹夹g(shù)采用數(shù)據(jù)抽象、封裝、繼承、多態(tài)性、信息隱藏、重用等機(jī)制,增強(qiáng)了軟件的可維護(hù)性、可靠性,提高了生產(chǎn)效率等。這在傳統(tǒng)的軟件開發(fā)中是不完善的或缺少的。面向?qū)ο筌浖拈_發(fā)方法不同于傳統(tǒng)的基于功能分解和數(shù)據(jù)流程的開發(fā)方法。目前面向?qū)ο蟮能浖_發(fā)技術(shù)已成為軟件開發(fā)的主流技術(shù)。為了評價(jià)面向?qū)ο筌浖O(shè)計(jì)的質(zhì)量,很多學(xué)者提出了面向?qū)ο筌浖攘康姆椒ǎ鹆藢W(xué)術(shù)界和產(chǎn)業(yè)界的極大關(guān)注。
1相關(guān)研究及其分析
類是面向?qū)ο筌浖幕締卧且唤M屬性與操作在這組屬性上的方法的集合。設(shè)計(jì)高質(zhì)量的類是面向?qū)ο筌浖O(shè)計(jì)者的追求。但是在設(shè)計(jì)階段,如果采用不合適的建模方法,很難設(shè)計(jì)出高內(nèi)聚類。為了評價(jià)面向?qū)ο笙到y(tǒng)中類內(nèi)聚度,很多學(xué)者根據(jù)自己對類內(nèi)聚度的理解提出了相應(yīng)的評價(jià)準(zhǔn)則。這些大多數(shù)類內(nèi)聚度度量都是對Chidamber和Kemerer[3]的類內(nèi)聚缺乏度LCOM(Lack of Cohesion in Methods)的擴(kuò)展和延伸。
現(xiàn)有類內(nèi)聚度量基本上都建立在對類中實(shí)例變量使用和共享的基礎(chǔ)上[4]。類中實(shí)例變量被引用或被方法共享的次數(shù)越多,其類內(nèi)聚度就越高。表1對目前著名的類內(nèi)聚度度量進(jìn)行了總結(jié)。
Chidameber和Kemerer提出用類內(nèi)聚缺乏度LCOM(LCOM1,LCOM2)來評價(jià)類內(nèi)聚度。LCOM1計(jì)算的是類中沒有共享實(shí)例變量的方法對數(shù)目,LCOM2計(jì)算類中有共享實(shí)例變量的方法對數(shù)目與沒有共享實(shí)例變量的數(shù)目差值。Li和Henry提出LCOM3計(jì)算類中沒有共享實(shí)例變量的方法集數(shù)目。后來Hitz和Montazeri重新定義了LCOM3。他們以圖論為基礎(chǔ)統(tǒng)計(jì)類中兩個(gè)不同方法中至少有一個(gè)共享實(shí)例變量的方法對數(shù)。LCOM4定義了方法與方法之間的調(diào)用關(guān)系。從LCOM1~4可以明顯看出,其度量值都與類中方法數(shù)目有著密切的關(guān)系,如圖1所示。采用這幾種方法對類A、B、C進(jìn)行類內(nèi)聚度度量。用LCOM1度量值分別為C27-6=15,C26-5=10,C24-0=6。從度量的結(jié)果可以看出,類A的內(nèi)聚度是最差的,其次是類B,而內(nèi)聚度最強(qiáng)的是類C,這與類C的類聚度是最差的事實(shí)相反。用LCOM2度量值分別為15-6=9,10-5=5,6-0=6。可以看出,內(nèi)聚度最差的還是類A而不是類C。用LCOM3或LCOM4度量值分別為:7、5、0,雖然在這組度量數(shù)據(jù)中類C的內(nèi)聚度是最差的,但是類A的內(nèi)聚度比類B的內(nèi)聚度大,這與實(shí)際是不相符的。從上面這個(gè)簡單的實(shí)例可以很明顯地看出,它們所存在的共同缺陷就是受類中方法數(shù)目的影響較大。所以有學(xué)者提出了相對類內(nèi)聚度的方法。Co度量方法計(jì)算的是類中存在的有共享實(shí)例變量的方法對數(shù)目與可能存在的方法對數(shù)目的比值。Hendersen-Sellers提出的LCOM5計(jì)算的是屬性被方法平均訪問的個(gè)數(shù),是一個(gè)相對概念。Co和LCOM5都以一個(gè)相對比值作為度量消除了類中方法個(gè)數(shù)對度量結(jié)果的影響。
表1現(xiàn)有著名的類內(nèi)聚度度量
Bieman和Kang提出的TCC(Tight Class Cohesion)和LCC(Loose Class Cohesion)也考慮了類中共享實(shí)例變量的方法對,TCC計(jì)算出類中有直接關(guān)聯(lián)的方法對數(shù)目與類中最大可能存在的方法對數(shù)目的比值;LCC計(jì)算出了類中有直接或間接關(guān)聯(lián)的方法對數(shù)目與最大可能存在的方法對數(shù)目比值。TCC和LCC衡量類中有關(guān)方法與方法之間關(guān)聯(lián)程度強(qiáng)與弱的兩個(gè)不同指標(biāo)。其度量值是一個(gè)相對值,類中的方法數(shù)目不會(huì)對其準(zhǔn)確性產(chǎn)生較大影響。
Wasiq提出的CCM(C)、CCCM(C)、MCCM(C)作為評價(jià)類內(nèi)聚度的指標(biāo),CCM(C)和CCCM(C)兩個(gè)衡量指標(biāo)不僅考慮了類中有關(guān)聯(lián)方法的數(shù)目,而且更重要的是還考慮了類中成員之間的連通問題。連通是指將類映射成無向圖G(M,E)。其中,M是G中的頂點(diǎn),與類中的方法對應(yīng);E是方法與方法之間有關(guān)聯(lián)關(guān)系的序列。如果G是連通的,則該類中的方法也是連通的。更值得一提的是MCCM(C)還考慮了對類內(nèi)聚度產(chǎn)生負(fù)面影響的因素,但其只考慮了重寫對類內(nèi)聚度的影響。
Simon等人[12]提出的基于距離的類內(nèi)聚度度量,主要用類中兩個(gè)方法的相似度作為基礎(chǔ)來衡量類內(nèi)聚度。國內(nèi)很多學(xué)者提出了基于切片技術(shù)的類內(nèi)聚度度量[1],如基于依賴性的類內(nèi)聚度量[13]、基于類結(jié)構(gòu)的類內(nèi)聚度量[14]等。以上度量基本都從類中成員之間的關(guān)系(屬性與屬性、方法與屬性、方法與方法)來考慮類內(nèi)聚度,只有CCM(C)、CCCM(C)、MCC(M)考慮到了類中各個(gè)成員的連通問題,而且MCCM(C)還考慮了影響類內(nèi)聚度的負(fù)面因素。但它只考慮了類中方法重寫對類內(nèi)聚度的負(fù)面影響。面向?qū)ο蟮能浖O(shè)計(jì)中,類是一個(gè)層次概念,它不僅在縱向上與繼承的父類和繼承它的子類有關(guān)系,而且要與橫向的其他類發(fā)生聯(lián)系。這些都應(yīng)該考慮在影響類內(nèi)聚度的負(fù)面因素中。所以提出了對CCM(M)進(jìn)行重新修正的類內(nèi)聚度度量MCCM2(C)。
2再次修正CCM(C)后的MCCM2(C)
類內(nèi)內(nèi)聚度度量主要從類中各個(gè)成員(方法與屬性)的緊密程度來度量。繼承性、多態(tài)性是面向?qū)ο筌浖O(shè)計(jì)的三大重要特征中的兩個(gè),但它們對單個(gè)類內(nèi)內(nèi)聚度來說起負(fù)面影響作用。因?yàn)橐粋€(gè)類在類層次中可能既有父類又有子類,所以應(yīng)該考慮父類和子類兩方面有可能對該類產(chǎn)生的影響。父類產(chǎn)生的影響主要從父類繼承的方法和屬性來考慮;多態(tài)性從面向?qū)ο笾卸鄳B(tài)實(shí)現(xiàn)的兩種主要機(jī)制(方法重寫和方法覆蓋)來考慮。主要考慮類中的方法和屬性對其他類或?qū)ο蟮目梢娦裕粋€(gè)類中的方法和屬性可能被子類繼承,還有可能被其他有關(guān)聯(lián)的類引用,這類有可能被子類和其他關(guān)聯(lián)類引用的成員主要有該類中的共有方法和屬性。
3MCCM2(C)的應(yīng)用
圖2所示的是考慮外界負(fù)面因素影響的類內(nèi)聚度的度量。圖中類間的關(guān)聯(lián)可以表示由于繼承或消息通信所帶來的類間聯(lián)系。從圖2中可以看出,(a)中的類A內(nèi)聚度明顯低于(b)中類A的內(nèi)聚度。但是用上述度量方法基本上不能區(qū)分這兩個(gè)類在內(nèi)聚度方面的差別;MCCM2(C)卻能很好地區(qū)分這種差別。
MCCM2(C)能指出一個(gè)類的全面內(nèi)聚。此外,CMM和PF2能體現(xiàn)類的設(shè)計(jì)的一些問題。
(1)CCM高PF2低
類中的各個(gè)成員(屬性或方法)之間的聯(lián)系緊密,總體對類的內(nèi)聚度貢獻(xiàn)大,同時(shí)該類與外界部件發(fā)生聯(lián)系的可能性小,對于面向?qū)ο蟮能浖碚f具有較高的封裝性。這樣的軟件設(shè)計(jì)真正體現(xiàn)了軟件設(shè)計(jì)準(zhǔn)則“高內(nèi)聚,低耦合”。
(2)CCM高PF2高
類中的各個(gè)成員(屬性或方法)之間的聯(lián)系緊密,總體對類的內(nèi)聚度貢獻(xiàn)大,但是該類與外界部件發(fā)生聯(lián)系的可能性大,沒有很好地體現(xiàn)面向?qū)ο筌浖蟹庋b性的特點(diǎn)。
(3)CCM低PF2低
類中的各個(gè)成員(屬性或方法)之間的聯(lián)系松散,但是該類與外界部件發(fā)生聯(lián)系的可能性小,很好地體現(xiàn)了面向?qū)ο筌浖蟹庋b性的特點(diǎn)。這種軟件設(shè)計(jì)的類粒度過大,應(yīng)考慮將其劃分成不同的子類更為合適。
(4)CCM低PF2高
類中的各個(gè)成員(屬性或方法)之間的聯(lián)系松散;同時(shí)該類與外界部件發(fā)生聯(lián)系的可能性大,沒有很好地體現(xiàn)面向?qū)ο筌浖蟹庋b性的特點(diǎn)。這種設(shè)計(jì)是軟件設(shè)計(jì)中最不理想的情況,既沒有好的內(nèi)聚性,也沒有好的封裝性。這種類一般需要重新設(shè)計(jì)。
4結(jié)束語
面向?qū)ο蟮亩攘颗c面向過程的度量相比,起步比較晚,所以在理論和實(shí)踐中都不是很完善。該文就目前有關(guān)類內(nèi)聚度度量中著名的方法進(jìn)行了比較深入的分析,指出了各自存在的缺陷與不足。類具有層次關(guān)系,類的內(nèi)聚度應(yīng)該考慮它在層次中的縱向關(guān)系,也應(yīng)該考慮它在實(shí)際應(yīng)用中的橫向關(guān)系,而目前有關(guān)類內(nèi)聚度度量研究大多數(shù)只考慮了類中方法和屬性、方法和方法之間的關(guān)系,很少考慮到類中成員有可能與外界組件發(fā)生耦合的負(fù)面影響。本文基于此,充分考慮了類中與外界可能發(fā)生耦合的負(fù)面影響,提出了再次修正CCM(C)后的MCCM2(C)。根據(jù)類內(nèi)聚度度量研究現(xiàn)狀,在下一步研究中應(yīng)該注意以下方面:
①類中各個(gè)成員的連通性,以及各個(gè)連通子圖的結(jié)構(gòu)對類內(nèi)聚度的影響;
②從類所實(shí)現(xiàn)的功能對類內(nèi)聚度進(jìn)行度量;
③類中成員對類內(nèi)聚度貢獻(xiàn)的差異性的量化研究;
④研究類中各個(gè)成員之間的功能依賴和邏輯依賴性對類內(nèi)聚度度量的影響;
⑤類中各個(gè)方法相似度的研究,考慮它們對類內(nèi)聚度的影響。
參考文獻(xiàn):
[1]李必信,朱平,譚毅,等.基于數(shù)據(jù)切片度量Java內(nèi)聚性[J].軟件學(xué)報(bào),2001,12(12):1851-1858.
[2]倫立軍,丁雪梅,李英梅.面向?qū)ο笙到y(tǒng)的耦合性度量技術(shù)研究[J].計(jì)算機(jī)工程與應(yīng)用,2003,39(29):116-118.
[3]CHIDAMBER S R, KEMERER C F. A metrics suite for object oriented design[J]. IEEE Transactions on Software Engineering, 1994,20(6):476-493.
[4]BRIAND L C, DALY J, WUSR J. A unified framework for cohesion measurement in object-oriented systems[J]. Empirical Software Engineering, 1998,3(1):67-117.
[5]CHIDAMBER S R, DARCY D P, KEMERER C F. Mangerial use of metrics for object-oriented software: an exploratory analysis[J]. IEEE Transactions on Software Engineering, 1998,24(8):629-639.
[6]LI Wei, HENRY S. Object oriented metrics that predict maintaina-bility[J]. Journal of Systems and Software, 1993,23(2):111-122.
[7]HITZ M, MONTAZERI B. Measuring coupling and cohesion in object oriented systems: proc.of Int.Symposium on Applied Corporate Computing[C].[S.l.]:[s.n.], 1995:25-27.
[8]HENDERSON-SELLERS B.Object-oriented metrics measures of complexity[M].[S.l.]: Prentice-Hall, 1996.
[9]BIEMAN J M, KANG B K. Cohesion and reuse in an object-oriented system: proc.of Symposium on Software Reusability(SSR’95)[C]. Seattle, WA:[s.n.], 1995:259-262.
[10]WASIQ M. Measuring class cohesion in object-oriented systems[D].[S.l.]: Information and Computer Science, KFUPM, 2001.
[11]CHAE H S, KWON Y R. A cohesion measure for classes in object-oriented system: proc.of the 5th ISMS[C].Bethesda, USA: IEEE, 1998:158-166.
[12]SIMON F, LOFFLER S, LEWERENTZ C. Distance based cohesion on measuring: FESMA’99[C]. Amsterdam:[s.n.], 1999.
[13]陳振強(qiáng),徐寶文.一種基于依賴性分析的類內(nèi)聚度度量方法[J].軟件學(xué)報(bào),2003,14(11):1849-1856.
[14]黃江,宋雨,馬永光.面向?qū)ο笙到y(tǒng)中考慮結(jié)構(gòu)因素的類的內(nèi)聚度量[J].華北電力大學(xué)學(xué)報(bào),2004,31(2):83-86.
[15]BADRI L, BADRI M. A new class cohesion criterion: an empirical study on several systems[J]. Empirical Software Engineering, 1998,3(1):65-117.
[16]劉宗田.面向?qū)ο筌浖攘恐械膬?nèi)聚缺乏度分析[J].計(jì)算機(jī)研究與發(fā)展,2001,38(2):138-143.
注:“本文中所涉及到的圖表、注解、公式等內(nèi)容請以PDF格式閱讀原文”