本文挡描述的是Logiscope——Audit中常用的系统度量元的具体含义。
对每个度量元的解释分为以下几部分:
首先是该度量元的原文名称,后面是该度量元的代号,跟在后面的是Audit质量模型为该度量元设的参考值(用中括号括起。对于这个范围值,我们可以对它进行修改),再往下就是对该度量元含义的具体解释。
下面介绍系统作用域中各个度量元的具体含义。注意,下面讨论的所有问题都是站在整个系统(或子系统)的角度上的,这一点对于我们理解这些度量元很重要。
度量元名称:类耦合因素。
解释说明:
该度量元的计算方法为:
类的总数
ap_cof = (∑ Ci与其他的类发生耦合关系的数量)/ 类的总数*(类的总数 — 1)
i = 1
( 注:Ci表示第i个类 )
当某一个类有以下情形之一时,该类与其他类的耦合关系的数量加一:
1 在该类的类函数中调用了另一个类的成员函数。
2 该类通过友员的方法调用另一个类中的可见或不可见的函数。
3 在该类中调用了另一个类的构造/析构函数。
4 该类中将另一个类作为数据成员或作为类函数中的参数。
度量元名称:类函数继承的比率。
解释说明:该度量元是一个比值。
分子为:在系统所有类的成员函数中,由父类继承来的成员函数的数量总和。
分母为:系统所有类的成员函数的总和(包括自己定义的和从父类继承而来的)。
度量元名称:类数据成员继承的比率。
解释说明: 该度量元是一个比值。
分子为:在系统所有类的数据成员中,由父类继承来的数据成员的数量总和。
分母为:系统所有类的数据成员的总和(包括自己定义的和从父类继承而来的)。
度量元名称:类的多态性因素。
解释说明:该度量元是一个比值。
分子为:在系统所有类的成员函数中,重载的函数的数量总和。
分母为:
系统中类的总数
∑(Ci中未被重载的成员函数的数量* Ci子类的个数)
i = 1
( 注:Ci表示第i个类 )
度量元名称:类对其数据成员的保护程度。
解释说明:该度量元是一个比值。
分子为:在系统所有类的数据成员中,属于Private型数据成员的总数。
分母为:系统所有类的数据成员的总和。
度量元名称:系统中类耦合的平均值。
解释说明:
计算公式为:
其中:ap_cbo 的值由以下两部分组成:
1在一个类的成员函数中调用不属于该类的函数,在系统中,这种情况出现一次,ap_cbo的值加一。
2类中类类型数据成员的数量。在系统中,这种情况出现一次,ap_cbo的值加一。
ap_clas:系统中类的数量。
如果该值过高,则说明系统中类与类之间的耦合较强,这会使对系统进行更改工作时变的非常困难。
度量元名称:类继承图的深度。
解释说明:在系统中所有的类继承图中,最大继承层次的数量。
度量元名称:类成员函数的私有情况。
解释说明:
该度量元的计算公式为:
类总数 类i中函数个数
ap_mhf =(∑ [ ∑( 1 – V( m ) )])/ (系统中类成员函数数量的总和)
i = 1 m=1
其中V( m )的值为:
当该函数为 public型时,V( m ) = 1
当该函数为 private型时,V( m ) = 0
当该函数为 protected型时,V( m ) = ( 由该类派生的类的个数 ) /(类总数 – 1 )
度量元名称:类继承图的层次复杂性。
解释说明:
它的计算公式为:
ap_inhg_cpx == SUM( N * I ) / SUM( N )
其中:SUM表示取和, I为类继承图中的层次序号(1,2,3…),N 为继承图中第I层中的结点个数。例如下面这样的一个继承关系:
则 ap_inhg_cpx = ( 1* 1 + 2*3 + 3*1 )/ (1 + 3 + 1 )= 2.0。由计算公式可以看出,多继承很影响该度量元的得分,所以尽量避免多重继承。
该度量元是类继承关系的图形结构的表示,它的目的是测量类继承关系的复杂性。如果改值大于二,则表明类的继承关系过于复杂。
度量元名称:重复继承的类的数量占系统中类继承关系数量的比率。
解释说明:重复继承的类的数量占系统中类继承关系数量的比率。
该度量元的计算公式为:
其中:ap_inhg_uri :系统中重复继承的“类对”的数量。
ap_inhg_edge:系统中类的继承关系图中边的数量。
那么,何为重复继承呢?重复继承指某一个类对同一个类继承两次。下面举一个例子。
比如:
在这个例子中, 类E通过类对 (B,C)、(C,D)、(B,D)对类A重复继承。则ap_inhg_uri的值为3。ap_inhg_edge的值为6。所以URI_Ratio = (3 * 100) / 6 = 50.0
过多的重复继承会导致程序变的复杂,还可能发生函数命名冲突( 类E中的函数就可能会有命名冲突)。所以在组织程序时,提倡单继承,避免使用多继承类。
度量元名称:独立于类的函数的比率。
解释说明:
系统中非成员函数(独立于类的函数)占系统中函数总数的比率。
该度量元的计算公式为:
NMM_Ratio =( ( ap_func - ap_nmm ) / ap_func) * 100
其中:ap_func:系统中总的函数数量(包括游离于类之外的全局函数)。
ap_nmm :系统中各个类的成员函数的数量之和。
如果该度量元的值过大的话,说明该程序设计不符合面向对象的思想。
度量元名称:系统中每个函数的平均圈复杂度。
解释说明:
该度量元的计算公式为:
AVG_VG = ap_vg / ap_func
其中:ap_vg :系统中各函数的圈复杂度的总和(关于函数的圈复杂度的计算方法请参见〈〈Logiscope函数度量元〉〉文挡)。
ap_func:系统中函数的数量(包括成员函数和非成员函数)
如果该值过高,则说明系统中有大量函数的圈复杂度的值过高,也就是说系统中有大量过于复杂的函数。由于函数的复杂性过高,对于系统的维护工作是很不利的。
度量元名称: 递归调用的百分比。
解释说明:
该度量元的计算公式为:
其中:
ap_cg_cycle :函数调用流程图中递归调用的数量。
ap_cg_edge :函数调用流程图中边的数量。
度量元名称: 函数调用流程图的最大层次数。
解释说明:
在系统所有的函数调用流程图中,最大的层次数。