从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;
}
这是该工具计算复杂度的方式:
Keywords incrementing the complexity: if, for, while, case, catch,
throw, return (that is not the last statement of a method), &&, ||, ?
为什么case语句,if块和while块会增加方法的复杂性?这种方法复杂度的度量计算的直觉是什么?
解决方法:
这是因为它们中的条件会增加the number of tests needed to ensure that the code is correct.
如果ifs的复杂度低于循环(while,for),则可能也是如此.另请阅读与此有关的cyclomatic complexity.
Read this blog post,它描述了无法测试所有内容的实际情况以及测试所有内容所需的大量测试.