如果仅按每单位时间的代码行来衡量,生产率可能会变化很大,具体取决于要开发的系统的复杂性。与简单的应用程序相比,程序员将为高度复杂的系统程序生成更少的代码。同样,复杂性对维护程序的成本也有很大的影响。为了量化复杂性,而超出了可以构造或理解程序的容易程度的模糊概念,需要一些度量来衡量程序的复杂性。
复杂度度量是一种循环复杂度,其中模块的复杂度是模块流程图中独立循环的数量。已经提出了许多用于量化程序的复杂性的度量,并且已经进行了研究以将复杂性与维护工作相关联。在本文中,我们将讨论一些复杂性度量。其中大多数是在程序的上下文中提出的,但是它们也可以应用或适用于详细设计。
规模度量:复杂度度量试图捕获理解模块的难度。换句话说,它试图量化程序的认知方面。众所周知,通常,模块越大,理解起来就越困难。因此,模块的大小可以作为模块复杂性的简单度量。可以看出,平均而言,随着模块大小的增加,其中的决策数量可能会增加。平均而言,这意味着随着尺寸的增加,环复杂性也会增加。尽管很明显两个相同大小的程序可能具有实质上不同的复杂性,但是总的来说,大小与某些复杂性度量有很强的关系。
Halstead的衡量标准: Halstead还根据他的软件科学提出了许多其他衡量标准。其中一些可以被认为是复杂性度量。已经定义了许多变量来解释这一点。它们分别是n1 (唯一运算符的数量), n2 (唯一操作数的数量), N1 (运算符的总频率)和N2 (操作数的总频率)。由于任何程序都必须至少具有两个运算符:一个用于函数调用,一个用于语句结尾,因此,由于程序中运算符的数量较大,因此n1 / 2的比率可以被认为是相对难度。比率N2 / n2表示使用操作数的平均次数。在更频繁地更改变量的程序中,该比率将更大。由于此类程序较难理解,因此易于阅读或编写的定义为:
Halstead的复杂度度量以及McCabe的复杂度度量着重于模块的内部复杂度。因此,模块与其环境的连接的复杂性不是很重要。用Halstead的方法来说,模块与其环境的联系体现在操作数和运算符。调用另一个模块被视为一个运算符,所有参数都被视为该运算符的操作数。
实时变量:在计算机程序中,典型的赋值语句仅使用和修改一些变量。但是,一般而言,语句具有更大的上下文,即,为了构造或理解语句,程序员必须跟踪许多变量,而不是直接在语句中使用的变量。对于一条语句,此类数据项称为实时变量。直观地讲,语句的活动变量越多,理解程序就越困难。因此,活动变量的概念可以用作程序复杂性的度量。
首先,让我们更精确地定义活动变量。变量在模块内从其第一个引用到最后一个引用都被认为是活动的,包括引用该变量的第一个和最后一个语句之间的所有语句。使用此定义,可以通过分析模块的代码轻松地计算每个语句的活动变量集。确定实时变量的过程可以很容易地实现自动化。
对于语句,活动变量的数量表示语句的难易程度。通过定义活动变量的平均数量,可以将其扩展到整个模块。活动变量的平均数量是活动变量(对于所有可执行语句)的数量之和除以可执行语句的数量。这是模块的复杂性度量。
实时变量是从数据使用的角度定义的。没有明确包含模块的逻辑。该逻辑仅用于确定变量的第一个和最后一个引用声明。因此,这种复杂性的概念与循环复杂性完全不同,后者完全基于逻辑并将数据视为次要。
另一个面向数据使用的概念是span ,即变量两次连续使用之间的语句数。如果在模块的N个不同位置引用了一个变量,则该变量存在(N – 1)个span 。平均范围大小是变量的两个连续引用之间的可执行语句的平均数量。跨度较大意味着程序的读者必须在较长的时间内(或更多的语句)记住变量的定义。换句话说,可以将跨度视为一种复杂性度量;跨度越大,模块越复杂。
结数:已经提出了一种基于程序的控制传递的位置来量化复杂度的方法。它主要是为FORTRAN程序设计的,在该程序中,使用goto语句显示了明确的控制权转移。程序员为了理解给定的程序,通常会从控制权转移的点画箭头,以帮助创建程序和控制权转移的思路。根据此度量标准,这些箭头越交织,程序就越复杂。这个概念体现在打结的概念中。
结实质上是两个这样的控制传递箭头的交点。如果程序中的每个语句都写在单独的行上,则可以按以下方式将该概念形式化。对(a,b)表示从a线到b线的跳跃。两周跳(A,B)和(P,Q)产生一个结如果任一分钟(A,B)<分钟(P,Q)
使用结构化结构确定程序的结数时可能会出现问题。一种方法是将这样的程序转换为明确显示控制转移的程序,然后计算结数。尽管可以使用流程图获得边界,但是可以将基本方案推广到流程图。
拓扑复杂度:
已经提出了对结构的嵌套敏感的复杂性度量。像循环复杂度一样,它基于模块或程序的流程图。程序的复杂度被认为是最大的相交数min。
为了计算最大的相交,将流程图转换为强连接图(通过绘制从终端节点到初始节点的箭头)。紧密连接的图将图分为有限数量的区域。区域数为(边-节点+ 2)。如果我们绘制一条仅一次进入每个区域的线,则该线与图形中的圆弧相交的次数为最大相交最小值min,这被认为是程序的复杂性。