Рассмотрите следующие три функции, которые все ведут себя одинаковым образом, используя другой код для достижения того же самого (примеры написаны на JavaScript, и меня особенно интересуют ответы, применимые к JavaScript , но этот вопрос действительно может применить к любому языку с подобными конструкциями):Cyclomatic сложность логически аналогичного кода
// 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 явно ошибается в этом случае)? Должны ли все три функции выше иметь такую же цикломатическую сложность?
FYI, JSHint теперь сообщает все три из этих функций, чтобы иметь сложность 4. – JLRishe