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