eric-1001c

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  3 随笔 :: 45 文章 :: 12 评论 :: 0 Trackbacks
if_else

      无疑 if/else几乎是所有编程语言的一个重要语法,我们不但可以在简单的函数里面发现它的足迹,更不用说在具有复杂逻辑、代码行数累累的功能里面了。所以尽管if/else是一个简单的语法结构,但它的功能很强大。
      if/else的强大使得我们在遇到任何分支逻辑里面都会优先考虑它的使用,所以无论是简单的,还是复杂逻辑功能函数都会出现if/else,但是这种“优先考虑”更多的时候却变成了一种怂恿和诱惑。特别在复杂逻辑功能函数里面,不乏if/else错用、滥用和嵌套用。if/else错用、滥用和嵌套用都会在不同程度上减少代码的可读性,降低代码的可维护性,增加潜在bug的可能性。
     if/else错用。什么是if/else错用?由于人的思维快速性,使得我们能够一下子对一些中等复杂的逻辑理解,能够一下子把中等复杂的逻辑结构浮现在脑海,因此在编程的时候就容易过于自信,依葫芦画瓢,想到哪写到那。通常这容易使得某些人在使用if/else的时候导致错用,下面是一个if/else错用的例子:
 1/*
 2 * 只存在A、B和C情况的逻辑
 3 */

 4  if(A){
 5    //dosomething
 6  }
else{
 7     if(B){
 8       //dosomething
 9     }
else{
10        if(C){
11           //dosomething
12        }

13     }

14  }
       在这个例子里面,由于只有3个逻辑可能性,所以很容易就会分别对3个逻辑可能性的一一建立分支。也许在简单的、行数较少的代码里面,一一建立分支的做法并无大碍,但如果功能复杂,行数较多,代码自描述性较差的代码里面,你大半会被这里的逻辑搞晕的。这就是if/else错用了,其实并不需要一一建立分支,至少在上面的例子里面,对于C的判断是不需要的。
      if/else滥用。滥用是指过多的使用if/else进行逻辑控制,同样也是因为思维的快速性和不具有良好编程经验的人容易烦的错误。例如下面的代码:
 1 if(A&&B&&C){
 2    //dosomething
 3    if(A){
 4      //dosomething
 5    }else{
 6      if(B){
 7        //dosomething
 8      }else{
 9         if(C){
10           //dosomething
11         }
12      }
13    }
14}
很明显上面的这段代码不是一个良好结构的代码段,当然这里还存在if/else错用和嵌套用的问题。但是这就也说明了if/else错用和嵌套用的基本原因是我们滥用了if/else,因此如果当我们使用超过3个嵌套if/else之后就应该思考这段代码是否能够进行重构。重构的方法很多,本文就不进行具体介绍了,有兴趣可以参考Martin Fowler的《Refactoring: Improving the Design of Existing Code》以及wiki对refactoring的介绍
      if/else嵌套用。嵌套用很好解释,也很好理解其害处。人脑的堆栈容量是有限的,一般不建议if/else或其他逻辑结构嵌套超过三层以上,否则人对其的记忆就会大大减弱,相信谁也不会想不断翻之前的代码行去查看某个东西吧。我们在说if/else滥用的例子就是一个典型的嵌套用法,层数达到4层以上。这种问题很容易产生,因为程序本来就是要控制逻辑的,逻辑存在多种分支在大部分时候我们都会遇上。那怎么避免这种嵌套用呢?要做到避免其实在一开始是很难做到的,除了经验丰富的人除外。所以我的建议是,先把事情做对了(程序逻辑实现了),然后进行重构。对于大点的程序进行重构建议遵循Martin的观点,先写好相关的test。而这里的重构方法也可以说相当简单,思路一:使用Joshua Bloch在《effective java》中介绍的方法,把嵌套里面的if/else一一揪出并放到所在嵌套层的上一层,如果揪出后还能继续在新所在层揪到新所层的上一层就继续揪,同时要注意else是否能消掉;思路二:是否能够使用switch实现,3个以上的逻辑判断用switch的话更容易让人看懂你写的东西。最后还应该根据实际情况,是否需要把逻辑代码段抽取出来成为一个单独的函数或者类。例如上例我们可以进行如下重构:
 1 /*
 2  * 思路一:揪if/else/
 3  */
 4 if(A){//dosomething}
 5 if(B){//dosomething}
 6 if(C){//dosomething}
 7 
 8 /*
 9  * 思路二:使用switch
10  */
11 switch(condition){
12    case 'A'//dosomething;break;
13    case 'B'//dosomething;break;
14    case 'C'//dosomething;break;
15    default  ://dosomething;break;
16 }

      if/esle虽小,而且功能强大,但如果不正确使用,不但会让代码维护困难,更可怕是留下潜在的bug。以上3个问题是比较普通出现的问题,只要我们细心的话,这些问题都可以避免,修改和完善。
posted on 2009-10-24 10:54 Eric-1001c 阅读(1793) 评论(1)  编辑  收藏 所属分类: 编程技巧

评论

# re: if/else的使用心得 2014-08-26 18:30 Carter
想请问“使用Joshua Bloch在《effective java》中介绍的方法”,在effiective java中在哪一条,我没找到,谢谢!  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: