java - 在计算圈复杂度时,退出当前方法/函数的语句应该是它的一部分吗?

标签 java c metrics cyclomatic-complexity

当然,这可能不仅仅适用于 C 和 Java,但这是我比较熟悉的两种语言,所以让我们举一个简单的例子:

int foo(int arg)
{
    if (arg > 0)
        return 1;
    return 0;
}

现在,就return而言,我看到了两种解释:

  • 这是一个“不同的代码路径”,因为它退出了方法;因此,任何 return 语句都应该将复杂度增加 1。在这种情况下,上面的示例代码的复杂度为 3;或
  • return 只是退出方法,没有理由将其计入。在这种情况下,上面的示例代码的复杂度为 1。

就圈复杂度而言,是否有任何高于“正确”、规范的解释?我倾向于支持后一种情况,但我不是 CS 理论家......

最佳答案

该代码在函数中有两条不同的路径:一条对应于 arg > 0 为真,另一条对应于它为假。

所涉及的 return 语句的数量对此没有影响,因为它不会改变通过函数的不同路径的数量。您的代码可以重写为

int foo(int arg)
{
     int retval = 0;
     if (arg > 0) retval = 1;
     return retval;
}

尽管少了一个 return 语句,但它具有完全相同数量的路径。

关于java - 在计算圈复杂度时,退出当前方法/函数的语句应该是它的一部分吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31699326/

相关文章:

java - Play框架的模板引擎中是否有 "instanceof"功能?

c - 是否可以在文本文件中定义指向字符的指针?

tensorflow - TF 2.3.0 使用带有样本权重的 tf 数据集训练 keras 模型不适用于指标

azure - Azure 中的存储消耗报告

c - 如何在读取文件时倒回到行首。 C

java - Flink webUI 中的 "No Metrics "

java - 如何以 application/x-www-form-urlencoded 格式向 HTTPURLConnection 中的 POST 调用添加正文

java - HTML 报告中的 JasperReports SVG 图表

java - Android EditText 验证

c++ - 将值从 Xcode 中的运行脚本传递到编译