次の3つの関数を考えてみましょう。これらはすべて同じように動作し、異なるコードを使用して同じことを実現します(例はJavaScriptで記述されており、JavaScriptに適用される回答に特に関心がありますが、この質問は実際にはどの関数にも当てはまります。同様の構造を持つ言語):
// Random number from 0-9
var x = Math.floor(Math.random() * 10);
// JSHint reports a cyclomatic complexity of 3
function a() {
if (x === 0) {
return "First";
} else if (x === 1 || x === 2) {
return "Second";
}
return "Third";
}
// JSHint reports a cyclomatic complexity of 4
function b() {
switch (x) {
case 0:
return "First";
case 1:
case 2:
return "Second";
default:
return "Third";
}
}
// JSHint reports a cyclomatic complexity of 1
function c() {
return x === 0 ? "First" : x === 1 || x === 2 ? "Second" : "Third";
}
// All three functions return the same value
console.log(a(), b(), c());
JSComplexityツールは、3つの関数すべての複雑度が4であると報告します。これは、フォールスルーステートメントと同様に、演算子が||
独立したブランチとして扱われることを意味します。case
JSHintは演算子を気にしていないようですが||
、フォールスルーcase
ステートメントを同じように処理します。条件演算子が完全に間違っているようです。
循環的複雑度を計算する場合、フォールスルーcase
ステートメントと論理「または」演算子を独立したブランチとして扱う必要がありますか?三元条件についてはどうですか(これはもっと簡単だと思います。この場合、JSHintは明らかに間違っています)。上記の3つの関数はすべて、同じ循環的複雑度を持つ必要がありますか?