抽象配置
//badif (condition === 'a') { doA()} else if (condotion === 'b') { doB()} else if ...//goodconst CONDITIONS = { a: doA, b: doB, ...}CONDITIONS[condition]()
单一职责
//badfunction xxx() { val1 = ... val2 = ... if (conditionA) { ... val1 = ... } else if (conditionB) { val2 = .... } for (let i=0; i<val1; i++) { doSomeThing(val2[i]) }}//goodfunction getVal1 () { ... return val1}function getVal2 () { ... return val2} function iterate (val1, val2) { for (let i=0; i<val1; i++) { doSomeThing(val2[i]) }}function xxx() { iterate(getVal1(),getVal2());}
使用 break 和 return 代替控制标记
//badfunction xxx () { let flag = false; for (let i=0; i<val1; i++) { if (!flag) { if (i === ....) { flag = true doSomeThing(val2[i]) } } }}//goodfunction xxx () { let flag = false; for (let i=0; i<val1; i++) { if (i === ....) { doSomeThing(val2[i]) break; } }}
函数取代参数
//badfunction setVal(name, val) { if (name === 'a') { a = val } else if (name === 'b') { b = val }}//goodfunction setA (val) { a = val}function setB (val){ v =val }
逆向条件
//badfunction xxx() { if (condition === 'a' || condition === 'b' || condition === 'c') {}}//goodfunction xxx() { if (condition !== 'd') {}}
合并条件
//badfunction xx () { if (num === 0) { return 0 } else if (num === 1) { return 1 } else if (num === 2) { return 4 } else if (num === 3) { return 6 }}//goodfunction xx() { if ([0,1].includes(num)) { return num } else if ([2,3].includes(num)) { return num * 2 }}
条件语义化
//badfunction xx() { if ( (a > 1 && b >2) || (c>3 && d>4) || (!val1 && !val2)) { ... }}//goodfunction isXXX1() { return a > 1 && b >2}function isXXX2() { return c>3 && d>4}function isNotXXX3() { return !val1 && !val2}function xx () { if (isXXX1 || isXXX2 || isNotXXX3()) { ...}}
禁止多层条件判断嵌套
//badif (conditionA) { if (conditionA1) { if (...){} } else if (conditionA2) { if (...) {} }} else if (conditionB) { if (conditionB1) { if (...){} } else if (conditionB2) { if (...) {} }} else { if (conditionC1) { if (...){} } else if (conditionC2) { if (...) {} }}// goodif (conditionA) { conditionA()} else if (conditionB) { conditionB()} else { conditionC()}