如何阅读/改进PHP计算的CRAP指数

Lev*_*ith 69 php phpunit unit-testing

我刚开始使用PHPUnit及其丰富的代码覆盖率报告.我理解除了一个之外的所有数字和百分比:CRAP索引.任何人都可以给我一个可靠的解释,它是什么意思,如何分析它以及如何降低它?

edo*_*ian 105

@Toader Mihai提供了一个可靠的解释.(+1来自我)

如何降低它:

编写不太复杂的代码或编写更好的测试代码.(见下图)

更好的测试代码?

在这种情况下,这只意味着:更高的代码覆盖率,通常会导致编写更多测试.

代码不太复杂?

例如:将您的方法重构为较小的方法:

// Complex
function doSomething() {
    if($a) {
        if($b) {
        }
        if($c) {
        }
    } else {
        if($b) {
        }
        if($c) {
        }
    }
}

// 3 less complex functions
function doSomething() {
    if($a) {
        doA();
    } else {
        doNotA();
    }
}

function doA() {
    if($b) {
    }
    if($c) {
    }
}

function doNotA() {
    if($b) {
    }
    if($c) {
    }
}
Run Code Online (Sandbox Code Playgroud)

(只是一个简单的例子,你会找到更多的资源,我敢肯定)

其他资源:

首先,让我提供一些额外的资源:

创作者关于垃圾索引的博客文章

以防万一:解释了循环复杂性.像PHP_CodeSniffer和PHPMD这样的工具会告诉你这个数字,以防你想知道.

虽然它是你决定什么数字是"好",一个经常建议的数字(这是一个小高的imho)是一个30的垃圾索引导致这样的图形:

替代文字 (您可以在此处获取.ods文件:https://www.dropbox.com/s/3bihb9thlp2fyg8/crap.ods?dl = 1)

  • 这是一张最多 5 个绿色、6-10 个黄色和 10 个以上红色的图像:http://i.imgur.com/wwX1TbZ.png (2认同)

Mih*_*der 62

基本上,它希望成为方法变更风险的预测指标.

它有两个因素:

  • 方法的代码复杂度(cyclomatic complexity)也就是说在所述方法中存在多少个决策路径:comp(m).
  • 该方法有多可测试(通过自动化测试,由代码覆盖工具提供).基本上,这可以衡量所述代码中有多少决策是可自动测试的.

如果该方法具有100%的覆盖率,则认为变化的风险仅与方法的复杂性相同:C.R.A.P.(m) = comp(m).

如果该方法的覆盖率为0%,则变更风险被认为是复杂性度量中的二级polinoomial(推理如果您无法测试代码路径,则会增加其破坏风险): C.R.A.P.(m) = comp(m)^2 + comp(m)

希望这会对你有所帮助.

我只是注意到我只提供了半答案(阅读部分).如果你理解索引的推理,那么如何改进它应该很清楚.但在@ edorian的回答中给出了一个更明确的解释.

简短的故事是:编写测试直到你有接近100%的覆盖率,然后重构这些方法来降低圈复杂度.您可以在进行测试之前尝试重构,但如果您无法推断(因为涉及复杂性)您正在进行的更改的所有后果,则根据实际方法的复杂性,您可能会引入破损.