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

Posted

技术标签:

【中文标题】如何阅读/改进 PHP 计算的 C.R.A.P 指数【英文标题】:How to Read / Improve C.R.A.P Index Calculated by PHP 【发布时间】:2011-06-11 12:47:35 【问题描述】:

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

【问题讨论】:

【参考方案1】:

基本上,它希望成为一种方法变更风险的预测器。

它有两个因素:

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

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

如果方法的覆盖率为 0%,那么在复杂性度量中,变更风险被认为是二级多项式(原因是,如果您无法测试代码路径的变更,则会增加损坏风险):@987654325 @

希望这会对您有所帮助。

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

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

【讨论】:

它没有考虑的一件事是依赖关系。一个简单的function example() $dep = new Dependency(); return $dep->someFunction(); function crappy($param) switch ($param) // 30 different cases with if-elses 更难测试(模拟逻辑可能很可怕,尤其是PHP)。【参考方案2】:

@Toader Mihai offered a solid explanation.(来自我的+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) 
    

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

其他资源:

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

Creators blog post about the crap index

以防万一:Cyclomatic complexity explained。如果您想知道,PHP_CodeSniffer 和 PHPMD 等工具会告诉您该数字。

虽然由您来决定什么数字是“好的”,但一个经常建议的数字(即有点高恕我直言)是 30 的废话索引,导致如下图:

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

【讨论】:

这是一张最多 5 个绿色、6-10 个黄色和超过 10 个红色的图像:i.imgur.com/wwX1TbZ.png @edorian .ods 链接已损坏。你有新的链接要提供吗? @Niko9911 更新了链接

以上是关于如何阅读/改进 PHP 计算的 C.R.A.P 指数的主要内容,如果未能解决你的问题,请参考以下文章

rpn值是指风险系数大的比风险系数的先改进,为啥

如何改进 Python C Extensions 文件行阅读?

alpha阶段个人总结

PHP如何在windows下获取计算机的cpu和内存

PHP如何实现快速排序?

PHP如何实现选择排序?