Как снизить когнитивную сложность вложенного 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();
}
Предполагая, что вы делаете одну и только одну вещь для каждого случая, вы можете попробовать расшифровать синтаксис:
- Для однострочных операторов фигурные скобки не нужны.
- Вы можете избежать
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;)