Как снизить когнитивную сложность вложенного if

У меня есть оператор if, настроенный следующим образом

      if (A && B) {
   // do something 1
} else {
   if (B) {
      // set some boolean to false
   } 
   // do something 2
}

Мне интересно, могу ли я снизить когнитивную сложность? Сейчас это 4 балла.

5 ответов

Установка логического значения сначала может настроить более четкое if / else

      if(!A && B) {
  // set some boolean to false
}

if (A && B) {
  // do something 1
} else {
  // do something 2
} 

Другая стратегия - как можно скорее отказаться от функций

например

      if(X) {
  // do stuff

  return;
} 

if(Z)
{
  // do different stuff
  return; 
}

// do default stuff
return;

Это позволяет читателю отбросить логику, выходящую за рамки интересующих его условий.

Наконец, вы также можете создавать функции с осмысленными именами, а не комментариями.

      if(X) {
  return doSomething2();
} 

Я бы сказал, что лучший способ снизить когнитивную сложность - это использовать функции. Это похоже на исходный ответ @GuerricP, но обрабатывает множественный случай do somthing 2

например.

      function doSomething2() {}

if (A && B) {
  // do something 1
} else if (B) {  
  // set some boolean to false
  doSomething2();
} else {
  doSomething2();
}

Это снижает сложность, потому что не очевидно, что в вашей исходной версии есть 2 маршрута для doSomething2.

Я считаю, что это правильный и самый чистый способ.

      const DoSomething = function(){}

if (A && B) {
} 
else if (B) {  
DoSomething();
} 
else {
 DoSomething();
}

Ну, у вас может быть только один уровень глубины:

Предполагая, что вы делаете одну и только одну вещь для каждого случая, вы можете попробовать расшифровать синтаксис:

  1. Для однострочных операторов фигурные скобки не нужны.
  2. Вы можете избежать if, else ifи т. д. с досрочным возвратом
      const run = (a, b) => {
  if (a && b) return fun1();
  if (a) return fun2();
  if (b) return fun3();
  return fun4();
}

В этом случае я предпочитаю использовать вложенные троичные файлы. Что-то, что обычно считается «плохой практикой» создателями инструментов и лидерами общественного мнения в отрасли, но я думаю, что при правильном отступе они предлагают больше возможностей для избавления от беспорядка:

      const run = (a, b) =>
  ( a && b ? fun1()
  : a      ? fun2()
  : b      ? fun3()
           : fun4());

Конечно YMMV;)

Другие вопросы по тегам