圈复杂度 ######## .. note:: 圈复杂度 (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: 表示控制流图中节点的数量 .. figure:: https://img.zhaoweiguo.com/uPic/2022/08/847DFS.jpg 2. V (G)= 区域数 = 判定节点数 + 1 --------------------------------- 圈复杂度的计算还有更直观的方法,因为圈复杂度所反映的是 “判定条件” 的数量,所以圈复杂度实际上就是等于判定节点的数量再加上 1,也即控制流图的区域数。 .. image:: https://img.zhaoweiguo.com/uPic/2022/08/t23LKg.jpg 3. V (G)=R ---------- .. note:: R 代表平面被控制流图划分成的区域数。 .. image:: https://img.zhaoweiguo.com/uPic/2022/08/ezng4Q.jpg 计算方法 ======== .. figure:: 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} .. figure:: https://img.zhaoweiguo.com/uPic/2022/08/B1TZW3.jpg 使用上面各种图(if-else,While,until 和正常的流程)组成这个大图 圈复杂度的意义 ============== 一般来说圈复杂度大于 10 的方法存在很大的出错风险。圈复杂度和缺陷个数有高度的正相关:圈复杂度最高的模块和方法,其缺陷个数也可能最多。 参考 ==== * 详解圈复杂度: https://blog.csdn.net/huangjinjin520/article/details/121112719