考虑以下三个函数,它们都以相同的方式运行,使用不同的代码来实现相同的事情(示例是用 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 在这种情况下显然是错误的)?上述所有三个函数都应该具有相同的圈复杂度吗?