如何降低嵌套if的认知复杂度
How to reduce cognitive complexity of nested if
我有一个这样设置的 if 语句
if (A && B) {
// do something 1
} else {
if (B) {
// set some boolean to false
}
// do something 2
}
我想知道我是否可以降低认知复杂度?现在这是 4 分。
好吧,你可以像这样只有一层深度:
function originalImplementation(A, B) {
if (A && B) {
console.log("do something 1");
} else {
if (B) {
console.log("set some boolean to false");
}
console.log("do something 2");
}
}
function newImplementation(A, B) {
if (A && B) {
console.log("do something 1");
}
else if (B) {
console.log("set some boolean to false");
}
if (!A || !B) {
console.log("do something 2");
}
}
console.log("originalImplementation");
originalImplementation(0, 0);
originalImplementation(0, 1);
originalImplementation(1, 0);
originalImplementation(1, 1);
console.log("newImplementation");
newImplementation(0, 0);
newImplementation(0, 1);
newImplementation(1, 0);
newImplementation(1, 1);
先设置布尔值可以设置得更清楚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;
这允许 reader 忽略超出他们感兴趣的条件的逻辑
最后,您还可以使用有意义的名称而不是注释来创建函数
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
语句不需要花括号
- 您可以避免
if
、else if
等,并提前 return
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 ;)
我有一个这样设置的 if 语句
if (A && B) {
// do something 1
} else {
if (B) {
// set some boolean to false
}
// do something 2
}
我想知道我是否可以降低认知复杂度?现在这是 4 分。
好吧,你可以像这样只有一层深度:
function originalImplementation(A, B) {
if (A && B) {
console.log("do something 1");
} else {
if (B) {
console.log("set some boolean to false");
}
console.log("do something 2");
}
}
function newImplementation(A, B) {
if (A && B) {
console.log("do something 1");
}
else if (B) {
console.log("set some boolean to false");
}
if (!A || !B) {
console.log("do something 2");
}
}
console.log("originalImplementation");
originalImplementation(0, 0);
originalImplementation(0, 1);
originalImplementation(1, 0);
originalImplementation(1, 1);
console.log("newImplementation");
newImplementation(0, 0);
newImplementation(0, 1);
newImplementation(1, 0);
newImplementation(1, 1);
先设置布尔值可以设置得更清楚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;
这允许 reader 忽略超出他们感兴趣的条件的逻辑
最后,您还可以使用有意义的名称而不是注释来创建函数
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
语句不需要花括号 - 您可以避免
if
、else if
等,并提前 return
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 ;)