Ошибка цикломатической сложности в моем коде

Я получаю 2 ошибки в моем файле grunt

line 61 col 25 This function's cyclomatic complexity is too high. (10)

line 101 col 22 This function's cyclomatic complexity is too high. (10)

как я могу уменьшить сложность Cyclomatic в этом случае? мои функции не такие сложные

первая ошибка

    remove: function(line, row, type) {
      var spreadSelected = (row.spreadSelected && type === 'spread'),
        totalSelected = (row.totalSelected && type === 'total'),
        moneyLineSelected = (row.moneyLineSelected && type === 'moneyline'),
        lineValue;
      if (spreadSelected || totalSelected || moneyLineSelected) {
        switch (type) {
          case 'spread':
            lineValue = row.spread.line;
            break;
          case 'total':
            lineValue = row.total.line;
            break;
          case 'moneyline':
            lineValue = row.moneyLineId;
            break;
          default:
            break;
        }

        AuthFactory.getCustomer().then(function(credentials) {
          betSlipSelectionRequest('/betSlip/removeSelection', {
            customerId: credentials.customer,
            game: row.game,
            pair: row.pair,
            line: lineValue
          });
        });

        if (spreadSelected) {
          row.spreadSelected = false;
        }
        if (totalSelected) {
          row.totalSelected = false;
        }
        if (moneyLineSelected) {
          row.moneyLineSelected = false;
        }
      }
    }...

а затем 2-я функция ошибок

    add: function(line, row, type) {
      var spreadSelected = (row.spreadSelected && type === 'spread'),
        totalSelected = (row.totalSelected && type === 'total'),
        moneyLineSelected = (row.moneyLineSelected && type === 'moneyline'),
        lineValue;
      if (!(spreadSelected || totalSelected || moneyLineSelected)) {
        switch (type) {
          case 'spread':
            lineValue = row.spread.line;
            break;
          case 'total':
            lineValue = row.total.line;
            break;
          case 'moneyline':
            lineValue = row.moneyLineId;
            break;
          default:
            break;
        }
        AuthFactory.getCustomer().then(function(credentials) {
          betSlipSelectionRequest('/betSlip/addSelection', {
            customerId: credentials.customer,
            game: row.game,
            pair: row.pair,
            line: lineValue
          });
        });
        switch (type) {
          case 'spread':
            row.spreadSelected = true;
            break;
          case 'total':
            row.totalSelected = true;
            break;
          case 'moneyline':
            row.moneyLineSelected = true;
            break;
        }
      }
    }

вот что странно: эта ошибка только у меня, мой коллега открывает те же файлы и запускает grunt и в их терминалах ошибок нет.


person Non    schedule 10.04.2015    source источник
comment
Это может лучше подойти для codereview.stackexchange.com.   -  person Ian McLaird    schedule 11.04.2015


Ответы (1)


Способ уменьшить цикломатическую сложность функции состоит в том, чтобы разбить ее на несколько более мелких функций и распределить эту сложность на простые для понимания фрагменты. Например, вы можете извлечь свой оператор switch-case, что приведет к чему-то вроде этого:

remove: function(line, row, type) {
    var spreadSelected = (row.spreadSelected && type === 'spread'),
        totalSelected = (row.totalSelected && type === 'total'),
        moneyLineSelected = (row.moneyLineSelected && type === 'moneyline'),
        lineValue;
    if (!(spreadSelected || totalSelected || moneyLineSelected)) {
        lineValue = getLineValue(row, type);
    }
    // ... and so on, in reasonable chunks.
}

function getLineValue(row, type) {
    var lineValue;
    switch (type) {
        case 'spread':
            lineValue = row.spread.line;
            break;
        case 'total':
            lineValue = row.total.line;
            break;
        case 'moneyline':
            lineValue = row.moneyLineId;
            break;
        default:
            break;
    return lineValue;
}

Затем мы обнаруживаем, что вы также можете повторно использовать функцию getLineValue во втором блоке:

add: function(line, row, type) {
    var spreadSelected = (row.spreadSelected && type === 'spread'),
        totalSelected = (row.totalSelected && type === 'total'),
        moneyLineSelected = (row.moneyLineSelected && type === 'moneyline'),
        lineValue;

    if (!(spreadSelected || totalSelected || moneyLineSelected)) {
        lineValue = getLineValue(row, type);
    }
    // ... and so on
}

Таким образом, одним этим изменением вы перенесли сложность на другую функцию, а также полностью устранили некоторую сложность, устранив дублирование.

person Rosa    schedule 15.04.2015