如何读取/改善由PHP计算的CRAP指数

我刚开始使用PHPUnit和丰富多彩的代码覆盖率报告。 我知道所有的数字和百分比除了一个:CRAP指数。 任何人都可以给我一个很好的解释,它是什么意思,如何分析它,以及如何降低它?

@ Mihai @Toader提供了一个坚实的解释。 (从我+1)

如何降低它:

写较不复杂的代码或编写更好的testing代码。 (见下图)

更好的testing代码?

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

较不复杂的代码?

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

// 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这样的工具会告诉你,如果你想知道的数字。

虽然这是你决定什么数字是“好”,人们通常build议的数字(这是一个小高的恕我直言)是废话索引30导致这样一个图表:

替代文字 (你可以在这里获得.ods文件: http : //dl.dropbox.com/u/3615626/stackoverflow/crap.ods )

基本上它想成为方法变化风险的预测因子。

它有两个因素:

  • 该方法的代码复杂性( cyclomatic complexity ),即在所述方法中存在多less个判定path: comp(m)
  • 该方法的可testing性如何(通过代码覆盖工具提供的自动化testing)。 基本上这是测量在所述代码中的多less个决定是可自动testing的。

如果该方法的覆盖率为100%,则认为变化风险仅与方法的复杂性相当: CRAP(m) = comp(m)

如果该方法的覆盖率为0%,则在复杂性度量中被认为是二级多项式的风险(推理是如果不能testing代码path的变化会增加破坏的风险): CRAP(m) = comp(m)^2 + comp(m)

希望这会帮助你。

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

简言之:写testing,直到你有接近100%的覆盖率,然后重构减less圈复杂度的方法。 您可以尝试在进行testing之前进行重构,但根据实际的方法复杂性,如果您无法推理(由于涉及的复杂性),您正在做的更改的所有后果将导致破坏。