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