【问题标题】:What is the difference between Cyclomatic Complexity and Essential Cyclomatic Complexity?圈复杂度和基本圈复杂度有什么区别?
【发布时间】:2012-10-29 16:31:32
【问题描述】:

What is Cyclomatic Complexity?已经有问题了

但是,还有另一个术语 - 基本圈复杂度。

这两个指标的代码有何异同?他们的典型接受值是什么? 另外,我了解到,为了理解代码,基本圈复杂度是一个更相关的指标。而从实现的角度来看,循环复杂性是最相关的。 如果是这样,为什么?

【问题讨论】:

  • 快速浏览一下 wikipedia(大概你已经看过这个了?)ECC 在有效地忽略“结构良好”的流量控制位之后似乎是 CC,if-elseforwhile 等。这将使更难以推理的控制结构的权重更高...breakgotothrow 等。它不会减少实现完整测试所需的工作量覆盖范围,例如; CC 在这方面仍然很重要。这是你的意思,还是我错过了什么?
  • @Rook 是的,我浏览过 wiki。我不关心这里的测试覆盖率。可以说,我得到了一个代码,并且被要求通过逆向工程对相同的模型(例如 UML 图)进行相同的建模,什么对我更相关? ECC还是CC?我在某处读到 ECC 对于理解代码和 CC 实现更相关。
  • 就个人而言,我会说“两者都不是”。在处理软件开发时,从项目管理的角度来看,我认为两者都很有趣。除此之外(例如,在对现有系统进行建模时)它们似乎只是好奇心。

标签: language-agnostic cyclomatic-complexity


【解决方案1】:

众所周知,Cyclometric Complexity 有效地衡量了通过方法或函数的可能独立路径的数量。这告诉我们要测试的方法有多复杂。

然而,基本圆周复杂度表明,一旦我们消除了结构良好的复杂度,还剩下多少复杂度。结构良好的复杂性的一个示例是 for 循环,其中循环的条件在循环开始时声明。但是,如果我们使用 break 语句跳出循环,例如在路径中间的某个地方,我们会破坏我们的结构化组件。类似的情况是我们在单个函数中有许多 return 语句。

那么这告诉我们什么?

想象一下,我们有一个 CC 很高的函数:一个难以测试的函数。现在,如果此功能的基本 CC 较低,则意味着很容易将此功能分解为其他更易于单独测试的较小功能。当基本复杂性很高时,这种重构会更困难,因为复杂性更难理解。

因此,具有高基本复杂性的代码意味着他的代码更难维护和理解。我们可以说这段代码质量较低。复杂度高的代码更难测试,但一般来说,当基本复杂度较低时,我们可以更轻松地对此进行测试。

使用什么值总是有争议的,并且在一定程度上取决于应用程序的类型和使用的语言。例如,在函数内部抛出异常会使该函数变得非结构化。显然,正确使用的例外被认为是一种好的做法。类似地,在函数顶部验证参数并立即返回是一种常见做法(在我看来)可以产生更清晰的代码。这又是一个非结构化的结构。所以我们可以想象我们可以接受基本复杂性的基本水平。

我个人对 .NET 或 Java 中的企业风格应用程序的限制是:

CC

对于在 C/C++ 中说的更“复杂”的应用程序,我会提出更严格的限制:

CC

【讨论】:

  • 我相信 Visual Studio 中的代码度量结果没有提供与基本圈复杂度相关的详细信息。据我从您的帖子中了解到的,基本的圈复杂度不能从圈复杂度中推断出来。有哪些方法可以获得基本圈复杂度的数字?
  • @RBT - 没错。我所知道的唯一计算 Essential CC 的工具是 McCabe IQ (mccabe.com/iq.htm)。但是我已经很多年没有看过了
猜你喜欢
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多