软件复杂性
软件复杂性的基本概念
软件复杂性度量的参数很多,主要有:
- 规模,即总共的指令数,或源程序行数。
- 难度,通常由程序中出现的操作数的数目所决定的量来表示。
- 结构,通常用于程序结构有关的度量来表示。
- 智能度,即算法的难易程度。
软件复杂性主要表现在程序的复杂性。程序的复杂性主要指模块内程序的复杂性。它直接关联到软件开发费用的多少、开发周期长短和软件内部潜伏错误的多少。同时它也是软件可理解性的另一种度量。
软件复杂性的度量方法
代码行度量法
度量程序的复杂性,最简单的方法就是统计程序的源代码行数。此方法的基本考虑是统计一个程序的源代码行数,并以代码行数作为程序复杂性的质量。
McCabe度量法
McCabe度量法是由Thomas McCabe提出的一种基于程序控制流的复杂性度量方法。McCabe复杂性度量又称环路度量。它认为程序的复杂性很大程度上取决于程序的复杂性。单一的顺序结构最为简单,循环和选择所构成的环路越多,程序就越复杂。
这种方法以图论为工具,先画出程序图,然后用该图的环路数作为程序复杂性的度量值。程序图是退化的程序流程图。也就是说,把程序流程图的每一个处理符号都退化成一个结点,原来连接不同处理符号的流线变成连接不同结点的有向弧,这样得到的有向图就叫做程序图。
McCabe度量法使用例题
程序图仅描述程序内部的控制流程,完全不表现对数据的具体操作分支和循环的具体条件。
例子
强连通的有向图G中,环的个数V(G)由以下公式给出:
V(G)=m−n+2p
其中(1)公式含义:
- V(G)是有向图G中环路数
- m是图G中弧数
- n是图G中结点数
- p是图G中强连通分量个数
强连通图的p=1;也就是说2P=2;
在程序图G中,从程序图G的入口点总能到达图中任何一个结点,因此,程序总是连通的,但不是强连通的。为了使图成为强连通图,从图的入口点到出口点加一条用虚线【不计入计算的边数】表示的有向边,使图成为强连通图。
V(G)=13−11+2=4
可算出McCabe环复杂度度量值为4。这里选择的4个线形无关环路,其他任何环路都是这4个环路的线形组合。
利用McCabe环复杂度度量值时,有几点说明。
- 环路复杂度取决于程序控制结构的复杂度。当程序的分支数目或循环数目时其复杂度也增加。环路复杂度与程序中覆盖的路径条数有关。
- 环路复杂度是可增加的。例如,模块A的复杂度为3,模块B的复杂度为4,则模块A与模块B的复杂度是7。
- McCabe建议,对于复杂度超过10的程序,应分成几个小程序,以减少程序中的错误。
- 这种度量的缺点是:
- 对于不同种类的控制流的复杂度不能区分
- 简单IF语句与循环语句的复杂性同等看待。
- 嵌套IF语句与简单CASE的复杂性是一样的。
- 模块间接口当成一个简单分支一样处理。
- 一个具有1000行的顺序程序与一行语句的复杂性相同。