//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:小小见解,希望大神给出更简单的方案