0

我如何重构/重写下面的代码以提高可读性和可维护性?我有两个主分支,每个分支都有相同的 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();
            }
        }
    }
}

提前非常感谢。

4

3 回答 3

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();
    }
}
于 2013-07-09T19:02:50.503 回答
1

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

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

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

资料来源:如何避免切换案例综合症

于 2013-07-09T19:03:20.860 回答
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如果根据属性名称命名处理程序函数,则可以消除。

于 2013-07-09T19:23:33.933 回答