面向对象软件中类内聚度度量分析与研究
■ 陈文海 葛 玮 郝克刚 侯 红《计算机应用研究》 2007年第7期
摘要:对现有著名的类内聚度度量进行了较深入的分析,指出了各自存在的缺陷与不足,并在此基础上考虑到类内聚度受到类内有可能与外界组件产生耦合的成员的负面影响,提出了对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.