我时常看到的一个术语是“环复杂度”。在这里,我看到了一些关于“如何计算 X 语言的 CC”或“如何用最少的 CC 来完成 Y”的问题,但我不确定我是否真的理解它是什么。

NDepend 网站, ,我看到一个解释,基本上是“方法中的决策数量。每个 if、for、&& 等。CC“分数”增加+1)。真的是这样吗?如果是,为什么这很糟糕?我可以看到,人们可能希望将 if 语句的数量保持在相当低的水平,以使代码易于理解,但这真的意味着一切吗?

还是有什么更深层次的概念?

有帮助吗?

解决方案

我不知道一个更深层次的概念。我相信这是一般的维修性指标的背景下考虑。越是分支有一个特定的方法中,更困难的是保持这种方法的操作(一般)的心理模型。

具有更高秩复杂度

方法也更难以得到在单元测试全码覆盖。 (感谢马克W¯¯!)

这带来了可维护性的所有其他方面,当然。错误的可能性/回归/等等。的核心概念是相当直接的,虽然。

其他提示

圈复杂测量的次数则必须以通过该块执行每一路径具有不同参数执行的代码块。较高的计数是不好的,因为它增加了逻辑错误的机会逃离你的测试策略。

Cyclocmatic complexity = Number of decision points + 1

决策点可能是您的条件语句,例如 if、if … else、switch、for 循环、while 循环等。

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

  • 循环复杂度为 1 - 10  被认为是正常的 申请

  • 圈复杂度为 11 – 20  中等应用

  • 圈复杂度为 21 – 50  有风险的应用

  • 圈复杂度超过 50  应用不稳定

维基百科可能是你在这方面的朋友: 圈复杂度的定义

基本上,您必须将您的程序想象为 控制流程图 进而

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

M = E − N + 2P

在哪里

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

CC 是一个试图捕获程序的复杂程度以及用单个整数测试它的难度的概念。

是的,这是真正的。你的代码可以采取更多的执行路径,更多的事情,都必须经过测试和错误的概率较高。

另一个有趣的一点我听说:

与最大缩进在你的代码的地方应该有最高的CC。这些通常是,以保证测试的覆盖,因为它的预期,他们会更难读/维持的最重要领域。作为其他的答案注意,这些也都是代码的更困难的区域,以确保覆盖范围。

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

我最近刚刚尝试过 Eclipse 指标插件 在我的 Java 项目上,它有一个非常漂亮和简洁的帮助文件,当然它会与您的常规 Eclipse 帮助集成,并且您可以阅读各种复杂性度量的更多定义以及改进代码的提示和技巧。

就是这样,这个想法是,它具有低的CC的方法具有更少的叉,循环等等,所有使方法更加复杂。试想一下,回顾50万行的代码,用分析仪又看见有更高数量级的CC奥德一对夫妇的方法。这可让那么你专注于重构的方法更好地理解(这也是常见的高CC有很高的错误率)

在一个例程(循环,开关,如果,等...)的每个判定点基本上归结为一个if语句等效。对于每个if你有2个codepaths可以采取的。因此与第一分支有2条代码路径,与第二有4条可能的路径,与所述第三有8等。有至少2条** N的代码路径,其中N是支链的数量。

此使得难以了解的代码的行为和当N增长超过一些少数对其进行测试。

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

使用圈复杂度等指标的原因之一是,一般来说,人类只能在大脑中同时跟踪大约 7 条(正负 2)条信息。因此,如果您的软件过于复杂且具有多个决策路径,您不太可能能够可视化您的软件的行为方式(即它将具有高圈复杂度度量)。这很可能会导致开发出错误或漏洞百出的软件。有关此的更多信息可以找到 这里 还有关于 维基百科.

圈复杂度使用控制流图来计算。的线性独立的路径定量测量的通过程序的源代码的数量被称为圈复杂度(如果/当别的/对/时间)

Cyclomatric复杂基本上是一个度量弄清楚的,需要更多的注意力放在了可维护性码区域。这将是基本的输入到重构。 这肯定给出了避免深嵌套循环,条件等方面改进代码区域的指示。

这是排序的吧。然而,“壳体”或“交换机”语句的每个分支趋于计数为1。在实际上,这意味着CC 憎恨 case语句,并在需要它们(命令处理器,状态机的任何代码,等)。

考虑控制流图时,与另外的边缘从出口运行到门口。圈复杂度是切口我们可以使无图形分离成两片的最大数目。

例如:

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

“控制流图”

控制流图

您或许可以直观地看到为什么链接图有3圈复杂度。

Cyclomatric复杂度是一个软件单元is.It测量不同的路径的数目如何复杂的程序可能与条件逻辑的构建体按照(如果,而对于,开关及箱等....)的量度。如果你会喜欢更多地了解这里计算它是一个美妙的YouTube视频,你可以看 HTTPS ://www.youtube.com/watch v = PlCGomvu-NM

有在设计测试用例,因为它揭示了不同的路径或场景中的程序可以采取重要的。 “要具有良好的可测试性和可维护性,麦凯布建议 没有一个程序模块应该超过10" 圈复杂度(Marsic,2012年,第232页)。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top