11

已经有一个关于什么是圈复杂度的问题?

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

代码的这两个指标有什么区别和相似之处?他们的典型接受值是什么?此外,我了解到,为了理解代码,基本圈复杂度是一个更相关的指标。而从实现的角度来看,圈复杂度是最相关的。如果是这样,为什么?

4

1 回答 1

15

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

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

那么这告诉我们什么呢?

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

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

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

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

CC <= 16 和 ECC <= 6

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

CC <= 10 和 ECC <= 4

于 2012-12-04T22:11:34.487 回答