Javascript / NodeJs优化重复的if-else

时间:2013-07-09 18:42:11

标签: javascript if-statement

我如何重构/重写下面的代码以提高可读性和可维护性? 我有两个主分支,每个分支我有相同的if-else链,有3个选项和3个子选项。总共我有9个叶子,有9个不同的函数可以执行。

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();
            }
        }
    }
}

提前非常感谢。

3 个答案:

答案 0 :(得分:4)

嗯,这更简洁,但我不确定是否值得为你付出努力。 我在每种情况下都添加了一些额外的复杂性,以防所有选项都不成立。如果其中一个得到保证,你可以避免整个“中止”逻辑。

var functionMap = {
    firstOption: {
        alpha: { xRay: do1, yankee: do2, zebra: do3 },
        beta: { xRay: do4, yankee: do5, zebra: do6 },
        charlie: { xRay: do7, yankee: do8, zebra: do9 }
    },
    secondOption: {
        alpha: { xRay: do11, yankee: do12, zebra: do13 },
        beta: { xRay: do14, yankee: do15, zebra: do16 },
        charlie: { xRay: do17, yankee: do18, zebra: do19 }
    }

};

function selectFunctionToRun() {
    var option = (isFirstOption()) ? "firstOption" : (isSecondOption()) ? "secondOption" : "abort";
    var abc = (isAlpha()) ? "alpha" : (isBeta()) ? "beta" : (isCharlie()) ? "charlie" : "abort";
    var xyz = (isXRay()) ? "xRay" : (isYankee()) ? "yankee" : (isZebra()) ? "zebra" : "abort";
    if (option != "abort" && abc != "abort" && xyz != "abort") {
        functionMap[option][abc][xyz].call();
    }
}

答案 1 :(得分:1)

您可以将if / else / elseif结构重构为更像这样的内容:

var cases = {
    1: do1,
    2: do2,
    3: do3
};

if (cases[something]) {
    cases[something]();
}

来源:How to avoid switch case syndrome

答案 2 :(得分:1)

+ 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