主页

索引

模块索引

搜索页面

圈复杂度

备注

圈复杂度 (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: 表示控制流图中节点的数量
https://img.zhaoweiguo.com/uPic/2022/08/847DFS.jpg

2. V (G)= 区域数 = 判定节点数 + 1

圈复杂度的计算还有更直观的方法,因为圈复杂度所反映的是 “判定条件” 的数量,所以圈复杂度实际上就是等于判定节点的数量再加上 1,也即控制流图的区域数。

https://img.zhaoweiguo.com/uPic/2022/08/t23LKg.jpg

3. V (G)=R

备注

R 代表平面被控制流图划分成的区域数。

https://img.zhaoweiguo.com/uPic/2022/08/ezng4Q.jpg

计算方法

https://img.zhaoweiguo.com/uPic/2022/08/27OAwo.jpg

典型的控制流程,如 if-else,While,until 和正常的流程

示例:

 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}
https://img.zhaoweiguo.com/uPic/2022/08/B1TZW3.jpg

使用上面各种图(if-else,While,until 和正常的流程)组成这个大图

圈复杂度的意义

一般来说圈复杂度大于 10 的方法存在很大的出错风险。圈复杂度和缺陷个数有高度的正相关:圈复杂度最高的模块和方法,其缺陷个数也可能最多。

参考

主页

索引

模块索引

搜索页面