什么是Cyclomatic Complexity?

Mic*_*tum 69 language-agnostic architecture cyclomatic-complexity

我不时看到的一个术语是"Cyclomatic Complexity".在这里,我看到了一些关于"如何计算语言X的CC"或"如何使用最小CC量来做Y"的问题,但我不确定我是否真的理解它是什么.

NDepend网站上,我看到了一个解释基本上是"方法中的决策数量.每个if,for,&&等等都给CC增加+1"得分.)真的是吗?如果是,为什么是这很糟糕?我可以看到,人们可能希望保持if语句的数量相当低,以保持代码易于理解,但这真的是它的一切吗?

还是有一些更深层的概念呢?

Gre*_*g D 52

我不知道更深层的概念.我相信它通常被认为是在可维护性指数的背景下.特定方法中的分支越多,维护该方法操作的心理模型(通常)就越困难.

具有较高圈复杂度的方法也更难以在单元测试中获得完整的代码覆盖.(谢谢Mark W!)

当然,这带来了可维护性的所有其他方面.错误/回归的可能性等等.不过,核心概念非常简单.

  • 此外,更难以进行单元测试并获得完整的代码覆盖率. (9认同)
  • 方法的圈复杂度还表示实现该方法的100%代码覆盖所需的单元测试用例的数量. (4认同)

Tet*_*Oni 38

Cyclomatic复杂度衡量您必须执行具有不同参数的代码块的次数,以便执行该块的每个路径.较高的计数是不好的,因为它增加了逃避测试策略的逻辑错误的机会.


Nir*_*ali 12

Cyclocmatic complexity = Number of decision points + 1
Run Code Online (Sandbox Code Playgroud)

决策点可能是你的条件语句,如if,if ... else,switch,for循环,while循环等.

下图描述了应用程序的类型.

  • Cyclomatic Complexity位于1 - 10被认为是正常应用

  • Cyclomatic Complexity在11 - 20中等应用

  • Cyclomatic Complexity位于21 - 50危险的应用程序

  • Cyclomatic Complexity超过50不稳定的应用程序

  • *"Cyclocmatic复杂度=决策点数+ 1"*对于我尝试的所有情况,它似乎都适用.我只有一个问题:当我们需要`decision_points + 1`时,我们为什么要烦扰流程图和公式呢?(无论如何,感谢这种非常简单的方法!) (4认同)

azh*_*lov 11

维基百科可能是您的朋友:圈复杂度的定义

基本上,你必须想象你的程序的控制流图,然后

复杂性(...)定义为:

M = E ? N + 2P
Run Code Online (Sandbox Code Playgroud)

哪里

  • M =圈复杂度,
  • E =图的边数
  • N =图的节点数
  • P =连接组件的数量

CC是一个概念,它试图捕捉程序的复杂程度以及在单个整数中测试程序的难度.


小智 7

是的,就是这样.代码可以执行的执行路径越多,必须测试的内容就越多,错误的概率就越高.


ste*_*r25 5

我听到的另一个有趣的观点是:

您的代码中缩进最大的位置应具有最高CC。这些通常是确保测试覆盖率的最重要领域,因为预计它们将更难以阅读/维护。正如其他答案所指出的那样,这些也是确保覆盖率的更困难的代码区域。