<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 閱讀(1810) 評論(1)  編輯  收藏 所屬分類: 編程技巧

    評論

    # re: if/else的使用心得 2014-08-26 18:30 Carter
    想請問“使用Joshua Bloch在《effective java》中介紹的方法”,在effiective java中在哪一條,我沒找到,謝謝!  回復  更多評論
      


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲精品第一国产综合精品| 亚洲国产精品福利片在线观看 | 国产精品免费大片一区二区| 国产一区在线观看免费| 亚洲精品又粗又大又爽A片| 成人免费毛片视频| 亚洲AV综合色区无码一二三区| 最好免费观看韩国+日本| 亚洲色偷偷偷综合网| 国产精品深夜福利免费观看| 国产精品观看在线亚洲人成网| 日本高清免费不卡视频| 日韩在线观看免费| 亚洲人成网站在线播放vr| 无码精品国产一区二区三区免费| 亚洲免费在线播放| 久久这里只有精品国产免费10| 久久久久久亚洲精品影院| 国产无遮挡吃胸膜奶免费看视频| 猫咪免费人成网站在线观看入口 | 羞羞视频免费网站在线看| 亚洲精品美女久久777777| 免费专区丝袜脚调教视频| 亚洲日韩精品国产3区| 亚洲精品国自产拍在线观看| 久久精品国产免费一区| 亚洲一区精品视频在线| 午夜亚洲av永久无码精品| 先锋影音资源片午夜在线观看视频免费播放 | 中文字幕免费在线观看动作大片| 亚洲AV无码AV男人的天堂| 免费观看无遮挡www的视频| 曰批免费视频播放在线看片二| 国产亚洲综合网曝门系列| 免费三级毛片电影片| 免费人成再在线观看网站| 精品亚洲成a人片在线观看| 日本免费一区二区三区最新vr| 三上悠亚在线观看免费| 亚洲熟妇无码AV不卡在线播放| 中文字幕中韩乱码亚洲大片|