JavaScript不要在循环中制作函数并显示Cyclomatic复杂性。 我无法解决JSHint的错误消息。这是我正在使用的循环:
var keys = document.querySelectorAll('#calculator span');
var operators = ['+', '-', 'x', '÷'];
var decimalAdded = false;
for (var i = 0; i < keys.length; i++) {
keys[i].onclick = function (e) {
var input = document.querySelector('.screen');
var inputVal = input.innerHTML;
var btnVal = this.innerHTML;
if (btnVal === 'C') {
input.innerHTML = '';
decimalAdded = false;
} else if (btnVal === '=') {
var equation = inputVal;
var lastChar = equation[equation.length - 1];
equation = equation.replace(/x/g, '*').replace(/÷/g, '/');
if (operators.indexOf(lastChar) > -1 || lastChar === '.'){
equation = equation.replace(/.$/, '');
}
if (equation){
input.innerHTML = (new Function('return ' + equation))();
}
decimalAdded = false;
} else if (operators.indexOf(btnVal) > -1) {
var lastChar = inputVal[inputVal.length - 1];
if (inputVal !== '' && operators.indexOf(lastChar) === -1){
input.innerHTML += btnVal;
}
else if (inputVal === '' && btnVal === '-'){
input.innerHTML += btnVal;
}
if (operators.indexOf(lastChar) > -1 && inputVal.length > 1) {
input.innerHTML = inputVal.replace(/.$/, btnVal);
}
decimalAdded = false;
} else if (btnVal === '.') {
if (!decimalAdded) {
input.innerHTML += btnVal;
decimalAdded = true;
}
} else {
input.innerHTML += btnVal;
}
e.preventDefault();
};
}
如何减少此函数的Cyclomatic复杂度数为12
答案 0 :(得分:1)
好的,因此圈复杂度基本上是通过函数的可能路径数量的度量。所以它会增加所有循环和条件。您已经有一个for()
循环,其中包含一大堆嵌套的if()
和else
块,所以是的,这将给出非常大的复杂性分数。
减少它的方法是将该代码分成多个函数。每个功能都应该完成部分工作,因此复杂性得分较低。因为复杂性与每个条件相乘,所以将它们分开将导致几个函数具有低得多的总复杂度。
你究竟如何分解这些功能取决于你,但一般的建议是尽可能地分解它们;理想的功能是只做一件事的功能,仅此而已。