javascript - 如何降低圈复杂度以使代码可以被 Sonar 接受

标签 javascript sonarqube

此功能在 Sonar 中未按预期工作

最佳答案

Sonar 的圈复杂度度量的简化思考方式是“我必须推理多少个逻辑分支和循环才能理解这个函数?”您可以采取以下几种方法:

  1. 拆分您的功能。如果函数正在执行多项操作,请尝试将每项操作拆分为自己的函数
  2. 减少代码中的分支。很多时候,if/else 语句可以改为条件赋值。

循环复杂度甚至没有涵盖代码中难以遵循的其他一些事情:

  1. 您经常复制段代码,而不是将内容存储在临时变量中。重复代码不仅会让阅读代码的人有更多的工作要做,而且还意味着您迫使程序做这些额外的工作。
  2. 由于您自始至终都在使用 var,因此阅读代码的人必须查看整个函数才能知道变量是否会在不同点重新分配。当某些内容不会改变时使用 const 让我们知道是否不必再担心这个问题。
  3. 您的一些 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/

相关文章:

java - SonarQube CLI 扫描仪无法保留堆

jenkins - Sonarqube 质量门不向 jenkins 发送 webhook

JavaScript 在子类中设置构造函数?

javascript - jQuery 字符串分割问题

maven-2 - 在没有外部访问的情况下执行 "mvn sonar:sonar"

java - 何时以及如何增加版本号(Maven、Java、Sonar)?

git - 在 Jenkins 中使用多个 git 分支进行 Sonar 分析

javascript - 如何使用 "Are you sure you want to proceed"模式在 Rails 中使用是和没有按钮来完成或停止保存按钮操作?

javascript - 使用函数参数查找和对象键值对?

c# - Javascript onkeyup 事件(如何在我的代码中提及箭头键)