考慮以下三個函數,它們的行爲都是相同的,使用不同的代碼實現相同的事情(例子用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工具報告的所有三個功能有4複雜性,這意味着||
運營商作爲獨立的分支處理,因爲是秋天 - 通過case
聲明。 JSHint似乎並不關心||
運算符,但它確實能夠以相同的方式處理後續的case
語句。它似乎讓條件操作符完全錯誤。
在計算圈複雜度時,應該將下降的case
語句和邏輯「或」運算符視爲獨立分支?三元條件怎麼樣(我認爲這更簡單,JSHint在這種情況下顯然是錯誤的)?以上所有三個功能都具有相同的圈複雜度嗎?
僅供參考,JSHint現在報告所有這三個功能有4. – JLRishe 2017-11-03 20:06:08