首页 » 编写高质量代码:改善JavaScript程序的188个建议 » 编写高质量代码:改善JavaScript程序的188个建议全文在线阅读

《编写高质量代码:改善JavaScript程序的188个建议》建议26:小心if嵌套的思维陷阱

关灯直达底部

人的思维是非常复杂的,这在一定程度上会增加if结构嵌套的复杂性。假设有4个条件,只有当这些条件全部成立时,才允许执行某件事情。遵循人的一般思维习惯,在检测这些条件时,常常会沿用下面这种结构嵌套:


if(a){

if(b){

if(c){

if(d){

alert("所有条件都成立!");

}

else{

alert("条件d不成立!");

}

}

else{

alert("条件c不成立!");

}

}

else{

alert("条件b不成立!");

}

}

else{

alert("条件a不成立!");

}


从思维的方向性上来考虑,这种结构嵌套并没有错误,使用下面这个if结构来表示更为简单。


if(a&&b&&c&&d){

alert("所有条件都成立!");

}


从设计时的本意来考虑:使用if语句逐个验证每个条件的合法性,并且对某个条件是否成立进行提示,以方便跟踪每个条件。但是,如果使用了上面的if结构多重嵌套,就会出现另一种可能:a条件不成立,程序会自动退出整个嵌套结构,而不管b、c和d的条件是否成立。这种“武断”很容易给测试带来“伤害”。如果核心的处理过程包含多条语句,或者出错的情况处理更为复杂,层层包裹的if结构会使代码嵌套过深,难以编辑。

为避免上述情况的发生,一般采取排除法,即对每个条件进行排除,条件全部成立再执行特定的操作。为了能够把条件有机地联系在一起,这里使用了一个布尔型变量作为钩子把每个if条件结构串在一起。


var t=true;//初始化行为变量为true

if(!a){

alert("条件a不成立!");

t=false;

}

if(!b){

alert("条件b不成立!");

t=false;

}

if(!c){

alert("条件c不成立!");

t=false;

}

if(!d){

alert("条件d不成立!");

t=false;

}

if(t){

alert("所有条件都成立!");

}


排除法有效地避免了条件结构的多重嵌套,并且更加符合人的思维模式。当然,这种设计方法也存在一定的局限性,一旦发生错误,就要放弃后面的操作。如果仅为了检查某个值的合法性,也就无所谓了。如果为了改变变量值和数据操作等,那么直接放弃就会导致后面的数据操作无法进行,为了防止此类问题的发生,不妨再设计一个标志变量来跟踪整个操作行为。