在计算圈复杂度时,是否应该退出当前方法/函数的语句?

时间:2015-07-29 11:34:52

标签: 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理论家......

2 个答案:

答案 0 :(得分:3)

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

所涉及的返回语句数量不会影响该数量,因为它不会更改通过该函数的不同路径的数量。您的代码可以重写为

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

具有完全相同的路径数,尽管返回语句少一个。

答案 1 :(得分:1)

你的圈复杂度将是2,原因如下:

您的代码基本上是这样的:

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

普通return陈述不计入复杂性。您只有1 if个语句,没有if else个语句。因此,您的圈复杂度将为2,因为主路径有1条备用路径。 如果返回语句计数,那么同一方法的圈复杂度可能是3 OR 4(参见我的代码与你的代码),这应该清楚为什么不包含return语句。