程序复杂程度的定量度量总述
详细设计阶段设计出的模块质量可以使用软件设计的基本原理和概念进一步仔细衡量它们的质量。但是,这种衡量毕竟只能是定性的,人们希望能进一步定量度量软件的性质。
定量度量程序复杂程度的作用:
把程序的复杂程度乘以适当常数即可估算出软件中错误的数量以及软件开发需要用的工作量;
定量度量的结果可以用来比较两个不同的设计或两个不同算法的优劣;
程序的定量的复杂程度可以作为模块规模的精确限度。
一、McCabe方法
1. 流图
McCabe方法根据程序控制流的复杂程度定量度量程序的复杂程度,这样度量出的结果称为程序的环形复杂度。
所谓流图实质上是“退化了的”程序流程图,它仅仅描绘程序的控制流程,完全不表现对数据的具体操作以及分支或循环的具体条件。
流图的表示:
结点:用圆表示,一个圆代表一条或多条语句。
边:箭头线称为边,代表控制流。在流图中一条边必须终止于一个结点,即使这个结点并不代表任何语句。
区域:由边和结点围成的面积称为区域,包括图外部未被围起来的区域。
![8UQTMU3R`I$]O34P@DN}38S.png](https://p.ananas.chaoxing.com/star3/origin/5fe6f47ee465518e5471ed093d298467.png)
映射方法:
任何方法表示的过程设计结果,都可以翻译成流图。
对于顺序结构,一个顺序处理序列和下一个选择或循环的开始语句,可以映射成流图中的一个结点。

对于选择结构,开始语句映射成一个结点;两条分支至少各映射成一个结点;结束映射成一个结点。

对于循环结构,开始和结束语句各映射成一个结点。
![6TAXTB91F5DU0{D8FSM]CYT.png](https://p.ananas.chaoxing.com/star3/origin/0241d5086adfb2411889df2d108ff8c2.png)
当过程设计中包含复合条件时,应该把复合条件分解为若干个简单条件,每个简单条件对应流图中一个结点。
所谓复合条件,就是在条件中包含了一个或多个布尔运算符(逻辑OR,AND,NAND,NOR)。

![S57LPD])CS6RUDKCFO)YU{0.png](https://p.ananas.chaoxing.com/star3/origin/d2da88a092533f0966c71a04163ab0b0.png)
2. 计算环形复杂度的方法
环形复杂度定量度量程序的逻辑复杂度。有了描绘程序控制流的流图之后,可以用下述3种方法中的任何一种来计算环形复杂度V(G)。
V(G)=流图中的区域数
V(G)=E-N+2(其中E是流图中的边数,N是结点数)
V(G)=P+1(其中P是流图中判定结点的数目 )

3. 环形复杂度的用途
■定量度量程序内分支数或循环个数,即程序结构的复杂程度;
■定量度量测试难度;
■能对软件最终的可靠性给出某种预测。
■实践表明,模块规模以V(G)≤10为宜。
三、Halstead方法
Halstead方法根据程序中运算符和操作数的总数来度量程序的复杂程度。
令N1为程序中运算符出现的总次数,N2为操作数出现的总次数,程序长度N定义为:
N=N1+N2
程序中使用的不同运算符(包括关键字)的个数n1,以及不同操作数(变量和常数)的个数n2。预测程序长度的公式如下:
H = n1 log2n1 + n2 log2n2
预测程序中包含错误的个数的公式如下:
E = N log2 (n1+n2)/3000

