软件复杂度和圈复杂度

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32653877/article/details/85232708

作者:翁松秀


软件复杂度和圈复杂度

软件复杂度

1,起源与应用

  • 成立于1976的McCabe & Associates公司开发出了McCabe Cyclomatic Complexity Metric(McCabe圈复杂度)技术对软件进行结构测试
  • McCabe复杂度是对软件结构进行严格的算术分析得来的,实质上是对程序拓扑结构复杂性的度量,明确指出了任务复杂部分。
  • McCabe复杂度能帮助工程师识别难以测试和维护的模块,已经成为评估软件质量的一个重要标准。
  • McCabe复杂度可以为软件开发过程中平衡成本、进度和性能提供指导

2,McCabe复杂度分类
在这里插入图片描述

(1)圈复杂度(Cyclomatic Complexity (v(G)) )
概念: 圈复杂度用来衡量一个模块的复杂程度
计算方法: 一个模块控制流图有e条边,n个节点,它的圈复杂度v(G) = e - n + 2。
在这里插入图片描述

(2)基本复杂度(Essential Complexity (ev(G)) )
概念: 基本复杂度用来衡量程序非结构化程度
计算方法: 将模块控制流图中的结构化部分简化成节点,计算简化后控制流图的圈复杂度就是基本复杂度。

(3)模块设计复杂度(Module Design Complexity (iv(G)) )
概念: 模块设计复杂度用来衡量模块之间的调用关系,复杂度越高,模块之间耦合性越高,越难隔离,维护和复用。
计算方法: 从模块控制流图中移去那些不包含调用子模块的判定循环结构后得到的圈复杂度。模块设计复杂度通常远小于圈复杂度。

(4)设计复杂度(Design Complexity (S0) )
概念: 用来衡量程序模块之间的相互作用关系。
计算方法: 程序中所有模块设计复杂度之和。
在这里插入图片描述

(5)集成复杂度(Integration Complexity (S1) )
概念: 集成测试的数量表示,也是程序中独立线性子树的数目。
计算方法: S1=S0-N+1, N是程序中模块的数目。

(6)行数(Number of Lines (nl) )
概念: 模块中总的代码行数,包括注释。

(7)规范化复杂度(Normalized Complexity (nv) )
概念: 规范化复杂度是圈复杂度和行数的比。
计算方法: nv=v(G)/nl

(8)全局数据复杂度

(9)局部数据复杂度

(10)病态数据复杂度

圈复杂度

概念: 衡量一个模块的复杂程度,数量上表现为独立路径的条数,也就是合理预防错误所需测试的最少路径条数。圈复杂度以软件的控制流图为基础。经验表明,程序的可能错误和高的圈复杂度有很大的关系,McCabe & Associates建议圈复杂度到10。过于复杂的模块容易出错,难于理解、测试、更正,所以应当在软件开发的各个阶段有意识地限制复杂度。
计算方法一: 一个模块控制流图有e条边,n个节点,它的圈复杂度v(G) = e - n + 2。
在这里插入图片描述
计算方法二: v(G)=判定节点数+1。对于多分支的CASE结构IF-ELSEIF-ELSE结构,要求必须统计全部实际的判定节点数,也即每个ELSEIF语句,以及每个CASE语句,都应该算为一个判定节点。
在这里插入图片描述
计算方法三: v(G)=R。其中,R代表平面被控制流图划分成的区域数。
在这里插入图片描述

方法总结:

  • 针对程序的控制流图计算圈复杂度V(G)时,最好还是采用公式v(G)=e-n+2;
  • 针对模块的控制流图时,可以直接统计判定节点数,这样更为简单;
  • 针对复杂的控制流图时,使用区域计算公式v(G)=R更为简单。

猜你喜欢

转载自blog.csdn.net/qq_32653877/article/details/85232708