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