此功能在 Sonar 中未按预期工作
最佳答案
Sonar 的圈复杂度度量的简化思考方式是“我必须推理多少个逻辑分支和循环才能理解这个函数?”您可以采取以下几种方法:
- 拆分您的功能。如果函数正在执行多项操作,请尝试将每项操作拆分为自己的函数
- 减少代码中的分支。很多时候,if/else 语句可以改为条件赋值。
循环复杂度甚至没有涵盖代码中难以遵循的其他一些事情:
- 您经常复制段代码,而不是将内容存储在临时变量中。重复代码不仅会让阅读代码的人有更多的工作要做,而且还意味着您迫使程序做这些额外的工作。
- 由于您自始至终都在使用
var
,因此阅读代码的人必须查看整个函数才能知道变量是否会在不同点重新分配。当某些内容不会改变时使用const
让我们知道是否不必再担心这个问题。 - 您的一些 if 语句条件很复杂。尝试将它们重构为更具可读性的临时变量。
这是我降低圈复杂度和代码可读性的尝试:
function validateSignInForm(signinErrorMessage) {
let bFinalSubmit = true;
if (!validateFields()) {
bFinalSubmit = false;
}
const errMainError = (typeof signinErrorMessage === 'undefined')
? configuration.messages.signinIncomplete;
: signinErrorMessage;
if (errMainError === configuration.messages.notFound) {
trp.fai.common.log(errMainError);
bFinalSubmit = false;
}
const errMsg = $('#signin-mainerr-message');
const errContainer = $('#signin-ui-notification-container-mainerr');
if (!bFinalSubmit) {
errMsg.html(errMainError);
errContainer.show();
} else {
errMsg.html('');
errContainer.hide();
}
return bFinalSubmit;
}
function validateFields() {
let canSubmit = true;
configuration.required.signin.forEach(field => {
const fieldName = field.name;
const fieldValue = $.trim(field.value);
const fieldElement = $('#' + fieldName);
const fieldLabel = fieldElement
.closest('li')
.find('label')
if (
(fieldValue === '' || (fieldName === 'username' && fieldValue === 'Your email address'))
&& $('#' + field.id).is(':visible')
) {
fieldElement.addClass('ui-red-border');
fieldLabel.addClass('ui-red-text');
canSubmit = false;
} else {
fieldElement.removeClass('ui-red-border');
fieldLabel.removeClass('ui-red-text');
$('#' + fieldName + 'Field').removeClass('registerFieldError');
if (configuration.required.signin[i].onchange) {
configuration.required.signin[i].onchange();
}
}
});
return canSubmit;
}
关于javascript - 如何降低圈复杂度以使代码可以被 Sonar 接受,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58422976/