考虑以下三个函数,它们的行为都是相同的,使用不同的代码实现相同的事情(例子用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