【发布时间】:2013-03-18 14:34:22
【问题描述】:
考虑以下三个函数,它们都以相同的方式运行,使用不同的代码来实现相同的事情(示例是用 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。
标签: javascript cyclomatic-complexity