2017-10-19 9 views
4

シナリオ私は私の$type_id変数は、IDの特定のセットの1つであるかどうかを確認する必要がありサイクロマティック複雑スイッチ/ケースとの違いとin_array

可読性以外の理由もなく、私は

それらのほとんどは一般的なケースにダウンカスケード
switch($type_id) { 
    case Type::SOME_TYPE: 
    case Type::SOME_OTHER_TYPE: 
    ... 
     //do stuff 

と一緒に行きました。

しかし、これにより、PHPMDがうぬぼれ始めるまでの循環的複雑さが増します。

代わりにin_array()を使ってみましょう。

if (in_array($type_id, [ 
    Type::SOME_TYPE, 
    TYPE::SOME_OTHER_TYPE, 
    ... 
    ])) { 
    //do stuff 
} 

質問

この時点でPHPMDは文句を停止し、ちょうどin_array()機能の後ろに隠れて、まだそこに循環的複雑度ではないでしょうか?

答えて

3

はい。しかし、PHPMDのルールは、単一のメソッド/関数内のCCのためのルールです。コールグラフ全体にCCを適用しません。一般的に、PHPMD CCの警告は、独自のメソッドに分岐を抽出して解決できます。

注:replace the conditional with polymorphismを考慮してください。

+0

これは、CCが読み取り不能のために「混乱」としか考えられていないことを意味しますか? – Alec

+0

@Alecいいえ、必ずしも読みにくいというわけではありません。メソッド/関数について把握または推論できることの詳細。あるコードを通して多くの可能な分岐がある場合、この入力xに対して出力するのがより難しくなり、出力はyになります。これは、関数をカバーするために必要な単体テストの数に直接影響します。 Wikipediaの記事はかなり徹底的です:https://en.wikipedia.org/wiki/Cyclomatic_complexity – Gordon

関連する問題