Javascript/NodeJs优化重复if-else
如何重构/重写下面的代码以提高可读性和可维护性? 我有两个主分支,每个分支都有相同的if-else链,有3个选项和3个子选项。我总共有9个Leaf,需要执行9个不同的函数Javascript/NodeJs优化重复if-else,javascript,if-statement,Javascript,If Statement,如何重构/重写下面的代码以提高可读性和可维护性? 我有两个主分支,每个分支都有相同的if-else链,有3个选项和3个子选项。我总共有9个Leaf,需要执行9个不同的函数 function selectFunctionToRun(){ if (isFirstOption()) { if(isAlpha()){ if(isXRay()){ do1(); }else if (isYankee()
function selectFunctionToRun(){
if (isFirstOption()) {
if(isAlpha()){
if(isXRay()){
do1();
}else if (isYankee()){
do2();
}else if (isZebra()){
do3();
}
}else if (isBeta()){
if(isXRay()){
do4();
}else if (isYankee()){
do5();
}else if (isZebra()){
do6();
}
}else if (isCharlie()){
if(isXRay()){
do7();
}else if (isYankee()){
do8();
}else if (isZebra()){
do9();
}
}
}
else if(isSecondOption(){
if(isAlpha()){
if(isXRay()){
do11();
}else if (isYankee()){
do12();
}else if (isZebra()){
do13();
}
}else if (isBeta()){
if(isXRay()){
do14();
}else if (isYankee()){
do15();
}else if (isZebra()){
do16();
}
}else if (isCharlie()){
if(isXRay()){
do17();
}else if (isYankee()){
do18();
}else if (isZebra()){
do19();
}
}
}
}
提前非常感谢。好吧,这更简洁,但我不确定这是否值得你付出努力。 我在每种情况下都增加了一些额外的复杂性,以防没有一个选项是正确的。如果其中一个得到保证,则可以避免整个“中止”逻辑
好吧,这更简洁,但我不确定是否值得你这么做。 我在每种情况下都增加了一些额外的复杂性,以防没有一个选项是正确的。如果其中一个得到保证,则可以避免整个“中止”逻辑
您可能会将if/else/elseif结构重组为类似以下内容:
var cases = {
1: do1,
2: do2,
3: do3
};
if (cases[something]) {
cases[something]();
}
来源:您可能会将if/else/elseif结构重组为类似以下内容:
var cases = {
1: do1,
2: do2,
3: do3
};
if (cases[something]) {
cases[something]();
}
来源:斯科特解决方案的替代方案
var functionMap = {
_1AX: do1, _1AY: do2, _1AZ: do3,
_1BX: do4, _1BY: do5, _1BZ: do6,
_1CX: do7, _1CY: do8, _1CZ: do9,
_2AX: do11, _2AY: do12, _2AZ: do13,
_2BX: do14, _2BY: do15, _2BZ: do16,
_2CX: do17, _2CY: do18, _2CZ: do19
}
function selectFunctionToRun () {
var index = (isFirstOption () ? '_1' : isSecondOption() ? '_2' : '') +
(isAlpha () ? 'A' : isBeta () ? 'B' : isCharlie () ? 'C' : '') +
(isXRay () ? 'X' : isYankee () ? 'Y' : isZebra () ? 'Z' : '';
(functionMap [index] || function error () { ... }) (index);
如果根据属性名称命名处理程序函数,则可以消除
functionMap
。是+Scott解决方案的替代方案
var functionMap = {
_1AX: do1, _1AY: do2, _1AZ: do3,
_1BX: do4, _1BY: do5, _1BZ: do6,
_1CX: do7, _1CY: do8, _1CZ: do9,
_2AX: do11, _2AY: do12, _2AZ: do13,
_2BX: do14, _2BY: do15, _2BZ: do16,
_2CX: do17, _2CY: do18, _2CZ: do19
}
function selectFunctionToRun () {
var index = (isFirstOption () ? '_1' : isSecondOption() ? '_2' : '') +
(isAlpha () ? 'A' : isBeta () ? 'B' : isCharlie () ? 'C' : '') +
(isXRay () ? 'X' : isYankee () ? 'Y' : isZebra () ? 'Z' : '';
(functionMap [index] || function error () { ... }) (index);
如果您根据属性名称命名处理程序函数,则可以消除
functionMap
。我假设isFirstOption()
,isSecondOption()
的值是动态的,对吗?这18个函数真的有那么大的不同吗?感谢您的回复。这些问题的答案是肯定的。在我的实际项目中,我有4个选项和36个不同的功能。例如,我只写了两个选项。我假设isFirstOption()
,isSecondOption()
的值是动态的,对吗?这18个函数真的有那么大的不同吗?谢谢回复。这些问题的答案是肯定的。在我的实际项目中,我有4个选项和36个不同的功能。例如,我只写了两个选项。我确信isX
函数可以进一步简化,直接返回选项
、abc
和xyz
值,所以+1:-)@Bergi谢谢。是的,至少在本例中,听起来我们只是想查看单个数据成员的值,但我认为NodeJsBeginner一定有增加复杂性的原因。我确信isX
函数可以进一步简化,直接返回选项
,abc
和xyz
值,所以+1:-)@Bergi谢谢。是的,至少在这个示例中,听起来我们真的只想查看单个数据成员的值,但我认为NodeJsBeginner增加复杂性一定有原因。这与Scott在上面发布的内容类似。不过,他的回答非常详细。斯科特的道具。这与斯科特在上面发布的内容类似。不过,他的回答非常详细。斯科特的道具。