Java 中的环形复杂度

10 Sept 2024 | 5 分钟阅读

Java 中的代码管理是一个你可能熟悉的 có học thuật. 它涉及如何组织源代码,以便在维护过程中能够更轻松地处理。除了其他时间复杂度外,这种圈复杂度是根据程序的控制流计算的。

例如:如果一个程序没有控制语句,那么该程序的圈复杂度被认为是 1。

文件名: CyclomaticComplexity.java

输出

Inside the main method.

分析: 该程序只有一个打印语句,没有控制语句或决策语句,因此该程序的圈复杂度为 1。

计算圈复杂度的公式

通常,计算圈复杂度的公式如下:

因此,根据上述公式,我们也可以找到上面编写的程序的圈复杂度。上面编写的程序中的决策点总数为零。请注意,打印语句不是决策语句。因此,根据公式

示例

让我们看一些例子并计算其圈复杂度。

示例 - 1

文件名: CyclomaticComplexity1.java

输出

Inside the foo method.

分析: 该程序有一个决策点,即 if 条件,因此应用圈复杂度公式,我们得到

圈复杂度 = 1 + 1 = 2。2 表示有两种控制流。一种通过 if 语句体,另一种通过 else 块。

示例 - 2

文件名: CyclomaticComplexity2.java

输出

Inside the first if-condition.
Inside the foo method.

分析: 在上面的情况下,决策点的数量是 3。因此,根据公式,我们得到圈复杂度如下:

圈复杂度 = 3 + 1 = 4。4 表示有四种控制流。第一个通过第一个 if 语句体,然后是第二个 if 语句体。第二个流通过第一个 if 语句体,然后是 else 块。第三个流通过第二个 if 语句体,第四个流通过 else 块。

示例 - 3

文件名: CyclomaticComplexity3.java

输出

Inside the first if-condition.
Inside the foo method.

分析: 在上面的情况下,圈复杂度可以计算为决策点总数加上逻辑运算符总数再加上 1。只有一个决策点,因为只有一个 if 条件。此外,还有三个逻辑运算符,两个 || 和一个 &&。因此,圈复杂度可以计算为:

圈复杂度 = 1 + 3 + 1 = 5,这意味着有五种控制流。一种是当 n.equals(n1) 为真时,if 条件体执行。第二种是当 n.equals(n1) 为假,n.equals(n2) 为真时,if 条件体执行。第三种是当 n.equals(n1) 为假,n.equals(n2) 也为假时,逻辑 && 运算结果为真,if 条件体执行。第四种是当 n.equals(n1) 为假,n.equals(n2) 也为假时,&& 运算符的第一个操作数为假,if 条件体不执行。第五种是当 n.equals(n1) 为假,n.equals(n2) 也为假时,&& 运算符的第一个操作数为真,但第二个操作数为假,if 条件体不执行。

各种决策点

有各种决策点会使圈复杂度增加 1。

  • || 和 &&
  • for, do, while
  • ?: (三元运算符), if-else
  • Switch, case 语句, catch。

开发人员或程序员应以能够降低圈复杂度的方式编写代码。

降低圈复杂度的好处

以下是降低圈复杂度的一些好处。

  • 代码的耦合度降低。圈复杂度值越高,代码的耦合度越大。高度耦合代码的缺点是难以修改。
  • 当圈复杂度增加时,代码的理解难度也会增加。这是因为控制路径的数量也增加了,这可能导致更多意外的结果。
  • 更高的圈复杂度意味着需要测试的案例更多。例如,如果一个方法的圈复杂度为 12,那么这意味着该方法有 12 条独立的路径,并且所有这 12 条路径都需要进行探索。因此,降低圈复杂度意味着减少测试用例,使软件或程序的测试变得容易。

计算圈复杂度的工具

以下是计算圈复杂度的工具。

  • Findbugs
  • Checkstyle
  • Sonar
  • Cobertura
  • Jarchitect

在代码的构建生命周期中,可以集成这些工具。

圈复杂度的优缺点

在本教程中,我们将讨论圈复杂度的优缺点。让我们先从优点开始。

优点

  • 圈复杂度可以作为质量指标,考虑到不同设计的相对复杂性。
  • 它还可以作为衡量最小的努力和适合测试的重点领域的指标。
  • 易于应用
  • 为测试目的提供指导

缺点

  • 圈复杂度仅提供有关控制流复杂性的信息,而没有提供有关时间复杂度的信息。
  • 在此复杂度中,嵌套条件的解析比非嵌套条件更困难。
  • 即使对于简单的决策结构和比较,它也可能给出一个误导性的数字。

圈复杂度的用法

以下是圈复杂度的用法。

  • 圈复杂度确定了对测试人员和开发人员有用的独立路径执行次数。
  • 它确保每条路径至少被验证一次。
  • 它有助于关注未覆盖的路径。
  • 评估与程序相关的风险。
  • 提高代码覆盖率。