уменьшить сложность условий - PullRequest
1 голос
/ 09 апреля 2020

У меня есть одна функция, в которой есть условия ififif и сложность цикломатике c приближается к 5. Как ее уменьшить?

function testFunc() {
    var step = getModel('step');
    if(step === 1) {
        this.resetTask(); //calling some function
        this.updateStep(0);
        return true;
    } else if(step === 2) {
        this.initTask; //some other function
        return true;
    } else if(step === 3) {
        this.name === 'add' ? this.add() : this.edit();
        return true;
    }
    return false;
}

попытался заменить регистр коммутатора, но это не помогло ,

Ответы [ 3 ]

3 голосов
/ 09 апреля 2020

Очень простой рефакторинг - удалите все условные логи c, которые у вас есть, и извлеките каждый фрагмент как отдельную функцию в карту. Поскольку вы выполняете только одну ветку каждый раз, в зависимости от step, вы можете сделать это значение ключом и выбрать то, что должно быть выполнено. Затем вы можете предоставить запасной вариант для случаев, когда нет ничего, что соответствует step.

Теперь сложность цикломати c равна 2, поскольку ветки кода располагаются только в одном месте - либо вы найдете соответствующий обработчик для step, либо нет. Кроме того, ветвление на шаге 3 теперь является совершенно отдельной функцией, поэтому его не нужно считать частью testFunc

function testFunc() {
  var step = getModel('step');

  var steps = {
    1: function() {
      this.editTask(); //calling some function
      this.updateStep(0);
      return true;
    },
    2: function() {
      this.initTask; //some other function
      return true;
    },
    3: function() {
      this.name === 'add' ? this.add() : this.edit();
      return true;
    },
    default: function() { 
      return false; 
    }
  };

  var fn = steps[step] || steps.default;

  return fn();
}
3 голосов
/ 09 апреля 2020

Это уменьшит сложность вашего кода и сделает его более читабельным. Вы можете разделить свое условие на несколько функций и прикрепить эту функцию к условному объекту. здесь я передаю это в качестве аргумента, но вы можете использовать другой подход. здесь я также дал значение этого только для того, чтобы запустить пример. скопируйте и вставьте в ваш редактор и попробуйте.

function meaningfulFuncName1() {
  this.editTask(); //calling some function
  this.updateStep(0);
  return true;
}

function meaningfulFuncName2() {
  this.initTask; //some other function
  return true;
}

function meaningfulFuncName3(context) {
  context.name === 'add' ? context.add() : context.edit();
  return true;
}

function defaultCase() {
  return false;
}

function testFunc() {
  this.name = 'add'
  const step = getModel('step')
  conditionObject = {
    1: meaningfulFuncName1,
    2: meaningfulFuncName2,
    3: meaningfulFuncName3,
    default: defaultCase
  }
  return conditionObject[step](this);
}
0 голосов
/ 09 апреля 2020

Для меня изменение этого слова делает его менее сложным для понимания. Хотя для некоторых будет менее читабельным. И немного быстрее.

function testFunc() {
 var step = getModel('step');
 if(step==1){this.editTask(); this.updateStep(0); return true;} 
 if(step==2){this.initTask; return true;} 
 if(step==3){this.name==='add' ? this.add() : this.edit();return true;}
 return false;
}
...