eric-1001c

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            3 隨筆 :: 45 文章 :: 12 評(píng)論 :: 0 Trackbacks
          if_else

                無疑 if/else幾乎是所有編程語言的一個(gè)重要語法,我們不但可以在簡(jiǎn)單的函數(shù)里面發(fā)現(xiàn)它的足跡,更不用說在具有復(fù)雜邏輯、代碼行數(shù)累累的功能里面了。所以盡管if/else是一個(gè)簡(jiǎn)單的語法結(jié)構(gòu),但它的功能很強(qiáng)大。
                if/else的強(qiáng)大使得我們?cè)谟龅饺魏畏种н壿嬂锩娑紩?huì)優(yōu)先考慮它的使用,所以無論是簡(jiǎn)單的,還是復(fù)雜邏輯功能函數(shù)都會(huì)出現(xiàn)if/else,但是這種“優(yōu)先考慮”更多的時(shí)候卻變成了一種慫恿和誘惑。特別在復(fù)雜邏輯功能函數(shù)里面,不乏if/else錯(cuò)用、濫用和嵌套用。if/else錯(cuò)用、濫用和嵌套用都會(huì)在不同程度上減少代碼的可讀性,降低代碼的可維護(hù)性,增加潛在bug的可能性。
               if/else錯(cuò)用。什么是if/else錯(cuò)用?由于人的思維快速性,使得我們能夠一下子對(duì)一些中等復(fù)雜的邏輯理解,能夠一下子把中等復(fù)雜的邏輯結(jié)構(gòu)浮現(xiàn)在腦海,因此在編程的時(shí)候就容易過于自信,依葫蘆畫瓢,想到哪寫到那。通常這容易使得某些人在使用if/else的時(shí)候?qū)е洛e(cuò)用,下面是一個(gè)if/else錯(cuò)用的例子:
           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  }
                 在這個(gè)例子里面,由于只有3個(gè)邏輯可能性,所以很容易就會(huì)分別對(duì)3個(gè)邏輯可能性的一一建立分支。也許在簡(jiǎn)單的、行數(shù)較少的代碼里面,一一建立分支的做法并無大礙,但如果功能復(fù)雜,行數(shù)較多,代碼自描述性較差的代碼里面,你大半會(huì)被這里的邏輯搞暈的。這就是if/else錯(cuò)用了,其實(shí)并不需要一一建立分支,至少在上面的例子里面,對(duì)于C的判斷是不需要的。
                if/else濫用。濫用是指過多的使用if/else進(jìn)行邏輯控制,同樣也是因?yàn)樗季S的快速性和不具有良好編程經(jīng)驗(yàn)的人容易煩的錯(cuò)誤。例如下面的代碼:
           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}
          很明顯上面的這段代碼不是一個(gè)良好結(jié)構(gòu)的代碼段,當(dāng)然這里還存在if/else錯(cuò)用和嵌套用的問題。但是這就也說明了if/else錯(cuò)用和嵌套用的基本原因是我們?yōu)E用了if/else,因此如果當(dāng)我們使用超過3個(gè)嵌套if/else之后就應(yīng)該思考這段代碼是否能夠進(jìn)行重構(gòu)。重構(gòu)的方法很多,本文就不進(jìn)行具體介紹了,有興趣可以參考Martin Fowler的《Refactoring: Improving the Design of Existing Code》以及wiki對(duì)refactoring的介紹
                if/else嵌套用。嵌套用很好解釋,也很好理解其害處。人腦的堆棧容量是有限的,一般不建議if/else或其他邏輯結(jié)構(gòu)嵌套超過三層以上,否則人對(duì)其的記憶就會(huì)大大減弱,相信誰也不會(huì)想不斷翻之前的代碼行去查看某個(gè)東西吧。我們?cè)谡fif/else濫用的例子就是一個(gè)典型的嵌套用法,層數(shù)達(dá)到4層以上。這種問題很容易產(chǎn)生,因?yàn)槌绦虮緛砭褪且刂七壿嫷模壿嫶嬖诙喾N分支在大部分時(shí)候我們都會(huì)遇上。那怎么避免這種嵌套用呢?要做到避免其實(shí)在一開始是很難做到的,除了經(jīng)驗(yàn)豐富的人除外。所以我的建議是,先把事情做對(duì)了(程序邏輯實(shí)現(xiàn)了),然后進(jìn)行重構(gòu)。對(duì)于大點(diǎn)的程序進(jìn)行重構(gòu)建議遵循Martin的觀點(diǎn),先寫好相關(guān)的test。而這里的重構(gòu)方法也可以說相當(dāng)簡(jiǎn)單,思路一:使用Joshua Bloch在《effective java》中介紹的方法,把嵌套里面的if/else一一揪出并放到所在嵌套層的上一層,如果揪出后還能繼續(xù)在新所在層揪到新所層的上一層就繼續(xù)揪,同時(shí)要注意else是否能消掉;思路二:是否能夠使用switch實(shí)現(xiàn),3個(gè)以上的邏輯判斷用switch的話更容易讓人看懂你寫的東西。最后還應(yīng)該根據(jù)實(shí)際情況,是否需要把邏輯代碼段抽取出來成為一個(gè)單獨(dú)的函數(shù)或者類。例如上例我們可以進(jìn)行如下重構(gòu):
           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雖小,而且功能強(qiáng)大,但如果不正確使用,不但會(huì)讓代碼維護(hù)困難,更可怕是留下潛在的bug。以上3個(gè)問題是比較普通出現(xiàn)的問題,只要我們細(xì)心的話,這些問題都可以避免,修改和完善。
          posted on 2009-10-24 10:54 Eric-1001c 閱讀(1811) 評(píng)論(1)  編輯  收藏 所屬分類: 編程技巧

          評(píng)論

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


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 额济纳旗| 长泰县| 临夏市| 日照市| 景宁| 图片| 东乡族自治县| 潞城市| 宜川县| 柳州市| 来安县| 通渭县| 潍坊市| 林周县| 庐江县| 清镇市| 株洲县| 曲水县| 大安市| 南丹县| 五寨县| 淮安市| 绩溪县| 宝兴县| 尼木县| 青龙| 彭水| 凤台县| 清流县| 肇源县| 陆川县| 秭归县| 天峨县| 九江市| 太湖县| 天水市| 拜城县| 鹤壁市| 永清县| 旺苍县| 灌南县|