圈复杂度¶
备注
圈复杂度 (Cyclomatic Complexity, 简称‘CYC’) 是一种代码复杂度的衡量标准,在 1976 年由 Thomas J. McCabe, Sr. 提出。它是对源代码中决策 (decision) 数量的计数,计数越高,代码越复杂。 软件源码某部分的圈复杂度就是这部分代码中线性无关路径的数量。
如果一段源码中不包含控制流语句(条件或决策点),那么这段代码的圈复杂度为 1,因为这段代码中只会有一条路径;如果一段代码中仅包含一个 if 语句,且 if 语句仅有一个条件,那么这段代码的圈复杂度为 2;包含两个嵌套的 if 语句,或是一个 if 语句有两个条件的代码块的圈复杂度为 3。
计算方法¶
1. V (G)=e-n+2p¶
公式计算圈复杂度 (CYC):
CYC = E – N + 2P
P = 表示连接组件数目(即几个单独的流程图: 如一个调用程序和一个子程序)
E = Edge: 表示控制流图中边的数量
N = Node: 表示控制流图中节点的数量
2. V (G)= 区域数 = 判定节点数 + 1¶
圈复杂度的计算还有更直观的方法,因为圈复杂度所反映的是 “判定条件” 的数量,所以圈复杂度实际上就是等于判定节点的数量再加上 1,也即控制流图的区域数。
3. V (G)=R¶
备注
R 代表平面被控制流图划分成的区域数。
计算方法¶
示例:
1void sort(int * A)
2{
3 int i=0;
4 int n=4;
5 int j = 0;
6 while(i < n-1)
7 {
8 j = i +1
9 while(j < n)
10 {
11 if (A[i] < A[j])
12 swap(A[i], A[j]);
13 }
14 i = i + 1
15 }
16}
圈复杂度的意义¶
一般来说圈复杂度大于 10 的方法存在很大的出错风险。圈复杂度和缺陷个数有高度的正相关:圈复杂度最高的模块和方法,其缺陷个数也可能最多。