![](/img/trans.png)
[英]Want to reduce nested if else statement to reduce the cognitive complexity?
[英]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;
这允许读者忽略超出他们感兴趣的条件的逻辑
最后,您还可以创建具有有意义名称而不是注释的函数
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();
}
这降低了复杂性,因为在原始版本中 doSomething2 有 2 条路线并不明显。
我认为这是正确的方法,也是最干净的。
const DoSomething = function(){}
if (A && B) {
}
else if (B) {
DoSomething();
}
else {
DoSomething();
}
假设您对每种情况只做一件事,您可以尝试整理语法:
if
语句不需要花括号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 ;)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.