计算方法复杂性的原理是什么?

时间:2013-03-06 17:37:43

标签: java coding-style complexity-theory sonarqube

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(这不是方法的最后一个陈述),&amp;&amp;,||,?

为什么 case 语句,如果块和,而块会增加方法的复杂性?这个度量计算方法的复杂性背后的直觉是什么?

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

  

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

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