【问题标题】:Simple Cyclomatic Complexity Calulations简单的圈复杂度计算
【发布时间】:2025-10-19 22:00:03
【问题描述】:

我找到了this site claiming thatCyclomatic Complexity = ( 2 + ifs + loops +cases - return ),我还发现循环复杂度可以通过条件语句的数量+1来计算,基本相同。

现在上面指出,对于 switch 中的每个案例,循环复杂度都增加了 +1,如果我在每个案例中都有一个 return 语句会发生什么?

例如下面代码的 CC 还是 4 还是 2?

function(someVal) {
switch (someVal) {
    case 1: return something;
    case 2: return something;
    case 3: return something;
        doSomething();
        break;
    default:
        doSomethingElse();
        break;
}

}

【问题讨论】:

    标签: cyclomatic-complexity


    【解决方案1】:

    圈复杂度是通过程序的线性独立路径的数量。换句话说 从入口点到出口点有多少条不同的路径。这反过来又是一个指标 关于底层程序的复杂程度,并给出了完整的测试用例数量的下限 模块的路径覆盖(这里的全路径覆盖意味着每行代码至少执行一次)。

    有几种方法可以计算通过程序的路径数,大多数基于图论。其中许多有 已总结为简单的计数规则,例如您正在使用的规则。

    现在回答您的具体问题。你的程序的圈复杂度是多少?考虑程序结构图:

    这张图表有多少条路径?使用边数我们有以下路径:

      1, 2
      1, 3, 4
      1, 3, 5, 6, 7
      1, 3, 5, 8, 9
    

    这个程序有 4 条线性独立的路径。圈复杂度为 4。

    假设一个结构化程序(结构图中没有交叉线),还有其他方法可以得出相同的结果:

     edges - nodes + 2 = 9 - 7 + 2 = 4
     Number of enclosed spaces in the structure chart plus 1 (3 + 1 = 4)
    

    圈复杂度的原始定义是:v(G) = E - N + 2P。其中 E = 边,N = 节点,P = 模块数(图)。自从 我们通常将圈复杂度应用于单个模块,P 几乎总是 1。

    【讨论】: