什么是Cyclomatic Complexity?

时间:2009-05-26 16:43:52

标签: language-agnostic architecture cyclomatic-complexity

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

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

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

15 个答案:

答案 0 :(得分:52)

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

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

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

答案 1 :(得分:36)

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

答案 2 :(得分:12)

Cyclocmatic complexity = Number of decision points + 1

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

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

  • Cyclomatic Complexity在1 - 10被认为是正常 applicatinon

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

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

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

答案 3 :(得分:11)

维基百科可能是您的朋友:Definition of cyclomatic complexity

基本上,您必须将您的程序想象为control flow graph然后

  

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

M = E − N + 2P
     

,其中

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

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

答案 4 :(得分:7)

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

答案 5 :(得分:4)

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

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

答案 6 :(得分:3)

Cyclomatic Complexity真的只是一个可怕的流行语。实际上,它是软件开发中使用的代码复杂性的度量,用于指出更复杂的代码部分(更可能是错误的,因此必须经过仔细和彻底的测试)。您可以使用E-N + 2P公式计算它,但我建议您通过插件自动计算。我听说过一条经验法则,你应该努力将CC保持在5以下,以保持代码的良好可读性和可维护性。

我刚刚在我的Java项目上尝试了Eclipse Metrics Plugin,它有一个非常简洁的帮助文件,它当然会与您的常规Eclipse帮助集成,您可以阅读更多复杂的定义有关改进代码的措施,提示和技巧。

答案 7 :(得分:2)

就是这样,我们的想法是,具有低CC的方法具有较少的分叉,循环等,这些都使得方法更复杂。想象一下,使用分析器查看500,000行代码,并查看几种具有更高CC级别的方法。这使您可以专注于重构这些方法以便更好地理解(高CC通常具有较高的错误率)

答案 8 :(得分:2)

例程中的每个决策点(循环,开关,if等等)基本上归结为if语句等价物。对于每个if,您可以使用2个代码路径。因此,第一个分支有2个代码路径,第二个有4个可能的路径,第3个分支有8个,依此类推。至少有2 **个N代码路径,其中N是分支数。

这使得很难理解代码的行为,并在N增长超过一些小数字时对其进行测试。

答案 9 :(得分:2)

到目前为止提供的答案没有提到软件质量与圈复杂性的相关性。研究表明,具有较低的圈复杂度指标应该有助于开发更高质量的软件。它可以帮助提高可读性,可维护性和可移植性的软件质量属性。通常,应该尝试获得5-10之间的圈复杂度度量。

使用像圈复杂度等指标的原因之一是,一般来说,人类只能在大脑中同时跟踪大约7条(正负2条)信息。因此,如果您的软件过多地使用多个决策路径,则您不太可能可视化软件的行为方式(即,它将具有较高的圈复杂度指标)。这很可能导致开发错误或错误的软件。有关此内容的详情,请访问here以及Wikipedia

答案 10 :(得分:2)

使用控制流程图计算循环复杂度。通过程序源代码的线性独立路径的定量测量数称为Cyclomatic Complexity(if / if else / for / while)

答案 11 :(得分:1)

考虑你的功能的control flow graph,从出口到入口有一条额外的边缘。圈复杂度是我们可以在不将图分成两部分的情况下进行的最大切割次数。

例如:

function F:
    if condition1:
       ...
    else:
       ...
    if condition2:
       ...
    else:
       ...

Control Flow Graph

Control Flow Graph

您可以直观地了解链接图的圈复杂度为3的原因。

答案 12 :(得分:1)

Cyclomatric复杂性基本上是一个度量标准,用于确定需要更多可维护性的代码区域。它基本上是重构的输入。 它肯定表明代码改进区域在避免深度嵌套循环,条件等方面。

答案 13 :(得分:1)

就是这样。但是,“case”或“switch”语句的每个分支往往计为1.实际上,这意味着CC 讨厌 case语句,以及任何需要它们的代码(命令处理器,状态机,等)。

答案 14 :(得分:0)

循环复杂度是衡量一个软件单元的复杂程度的一种度量。它度量程序使用条件逻辑构造(如果,同时,用于,开关和情况等)可能遵循的不同路径的数量。如果您想了解有关计算的更多信息,请观看https://www.youtube.com/watch?v=PlCGomvu-NM

精彩的youtube视频

这在设计测试用例时很重要,因为它揭示了程序可以采用的不同路径或方案。 “为了具有良好的可测试性和可维护性,McCabe建议 程序模块的循环复杂度不应超过10“(Marsic,2012,p。232)。

参考: Marsic.I。(2012年9月)。 软件工程。罗格斯大学。取自www.ece.rutgers.edu/~marsic/books/SE/book-SE_marsic.pdf