摘要:對現有著名的類內聚度度量進行了較深入的分析,指出了各自存在的缺陷與不足,并在此基礎上考慮到類內聚度受到類內有可能與外界組件產生耦合的成員的負面影響,提出了對CCM(C)再次修正后的MCCM2(C)。
關鍵詞:面向對象; 軟件度量; 內聚度
中圖分類號:TP311.5文獻標志碼:A
文章編號:1001-3695(2007)07-0040-03
0引言
軟件開發的目標是開發出高內聚和低耦合的系統[1]。內聚應該是模塊成分之間的相互關系。一個高內聚的模塊就是具有一個基本功能的模塊,一個內聚性很好的模塊是很難被分離的。根據內聚的等級將內聚分類。其中一致內聚是最低級的內聚,也是軟件開發者最不想要的內聚;功能內聚是最高級的內聚,是開發者追求的內聚。內聚標志著一個模塊內各個元素彼此結合的緊密程度,即它度量單個模塊所完成的諸項任務在功能上相互關聯的程度。軟件設計力求做到高內聚,理想內聚的模塊只完成一項相對完整的任務。通常,中等程度的內聚也是可以采用的,而且效果與高內聚差不多;低內聚不理想,一般不使用。
內聚和耦合是密切相關的[2]。模塊內的高內聚往往意味著模塊間的松耦合。內聚和耦合都是進行模塊化設計的有力工具。但實踐表明,內聚更重要,應該把更多的注意力放到提高模塊的內聚度方面。
面向對象技術采用數據抽象、封裝、繼承、多態性、信息隱藏、重用等機制,增強了軟件的可維護性、可靠性,提高了生產效率等。這在傳統的軟件開發中是不完善的或缺少的。面向對象軟件的開發方法不同于傳統的基于功能分解和數據流程的開發方法。目前面向對象的軟件開發技術已成為軟件開發的主流技術。為了評價面向對象軟件設計的質量,很多學者提出了面向對象軟件度量的方法,引起了學術界和產業界的極大關注。
1相關研究及其分析
類是面向對象軟件的基本單元,是一組屬性與操作在這組屬性上的方法的集合。設計高質量的類是面向對象軟件設計者的追求。但是在設計階段,如果采用不合適的建模方法,很難設計出高內聚類。為了評價面向對象系統中類內聚度,很多學者根據自己對類內聚度的理解提出了相應的評價準則。這些大多數類內聚度度量都是對Chidamber和Kemerer[3]的類內聚缺乏度LCOM(Lack of Cohesion in Methods)的擴展和延伸。
現有類內聚度量基本上都建立在對類中實例變量使用和共享的基礎上[4]。類中實例變量被引用或被方法共享的次數越多,其類內聚度就越高。表1對目前著名的類內聚度度量進行了總結。
Chidameber和Kemerer提出用類內聚缺乏度LCOM(LCOM1,LCOM2)來評價類內聚度。LCOM1計算的是類中沒有共享實例變量的方法對數目,LCOM2計算類中有共享實例變量的方法對數目與沒有共享實例變量的數目差值。Li和Henry提出LCOM3計算類中沒有共享實例變量的方法集數目。后來Hitz和Montazeri重新定義了LCOM3。他們以圖論為基礎統計類中兩個不同方法中至少有一個共享實例變量的方法對數。LCOM4定義了方法與方法之間的調用關系。從LCOM1~4可以明顯看出,其度量值都與類中方法數目有著密切的關系,如圖1所示。采用這幾種方法對類A、B、C進行類內聚度度量。用LCOM1度量值分別為C27-6=15,C26-5=10,C24-0=6。從度量的結果可以看出,類A的內聚度是最差的,其次是類B,而內聚度最強的是類C,這與類C的類聚度是最差的事實相反。用LCOM2度量值分別為15-6=9,10-5=5,6-0=6。可以看出,內聚度最差的還是類A而不是類C。用LCOM3或LCOM4度量值分別為:7、5、0,雖然在這組度量數據中類C的內聚度是最差的,但是類A的內聚度比類B的內聚度大,這與實際是不相符的。從上面這個簡單的實例可以很明顯地看出,它們所存在的共同缺陷就是受類中方法數目的影響較大。所以有學者提出了相對類內聚度的方法。Co度量方法計算的是類中存在的有共享實例變量的方法對數目與可能存在的方法對數目的比值。Hendersen-Sellers提出的LCOM5計算的是屬性被方法平均訪問的個數,是一個相對概念。Co和LCOM5都以一個相對比值作為度量消除了類中方法個數對度量結果的影響。
表1現有著名的類內聚度度量
Bieman和Kang提出的TCC(Tight Class Cohesion)和LCC(Loose Class Cohesion)也考慮了類中共享實例變量的方法對,TCC計算出類中有直接關聯的方法對數目與類中最大可能存在的方法對數目的比值;LCC計算出了類中有直接或間接關聯的方法對數目與最大可能存在的方法對數目比值。TCC和LCC衡量類中有關方法與方法之間關聯程度強與弱的兩個不同指標。其度量值是一個相對值,類中的方法數目不會對其準確性產生較大影響。
Wasiq提出的CCM(C)、CCCM(C)、MCCM(C)作為評價類內聚度的指標,CCM(C)和CCCM(C)兩個衡量指標不僅考慮了類中有關聯方法的數目,而且更重要的是還考慮了類中成員之間的連通問題。連通是指將類映射成無向圖G(M,E)。其中,M是G中的頂點,與類中的方法對應;E是方法與方法之間有關聯關系的序列。如果G是連通的,則該類中的方法也是連通的。更值得一提的是MCCM(C)還考慮了對類內聚度產生負面影響的因素,但其只考慮了重寫對類內聚度的影響。
Simon等人[12]提出的基于距離的類內聚度度量,主要用類中兩個方法的相似度作為基礎來衡量類內聚度。國內很多學者提出了基于切片技術的類內聚度度量[1],如基于依賴性的類內聚度量[13]、基于類結構的類內聚度量[14]等。以上度量基本都從類中成員之間的關系(屬性與屬性、方法與屬性、方法與方法)來考慮類內聚度,只有CCM(C)、CCCM(C)、MCC(M)考慮到了類中各個成員的連通問題,而且MCCM(C)還考慮了影響類內聚度的負面因素。但它只考慮了類中方法重寫對類內聚度的負面影響。面向對象的軟件設計中,類是一個層次概念,它不僅在縱向上與繼承的父類和繼承它的子類有關系,而且要與橫向的其他類發生聯系。這些都應該考慮在影響類內聚度的負面因素中。所以提出了對CCM(M)進行重新修正的類內聚度度量MCCM2(C)。
2再次修正CCM(C)后的MCCM2(C)
類內內聚度度量主要從類中各個成員(方法與屬性)的緊密程度來度量。繼承性、多態性是面向對象軟件設計的三大重要特征中的兩個,但它們對單個類內內聚度來說起負面影響作用。因為一個類在類層次中可能既有父類又有子類,所以應該考慮父類和子類兩方面有可能對該類產生的影響。父類產生的影響主要從父類繼承的方法和屬性來考慮;多態性從面向對象中多態實現的兩種主要機制(方法重寫和方法覆蓋)來考慮。主要考慮類中的方法和屬性對其他類或對象的可見性,一個類中的方法和屬性可能被子類繼承,還有可能被其他有關聯的類引用,這類有可能被子類和其他關聯類引用的成員主要有該類中的共有方法和屬性。
3MCCM2(C)的應用
圖2所示的是考慮外界負面因素影響的類內聚度的度量。圖中類間的關聯可以表示由于繼承或消息通信所帶來的類間聯系。從圖2中可以看出,(a)中的類A內聚度明顯低于(b)中類A的內聚度。但是用上述度量方法基本上不能區分這兩個類在內聚度方面的差別;MCCM2(C)卻能很好地區分這種差別。
MCCM2(C)能指出一個類的全面內聚。此外,CMM和PF2能體現類的設計的一些問題。
(1)CCM高PF2低
類中的各個成員(屬性或方法)之間的聯系緊密,總體對類的內聚度貢獻大,同時該類與外界部件發生聯系的可能性小,對于面向對象的軟件來說具有較高的封裝性。這樣的軟件設計真正體現了軟件設計準則“高內聚,低耦合”。
(2)CCM高PF2高
類中的各個成員(屬性或方法)之間的聯系緊密,總體對類的內聚度貢獻大,但是該類與外界部件發生聯系的可能性大,沒有很好地體現面向對象軟件中封裝性的特點。
(3)CCM低PF2低
類中的各個成員(屬性或方法)之間的聯系松散,但是該類與外界部件發生聯系的可能性小,很好地體現了面向對象軟件中封裝性的特點。這種軟件設計的類粒度過大,應考慮將其劃分成不同的子類更為合適。
(4)CCM低PF2高
類中的各個成員(屬性或方法)之間的聯系松散;同時該類與外界部件發生聯系的可能性大,沒有很好地體現面向對象軟件中封裝性的特點。這種設計是軟件設計中最不理想的情況,既沒有好的內聚性,也沒有好的封裝性。這種類一般需要重新設計。
4結束語
面向對象的度量與面向過程的度量相比,起步比較晚,所以在理論和實踐中都不是很完善。該文就目前有關類內聚度度量中著名的方法進行了比較深入的分析,指出了各自存在的缺陷與不足。類具有層次關系,類的內聚度應該考慮它在層次中的縱向關系,也應該考慮它在實際應用中的橫向關系,而目前有關類內聚度度量研究大多數只考慮了類中方法和屬性、方法和方法之間的關系,很少考慮到類中成員有可能與外界組件發生耦合的負面影響。本文基于此,充分考慮了類中與外界可能發生耦合的負面影響,提出了再次修正CCM(C)后的MCCM2(C)。根據類內聚度度量研究現狀,在下一步研究中應該注意以下方面:
①類中各個成員的連通性,以及各個連通子圖的結構對類內聚度的影響;
②從類所實現的功能對類內聚度進行度量;
③類中成員對類內聚度貢獻的差異性的量化研究;
④研究類中各個成員之間的功能依賴和邏輯依賴性對類內聚度度量的影響;
⑤類中各個方法相似度的研究,考慮它們對類內聚度的影響。
參考文獻:
[1]李必信,朱平,譚毅,等.基于數據切片度量Java內聚性[J].軟件學報,2001,12(12):1851-1858.
[2]倫立軍,丁雪梅,李英梅.面向對象系統的耦合性度量技術研究[J].計算機工程與應用,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]陳振強,徐寶文.一種基于依賴性分析的類內聚度度量方法[J].軟件學報,2003,14(11):1849-1856.
[14]黃江,宋雨,馬永光.面向對象系統中考慮結構因素的類的內聚度量[J].華北電力大學學報,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]劉宗田.面向對象軟件度量中的內聚缺乏度分析[J].計算機研究與發展,2001,38(2):138-143.
注:“本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文”