//if-else嵌套過多時的優化方案
在壘代碼的時候經常會遇到 if-else 的嵌套判斷,就是下一個判斷依賴於上一個判斷的結果,其基本的表現形式為
if(){//first judge
if(){//second
//do something
}else{
if(){//third
//do something
}else{
//do something
}
}
}else{
//do something
}
當嵌套的個數不是太多的時候,看上去也不是太亂,順着每個判斷寫下來也不會太困難,
但是當嵌套個數太多的時候依然依照上面的寫法來寫的話,就會感覺很吃力、思緒很亂。
所以我想要優化一下代碼。
思考的結果如下:
1.函數化
2.將步驟判斷和每個步驟要做的事情分開
所以有了兩個函數:
function getStep(){//得到步驟,返回為步驟
var step = 0 ;
return step ;
}
function gotoStep(step){}//根據不同步驟來做不同的事情
假如我們有5個判斷條件 judgement1,judgement2,judgement3,judgement4,judgement5,
條件相互依賴,即當判斷 judgement1之后根據它的判斷結果再來判斷judgement2
最后根據這五個判斷條件的真假來得到步驟
所以完成第一個函數
function getStep(){//得到步驟,返回為步驟
if(judgement1){//如果judgement1為true則進行下一步判斷,否則直接返回step
if(judgement2){
if(judgement3){
if(judgement4){
if(judgement5){
return 6;
}else{
return 5;
}
}else{
return 4;
}
}else{
return 3;
}
}else{
return 1;
}
}else{
return 0;
}
}
然后再完成第二個函數
function gotoStep(step){
switch(step){
case 1://doSomething
break;
case 2://doSomething
break;
case 3://doSomething
break;
case 4://doSomething
break;
case 5://doSomething
break;
case 6://doSomething
break;
}
}
如此調用兩個函數 gotoStep(getStep()) 即可;
但是第一個函數的只是步驟清晰了起來,看上去還是比較繁瑣,在與同時討論之后,
想到遞歸調用方法來改寫第一個得到step的函數
具體步驟如下
//將判斷條件依照先后順序寫進一個數組
var judgement = [
judgement1,
judgement2,
judgement3,
judgement4,
judgement5,
];
var step = 0; //設置第一步
//遞歸函數
function getStep()
{
if(step==6){ return ;}else{
if (judgement[step]){
step++;
getStep();
}else{
return ;
}
}
}
//執行遞歸函數之后執行gotoStep();
getStep();
gotoStep(step);
ps:小小見解,希望大神給出更簡單的方案