Как я могу уменьшить цикломатическую сложность, чтобы код был приемлемым для сонара - PullRequest
0 голосов
/ 17 октября 2019

Эта функция не работает должным образом в гидролокаторе

1 Ответ

2 голосов
/ 17 октября 2019

Упрощенный подход к метрике цикломатической сложности Сонара заключался бы в том, «сколько логических ветвей и циклов мне нужно понять, чтобы понять эту функцию?»Есть несколько подходов, которые вы можете предпринять:

  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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...