【问题标题】:JS Hint - Cyclomatic complexity number for this function & Don't make functions within a loopJS 提示 - 此函数的圈复杂度数 & 不要在循环中创建函数
【发布时间】:2015-08-20 12:57:01
【问题描述】:

JavaScript 不要在循环中创建函数并显示圈复杂度。 我无法绕过 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();
};

}

如何降低此函数的圈复杂度数为 12

【问题讨论】:

  • 通过编写不那么圈复杂的东西来降低圈复杂性。圈复杂度表明概念混乱。它也可以称为“意大利面条指数”。想一想问题以及它是如何分解的,并且可以由多个部分组成。然后写出每一段。然后将碎片组合起来。

标签: javascript


【解决方案1】:

好的,所以圈复杂度基本上是衡量通过函数的可能路径的数量。所以它乘以所有循环和条件。您有一个 for() 循环,其中包含一整堆嵌套的 if()else 块,所以是的,这将给出非常高的复杂度分数。

减少它的方法是将代码拆分为多个函数。每个功能都应完成部分工作,因此复杂度得分较低。由于复杂度会随着每个条件而增加,因此将它们拆分会导致几个函数的总复杂度要低得多。

具体如何分解功能取决于您,但一般建议是尽可能地分解它们;理想的功能是只做一件事,仅此而已。

【讨论】: