web-dev-qa-db-ja.com

PHPによって計算されるC.R.A.Pインデックスの読み方/改善方法

PHPUnitとそのカラフルなコードカバレッジレポートの使用を開始しました。すべての数値とパーセンテージが1つを節約することを理解しています:C.R.A.Pインデックス。誰も私にそれが何を意味するのか、それを分析する方法とそれを下げる方法についてしっかりした説明を提供できますか?

71
Levi Hackwith

@ Toader Mihaiはしっかりした説明を提供しました。 (+1から私)

それを下げる方法:

それほど複雑でないコードを書くORより適切にテストされたコードを書く(下のグラフを参照)

テスト済みのコード?

このコンテキストでは、これは単に次のことを意味します。より高いコードカバレッジであり、通常はより多くのテストを記述します。

複雑なコードが少ない?

例:メソッドを小さいものにリファクタリングします。

// 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

104
edorian

基本的に、それはメソッドの変更のリスクの予測因子になりたいです。

これには2つの要素があります。

  • メソッドのコードの複雑さ(_cyclomatic complexity_)別名、メソッドに存在する決定パスの数:comp(m)
  • その方法はどのようにテスト可能ですか(コードカバレッジツールによって提供される自動テストを介して)。基本的に、これは、コード内で自動的にテスト可能な決定の数を測定します。

メソッドのカバレッジが100%の場合、変更のリスクは、メソッドの複雑さのみと同等であると見なされます:C.R.A.P.(m) = comp(m)

メソッドのカバレッジが0%の場合、変更のリスクは複雑さの尺度の2次のポリノミアルであると見なされます(理由は、コードパスを変更できない場合、変更の危険性が高まるためです):C.R.A.P.(m) = comp(m)^2 + comp(m)

うまくいけば、これはあなたを助けるでしょう。

私は半分の答え(読み取り部分)しか提供していないことに気づきました。インデックスの推論を理解していれば、それを改善する方法はかなり明確になるはずです。しかし、はるかに明確な説明が @ edorian's answer に示されています。

短い話は次のとおりです。カバレッジがほぼ100%になるまでテストを記述し、その後メソッドをリファクタリングして循環的複雑度を減らします。テストを行う前にリファクタリングを試みることもできますが、実際のメソッドの複雑さによっては、(複雑さが伴うため)行っている変更のすべての結果を推論できない場合、破損が発生するリスクがあります。

61
Mihai Toader