📜  复杂度指标

📅  最后修改于: 2021-08-24 16:31:05             🧑  作者: Mango

如果仅按每单位时间的代码行来衡量,生产率可能会变化很大,具体取决于要开发的系统的复杂性。与简单的应用程序相比,程序员将为高度复杂的系统程序生成更少的代码。同样,复杂性对维护程序的成本也有很大的影响。为了量化复杂性,而超出了可以构造或理解程序的容易程度的模糊概念,需要一些度量来衡量程序的复杂性。

复杂度度量是一种循环复杂度,其中模块的复杂度是模块流程图中独立循环的数量。已经提出了许多用于量化程序的复杂性的度量,并且已经进行了研究以将复杂性与维护工作相关联。在本文中,我们将讨论一些复杂性度量。其中大多数是在程序的上下文中提出的,但是它们也可以应用或适用于详细设计。

规模度量复杂度度量试图捕获理解模块的难度。换句话说,它试图量化程序的认知方面。众所周知,通常,模块越大,理解起来就越困难。因此,模块的大小可以作为模块复杂性的简单度量。可以看出,平均而言,随着模块大小的增加,其中的决策数量可能会增加。平均而言,这意味着随着尺寸的增加,环复杂性也会增加。尽管很明显两个相同大小的程序可能具有实质上不同的复杂性,但是总的来说,大小与某些复杂性度量有很强的关系。

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)max(P,Q)> MAX( a,b)min(a,b)min(p,q)

使用结构化结构确定程序的数时可能会出现问题。一种方法是将这样的程序转换为明确显示控制转移的程序,然后计算数。尽管可以使用流程图获得边界,但是可以将基本方案推广到流程图。

拓扑复杂度
已经提出了对结构的嵌套敏感的复杂性度量。像循环复杂度一样,它基于模块或程序的流程图。程序的复杂度被认为是最大的相交数min。

为了计算最大的相交,将流程图转换为强连接图(通过绘制从终端节点到初始节点的箭头)。紧密连接的图将图分为有限数量的区域。区域数为(边-节点+ 2)。如果我们绘制一条仅一次进入每个区域的线,则该线与图形中的圆弧相交的次数为最大相交最小值min,这被认为是程序的复杂性。