善待 if-else

同事跟我说,之前负责的模块线上版本有个ListView复用错乱的坑,由于近期一直负责基于插件化的项目重构,因此这个bug被分配给了某位同僚。心想,怎么会犯这么低级的错误呢,赶紧checkout出那个分支看了下。原因很简单,却很有代表性。

大致代码如下:

1
2
3
4
5
6
7
8
else if (index.getType().equals("1")) { //if-1
viewHolder.et_attr_in.setVisibility(View.GONE);
viewHolder.tv_attr_select.setVisibility(View.VISIBLE);
if (isEdit && !index.getResult().equals("")) { //if-2
viewHolder.tv_attr_select.setText(index.getResult());
} else if (!index.getResult().equals("")) { //if-3
viewHolder.tv_attr_select.setText(index.getResult());
}

问题出在if-2这里,实际上紧跟的else并未包含所有的case。
在此总结下良好的if-else代码块处理方式(建议)
当类似的if中存在多个判断条件时,要确保每一个case都有相应的处理

1
2
3
if(condition1 | condition2){ //block-1
//some code
}

在此要充分考虑condition1condition2分别为true/false的情况

if与else 一一对应
通常会遇到的一种情况是满足if条件才是有意义的逻辑,而通常省略else 在这种情况,除了添加else闭合处理逻辑外,更可以在else中添加断言或抛出异常:

1
2
3
4
5
6
if (condition) {
//good code
} else {
//useless code
throw new UnkonwException("Bad condition occured!");
}

多重if嵌套
当存在2重以上if嵌套时,应及时添加注释,注明判断边界:

1
2
3
4
5
6
7
8
9
if (condition1) {
//some code
if (condition2) {
//some code
if (condition3) {
//...
} //end-if condition3
}//end-if condition2
}//end-if condition1

生命不息,挖坑不止~