如何阅读/提高 PHP 计算的 C.R.A.P 指数

2022-08-30 08:31:37

我刚刚开始使用PHPUnit及其丰富多彩的代码覆盖率报告。我理解所有的数字和百分比,除了一个:C.R.A.P指数。任何人都可以给我一个坚实的解释,解释它的含义,如何分析它以及如何降低它?


答案 1

@Toader米哈伊提供了一个可靠的解释。(+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) {
    }
}

(只是一个微不足道的例子,你会找到更多的资源,我敢肯定)

其他资源:

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

关于垃圾指数的创作者博客文章

以防万一:解释了环形复杂性。PHP_CodeSniffer和PHPMD等工具会告诉您该数字,以防您想知道。

虽然由您来决定哪个数字是“好的”,但一个经常建议的数字(恕我直言,这是一个很小的高)是一个30的废话索引,导致这样的图表:

alt text(你可以在这里得到.ods文件: https://www.dropbox.com/s/3bihb9thlp2fyg8/crap.ods?dl=1 )


答案 2

基本上,它想成为一种方法改变风险的预测器。

它有两个因素:

  • 方法()的代码复杂性,即所述方法中存在多少个决策路径:。cyclomatic complexitycomp(m)
  • 该方法的可测试性如何(通过由代码覆盖率工具提供的自动测试)。基本上,这衡量的是所述代码中有多少决策是自动可测试的。

如果该方法具有 100% 的覆盖率,则认为更改的风险仅与方法的复杂性等效:。C.R.A.P.(m) = comp(m)

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

希望这会对您有所帮助。

我刚刚注意到我只提供半个答案(阅读部分)。如果您了解索引的推理,如何改进它应该非常清楚。但@edorian的答案给出了更清晰的解释。

简短的故事是:编写测试,直到你有接近100%的覆盖率,然后重构方法以降低循环复杂性。您可以在进行测试之前尝试重构,但根据实际方法的复杂性,如果您无法推理(由于所涉及的复杂性)您正在执行的更改的所有后果,则可能会引入中断。


推荐