面向对象软件质量的度量方法 2009-09-10 Java 软件
面向对象软件质量的度量方法
面向对象软件度量是针对计算机面向对象软件的度量,是基于某些属性的的定量测量。通过度量,可以对面向对象软件给出客观的评价,能有针对性地进行改善软件的质量。
(一)软件质量六要素
1)功能性:软件所实现的功能满足用户需求的程度。功能性反映了所开发的软件满足用户称述的或蕴涵的需求的程度,即用户要求的功能是否全部实现。
2)可靠性:在规定的时间和条件下,软件所能维持其性能水平的程度。可靠性对某些软件是重要的质量要求,它除了反映软件满足用户需求正常运行的程度,且反映了在故障发生时能继续运行的程度。
3)易使用性:对于一个软件,用户学习、操作、准备输入和理解输出时,所做努力的程度。易使用性反映了与用户的友善性,即用户在使用本软件时是否方便。
4)效率:在指定的条件下,用软件实现某种功能所需的计算机资源(包括时间)的有效程度。效率反映了在完成功能要求时,有没有浪费资源,此外“资源”这个术语有比较广泛的含义,它包括了内存、外存的使用,通道能力及处理时间。
5)可维护性:在一个可运行软件中,为了满足用户需求、环境改变或软件错误发生时, 进行相应修改所做的努力程度。可维修性反映了在用户需求改变或软件环境发生变更时,对软件系统进行相应修改的难易程度。一个易于维护的软件系
统也是一个易理解、易测试和易修改的软件,以便纠正或增加新的功能,或允许在不同软件环境上进行操作。
6)可移植性:从一个计算机系统或环境转移到另一个计算机系统或环境的容易程度。
(二)类的分析
在满足以上 6 个基本的软件质量要素后,面向对象软件还应将重点放在类的分析上,面向对象软件质量的度量在对类的分析过程中,应采用多个视角分析一个类的特点,即从类的耦合、内聚度、继承性、复杂度等几个方面考虑。
(三) 类的分析方法
1) 基于耦合的分析
如果一个类作用于其他类,比如一个类的方法使用了另一个类的方法或实例,称为耦合,耦合分为几下几种:
(1)通过继承性带来的耦合
继承性有利于重用,但以为没有严格规定从超类中继承属性的方式,有可能破坏封装性和数据隐藏。
(2)通过消息传递带来的耦合 MPC
MPC 是类中对象间传递消息的数量,通常用来测类中消息传递的复杂性。MPC表示在一个类中,方法的实现对其它类的依赖性,但没包含类接收消息的数量。 如果 MPC 较大, 说明其它类的耦合越强;类的响应 RFC 不仅计算了类之间的消息传递,而且对于类的实现方法中,调用类本身方法的情况也加以考虑,因此一般情况下 MPC 的值要小于 RFC 的值。在系统的设计实现过程中 RFC 的值越大,说明是系统中起重要作用的类。
(3)类之间的耦合CBO
CBO是全面考核类与类之间的各种耦合,表示类 C 使用其它类中属性和方法的数量。CBO’表示类C 使用除祖先外的其它类中属性和方法的数量, 即是 CBO 中
除去因继承引起的耦合。类与类之间的非继承耦合比继承耦合更可能解释为软件体系结构的一种交互,因此当 CBO 与CBO’的数值越低,则表明系统类一级的分解适合,且复杂度控制性越好,越易于进行系统的部件化开发,维护。
结论:
(1)CBO 和 CBO’的值太大,不利于模块化设计和阻碍软件的复用。
CBO 和 CBO’的值越低,表明该类影响到的类越少,独立性越强,则修改是所涉及的类也越少,维护的代价越小,类的质量越好,所以一个设计良好的系统应该避免较大
的 CBO 值。
改进措施: 查看 CBO 较高的类, 检查与该类相关的设计,尽量改进设计降低 CBO 的数值;对于 CBO 值高,且 CBO’值也高的类,可以配合继承度量的情况,检查该类的继承层次。
(2)RPC 的值越高, 意味着类的复杂度很高, 且可理解性、可维护性很低, 因此 RPC、MPC 的数值越低, 程序分解合理,不易出错,模块质量好。
改进措施:对于 MPC 和 RPC 数值较高的类。需要结合该方法的复杂度,对复杂度超过标准的,必须进行分解,以便于软件的实现和测试。
2) 基于内聚的分析
内聚度量是一个模块内部各成分之间相互关联的程度,内聚的度量应分为:(1)类的内聚(通常用 LCOM);(2)方法的内聚;(3)继承内聚。
在面向对象软件的质量度量中采用 LCOM1、LCOM2 指标衡量软件设计中类的内聚度。由于 LCOM1、LCOM2 是直接度量类内聚缺乏的程度,值越大其内聚度反而不好。
LCOM1 是类方法间通过使用相同属性增强内聚性的。
LCOM2 是在方法 M1 和方法 M2 间的相似程度为 0 的方法对个数减去方法 M1 和方法 M2 间的相似程度不为 0 的方法类个数,因此相似方法越多,类的聚合度越高,LCOM2 的值反映了方法间相对不同程度。
结论:LCOM 值大的,类的设计质量下降。
改进措施:LCOM 值越大,说明方法之间的聚合度不是很高,类的封装性比较差,应分析是否可能存在通过微小改动而产生不相关的方法集合和属性集合,如果存在就应该进行正确类的分解。
3) 基于继承的分析
继承度指标中继承树的深度(DIT)、类到叶子的深度(CLD)是有关继承树纵向深度的度量。特别当一个类的CLD=0 时,表示一个叶子类,当一个类的 DIT 为 0 时,表示一个根类。特别地 DIT、CLD 二者的值在系统类中呈现均匀分布,即不随类的改变而改变。
评价:DIT+CLD 的值越小,则该类的抽象级越高,值越
高,表明该类来自于继承的方法可能越多,其设计越复杂,类的实现质量越难以保证。
改进措施:对于 DIT 值高的类,要控制该类在实现中的用法,避免由于继承深度大,造成方法多,从而引起误用;对于 CLD 值高的类, 需要多加确认和测试, 减少对其的修改。
4) 基于复杂度的分析
每个类的方法的权重和 WMC,是传统基于模块化、结构化设计度量方法在面向对象度量的应用,是对类的整体复杂度的衡量。方法的数量和它们的复杂性是对实现和测试类所需要的工作量的合理指标,方法数量越多,继承树也越复杂。类是面向对象抽象的结果,对于一个功能性很强的类,在实现过程中可以有几个不同的类分别完成各项任务,在有一个类将它们联合起来, 这样每一个类的实现复杂度都不高,而且易于实现和测试。当把一个系统当作一种对象时,是没有理由因为它是一个对象,就把它实现为一个单独的类,因此任何类的实现复杂度都不应该太大,从程序的实现中容易出错、可维护性、可理解性等质量特性来看都是这样。
评价:为 WMC 设定一个警戒值,当 WMC 大于警戒值时,类的设计和实现质量降低,需要检视和修订。
改进措施:对于方法高于警戒值的类,需要考虑其方法的复杂度情况,是否存在复杂度特别高的方法,如果存在则分解该方法;如果每个方法的实现复杂度并不高,则参考类的内聚度,查看是否需要分解该类。
(四) 总结
面向对象程序设计是以类为基本单位的,所以则应计算与一个类有耦合关系的类的个数,类的内聚度,类的代码行数以及类的复杂度。目前面向对象软件度量的研究现状与面向对象的分析、设计技术以及程序设计语言的研究相比尚显薄弱,软件度量学理论还缺少坚实的理论基础。在此基础上提出的度量技术及结果的评价还不够精确。寻找新的和更为有效的度量指标, 来确认已知度量的有效性和度量的形式化。软件度量的理论基础至关重要,数值分布和回归分析等数学理论对面向对象软件质量度量结果的分析与评估有很大的帮助。因此,应在面向对象软件度量的数学理论基础上,进一步提高我们的软件度量水平,使面向对象软件度量的结果分析与评价更为准确、可靠。






