【问题标题】:What is the principle behind calculating the complexity of methods?计算方法复杂度的原理是什么?
【发布时间】:2013-03-06 17:37:42
【问题描述】:

Sonar Metrics complexity page开始,以下方法的复杂度为5。

public void process(Car myCar){          <- +1
        if(myCar.isNotMine()){               <- +1
             return;                         <- +1
        }
        car.paint("red");
        car.changeWheel();
        while(car.hasGazol() && car.getDriver().isNotStressed()){   <- +2
             car.drive();
        }
        return;
    }

这是该工具计算复杂度的方式:

增加复杂性的关键字:if、for、while、case、catch、 throw、return(这不是方法的最后一条语句)、&&、||、?

为什么case 语句、if 块和while 块会增加方法的复杂性?这种方法复杂度度量计算背后的直觉是什么?

【问题讨论】:

  • 因为他们做比较。 defaultfinally不要因为他们不做比较,因为比较是之前做过的。

标签: java sonarqube coding-style complexity-theory cyclomatic-complexity


【解决方案1】:

这是因为他们有条件增加the number of tests needed to ensure that the code is correct

也可能ifs 的复杂性低于循环(whilefor)。另请阅读与此相关的cyclomatic complexity

Read this blog post,它描述了无法测试所有内容的实际情况以及测试所有内容所需的测试数量。

【讨论】:

    【解决方案2】:

    也许它基于 McCabe 的 Cyclomatic Complexity(至少看起来像)。
    该指标广泛用于软件工程领域。
    看看这个:http://en.wikipedia.org/wiki/Cyclomatic_complexity

    【讨论】:

    • 因为它是衡量复杂性的可靠指标。软件工程领域的大多数论文都使用它,并且被证明是有效的。我建议你阅读 McCabe 的论文以获得更好的理解,或者看看这个:guru99.com/cyclomatic-complexity.html
    【解决方案3】:

    Somar 测量cyclomatic complexity,它表示通过源代码的线性独立路径的数量。

    回答你问题的关键来自research paper of Thomas McCabe, published in December of 1976

    可以证明,任何只有一个入口点和一个出口点的结构化程序的圈复杂度等于该程序中包含的决策点(即“if”语句或条件循环)的数量加一。

    这正是 Sonar 所做的:它找到来自循环、条件语句和多部分布尔表达式的决策点,并计算它们的数量。

    【讨论】:

    • 线性独立路径是什么意思?
    • @Geek 如果您将程序表示为连接决策点的无向边图,则不包含其他循环的循环被视为通过代码的线性独立路径。从答案链接的wiki页面的描述部分有漂亮的图片来说明它的含义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多