PC的blog

          Finding... Thinking... Solving...

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            9 Posts :: 0 Stories :: 54 Comments :: 0 Trackbacks
          本文緊接使用重構(gòu)移除丑陋的if else代碼(4)

          上篇文章談到如何能夠徹底把這個(gè)switch也移除掉呢?很簡(jiǎn)單,我們只需要在getSystemStatePerformer()方法被調(diào)用之前先創(chuàng)建所有 performer匿名類的實(shí)例,然后在該方法被調(diào)用時(shí)直接返回對(duì)應(yīng)的實(shí)力。 如何具體實(shí)現(xiàn)呢? 用Map, 請(qǐng)看代碼:

          package de.jingge.refactoring;

           

          import static de.jingge.refactoring.SystemState.*;

          import java.awt.Image;

          import java.awt.image.BufferedImage;

          import java.lang.reflect.Method;

          import java.util.Collections;

          import java.util.HashMap;

          import java.util.Map;

           

          /**

           *

           * 
          @author gejing@gmail.com

           
          */

          public class SystemStatePerformerFactory {

           

          private static SystemStatePerformerFactory INSTANCE = new SystemStatePerformerFactory();

             

              
          private Map<SystemState, SystemStatePerformer> performers;

           

              
          private SystemStatePerformerFactory() {

          }

           

              
          public static SystemStatePerformerFactory getInstance() {

                  
          return INSTANCE;

              }

             

              
          private synchronized Map<SystemState, SystemStatePerformer> getPerformers()

                      
          throws Exception {

                  
          if (performers == null) {

                      performers 
          = new HashMap<SystemState, SystemStatePerformer>();

                      
          // call all @FactoryMethod using reflection

                      
          for (Method m : getClass().getDeclaredMethods()) {

                          
          if (m.getAnnotation(FactoryMethod.class!= null) {

                              SystemStatePerformer p 
          = (SystemStatePerformer) m.invoke(

                                      
          thisnew Object[]{});

                              performers.put(p.getState(), p);

                          }

                      }

                      
          // make it readonly

                      performers 
          = Collections.unmodifiableMap(performers);

                  }

                  
          return performers;

              }

           

              
          public SystemStatePerformer getSystemStatePerformer(SystemState state) throws Exception{

                  
          return getPerformers().get(state);

              }

           

          @FactoryMethod

              
          private SystemStatePerformer createLoggedInPerformer() {

                  
          return new SystemStatePerformer(LOGGEDIN, getImage("loggedin.gif")) {

           

                      @Override

                      
          public void perform() {

                          
          // do something after logging in is successful,

                          
          // for example: show welcome dialog, open the last edit document, etc.

                      }

                  };

              }

           

          @FactoryMethod

              
          private SystemStatePerformer createLoggedOutPerformer() {

                  
          return new SystemStatePerformer(LOGGEDOUT, getImage("loggedout.gif")) {

           

                      @Override

                      
          public void perform() {

                          
          // do something after logging out is successful,

                          
          // for example: free used resource, dispose GUI components, etc.            }

                      }

                  };

              }

           

          @FactoryMethod

              
          private SystemStatePerformer createIdlePerformer() {

                  
          return new SystemStatePerformer(IDLE, getImage("idle.gif")) {

           

                      @Override

                      
          public void perform() {

                          
          // do something after the user is idle,

                          
          // for example: save the application state temporarily, lock the application, etc.

                      }

                  };

              }

           

              
          private Image getImage(String string) {

                  
          return new BufferedImage(1010, BufferedImage.TYPE_4BYTE_ABGR);

              }

          }

          從代碼中可以看出,當(dāng)getPerformers()方法被第一次調(diào)用時(shí),我們會(huì)為每一個(gè)performer匿名類創(chuàng)建一個(gè)實(shí)例,并且將它們納入Map的管 理之中,以后每次調(diào)用的時(shí)候,直接從Map里面提取對(duì)應(yīng)某個(gè)狀態(tài)的performer就可以了, switch可以舍棄了。 @FactoryMethod這個(gè)注釋是我自己寫的,使用它主要是為了避免每次新增加一個(gè)create***Performer()方法后,都必須修改 getSystemStatePerformer()。

          @FactoryMethod的代碼如下:

          package de.jingge.refactoring;

           

          import java.lang.annotation.ElementType;

          import java.lang.annotation.Retention;

          import java.lang.annotation.RetentionPolicy;

          import java.lang.annotation.Target;

           


          @Retention(RetentionPolicy.RUNTIME)

          @Target({ElementType.METHOD})

          public @interface FactoryMethod {


          }

          到這里整個(gè)重構(gòu)已經(jīng)結(jié)束了, 我們已經(jīng)將if else, switch完全從代碼里剔除了。

          讀過(guò)Refactoring to Patterns這本書的朋友可能會(huì)覺(jué)得,這里所作的一些和書中第七章最后一節(jié)Replace Conditional Dispatcher with Command完全一樣。 Well,第一眼看上去確實(shí)很像,但是看完我寫的所有代碼后,再仔細(xì)想一想,兩者還是有區(qū)別的(Refactoring to Patterns這本書寫的非常好,對(duì)此書,我可以說(shuō)是愛(ài)不釋手,還曾經(jīng)寫過(guò)一篇書評(píng)。事實(shí)上,我這篇文章正式基于這本書的):

          1. Factory + annonymous類而不是每一個(gè)狀態(tài)一個(gè)具體的實(shí)體類。

              這樣處理問(wèn)題, 類的數(shù)量大大減少,類關(guān)聯(lián)的復(fù)雜程度也大大減少,維護(hù)起來(lái)很方便。

          2. performer并不單單是一個(gè)command,它擁有狀態(tài),并且可以處理更多的邏輯。


          全文完。




          聲明:本文版權(quán)歸作者所有,如需轉(zhuǎn)載請(qǐng)注明出處。

          posted on 2008-08-04 03:48 polygoncell 閱讀(4633) 評(píng)論(37)  編輯  收藏

          Feedback

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-04 09:12 HiMagic!
          ifelse -> switch -> map
          其實(shí)代碼無(wú)所謂丑陋與否,只不過(guò)是心理作祟。關(guān)鍵在于怎樣最符合業(yè)務(wù)邏輯,怎樣最適應(yīng)業(yè)務(wù)場(chǎng)景。  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-04 09:37 kkktop
          我們寫程序的本質(zhì)是解決問(wèn)題,如果就是為了OO而OO,反而陷入了OO的泥潭,如果一個(gè)簡(jiǎn)單的邏輯只是因?yàn)橛枚嗔薸felse,就覺(jué)得不好,不夠OO,我想就有點(diǎn)鉆牛角尖的味道,而不是code的badsmell了.
          本人的感覺(jué)(粗略看過(guò))如果只看這個(gè)問(wèn)題,是把簡(jiǎn)單問(wèn)題復(fù)雜化了.呵呵  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-04 09:42 kkktop
          這就像打蚊子,不能只選用大炮的,只要是合適的武器能解決問(wèn)題就好.
            回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-04 09:42 LINQ
          平時(shí)寫這些只會(huì)讓效率更加的低下,業(yè)務(wù)邏輯封裝的時(shí)候倒是可以考慮這樣的方法,寫一個(gè)統(tǒng)一調(diào)用的接口!就像樓上說(shuō)的不能為了OO而OO,OO的目的是為了提高效率和減少維護(hù)的成本!博主寫不的不錯(cuò),贊一個(gè)!  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-04 09:53 路過(guò)
          呵呵,一個(gè)業(yè)務(wù)實(shí)現(xiàn)的方法是多種多樣的,但,當(dāng)一個(gè)業(yè)務(wù)有簡(jiǎn)單變的復(fù)雜時(shí),回頭來(lái)看以前寫的方法就知道優(yōu)劣了,平時(shí)多鍛煉oo也無(wú)可厚非,集沙成塔。支持一下。  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5)[未登錄](méi) 2008-08-04 09:55 Brian
          一篇文章就能寫清楚的事情,不需要寫5篇吧?簡(jiǎn)單事情復(fù)雜化!  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-04 11:44 霉干菜
          這么寫了如果以后代碼交給別人維護(hù)
          要交待得太多了把  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-04 13:25 leekiang
          別連放5篇到首頁(yè),以免形成視覺(jué)污染。  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-04 13:52 zhuxing
          如果簡(jiǎn)單針對(duì)樓主的代碼,個(gè)人覺(jué)得這么重構(gòu)有點(diǎn)過(guò)了。

          我提出置疑,針對(duì)的是:你用工廠方法模式的理由充分嗎?

          我想強(qiáng)調(diào)兩點(diǎn):
          1、再仔細(xì)揣摩一下你的需求。是不是用個(gè)靜態(tài)方法(creation method)的方式更合理一些?
          2、看一下你周圍的工作伙伴,這么寫會(huì)不會(huì)增大代碼的負(fù)責(zé)度?(這個(gè)問(wèn)題的標(biāo)準(zhǔn)是有你的同伴來(lái)決定,不能自己判斷)


          最后強(qiáng)調(diào)一下:
          在學(xué)習(xí)模式導(dǎo)向重構(gòu)的時(shí)候,看看最基本的重構(gòu)技巧是否已經(jīng)熟悉了。我看你那個(gè)getPerformers()方法,就有點(diǎn)難受。為什么要把if語(yǔ)句嵌套的那么深呢???

            回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-04 14:41 polygoncell
          呵呵,大家的反應(yīng)很激烈啊!

          我這里只是使用一個(gè)簡(jiǎn)單的例子來(lái)解釋如何使用重構(gòu)來(lái)移除if else,實(shí)際應(yīng)用邏輯當(dāng)然要復(fù)雜很多。

          的確有一些程序員覺(jué)得一個(gè)方法里面使用一大堆if else很方便,其實(shí)這只是對(duì)他自己方便,別人閱讀他的這一大堆if else會(huì)很頭疼。

          我這樣重構(gòu)看似增加了代碼量,實(shí)則封裝了大量的技術(shù)細(xì)節(jié)。

          建議大家去讀讀refactoring to patterns這本書,書中就講到了一個(gè)結(jié)對(duì)重構(gòu)(該書的作者和一個(gè)程序員)的例子,最開(kāi)始那個(gè)程序員也覺(jué)得重構(gòu)完后,代碼量明顯增加,他很不爽,但是后來(lái)他熟悉了那些模式后才發(fā)現(xiàn)他以前的做法是錯(cuò)誤的,應(yīng)該進(jìn)行這樣的重構(gòu)。  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-04 14:49 ANTI CPC
          我支持樓主,他只是用一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明如何進(jìn)行重構(gòu)。對(duì)于實(shí)際的case,往往復(fù)雜的多,一個(gè)好的架構(gòu)開(kāi)始的時(shí)候貌似增加了代碼,實(shí)際上后面維護(hù)起來(lái)就舒服很多了,切身體會(huì)。  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-04 15:04 badqiu
          避免過(guò)度設(shè)計(jì)  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-04 17:29 Unmi
          @Brian
          寫成五篇,可以投放的廣告就能多多了。  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-04 18:04 千里冰封
          @Unmi
          確實(shí),我開(kāi)始還以為是系統(tǒng)的廣告呢,原來(lái)是作者自己加的,有點(diǎn)那個(gè)了,我想做俯臥撐了  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-04 18:33 polygoncell
          @千里冰封

          呵呵,可別超過(guò)3個(gè)。 對(duì)了,你的那個(gè)音樂(lè)播放器挺不錯(cuò)的。  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-04 18:34 polygoncell
          @Unmi

          我也就是這次試驗(yàn)一下這么寫,效果不好的話會(huì)考慮下次換個(gè)方式。  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-04 18:46 polygoncell
          @zhuxing

          理論上來(lái)說(shuō),creation method也是可以的,不過(guò)這樣一來(lái)就導(dǎo)致Performer類和過(guò)多的其他類產(chǎn)生耦合(因?yàn)樘幚砻恳粋€(gè)狀態(tài)需要用到完全不同的類),我用factory就是為了保持performer干凈。要是一定要用creation method的話,performer都可以省了,直接寫一個(gè)復(fù)雜的enum,而每一個(gè)enum實(shí)例正好就是creation method。  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-04 21:13 kkktop
          對(duì)于這個(gè)簡(jiǎn)單的問(wèn)題,覺(jué)得ifelse加上應(yīng)有的注釋,好過(guò)這么大堆復(fù)雜的實(shí)現(xiàn),加上注釋的好處也是便于維護(hù)和后人的理解,并不比這樣實(shí)現(xiàn)下來(lái)差很多  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-04 22:07 BeanSoft
          難道 Map 內(nèi)部實(shí)現(xiàn)不是 if-esle 嘛?

          計(jì)算原理三要素: 順序、循環(huán)與分支

          OO 只不過(guò)是重新封裝了一把.  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-04 22:22 polygoncell
          @BeanSoft

          map沒(méi)有使用一大團(tuán)if else,HashMap的代碼如下:

          public V get(Object key) {
          if (key == null)
          return getForNullKey();
          int hash = hash(key.hashCode());
          for (Entry<K,V> e = table[indexFor(hash, table.length)];
          e != null;
          e = e.next) {
          Object k;
          if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
          return e.value;
          }
          return null;
          }

          而且Map已經(jīng)封裝好了,對(duì)于我們使用者來(lái)說(shuō)是沒(méi)有if else的。 現(xiàn)在編碼強(qiáng)調(diào)的是粒度適度,便于測(cè)試,便于閱讀。  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-05 00:24 隔葉黃鶯
          @polygoncell
          一、二、三、四、五連著五篇這么投放廣告還能是試驗(yàn)呀,俯臥撐超過(guò)三個(gè)就會(huì)死人的,你這樣 5*4=20,哎呀,要快差不多7個(gè)人了。  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-05 02:21 polygoncell
          @隔葉黃鶯

          這位兄弟挺逗的!呵呵。那個(gè)4是怎么得來(lái)的?

          兄弟沒(méi)必要這么針對(duì)我吧,我沒(méi)招惹你吧。真的是做個(gè)實(shí)驗(yàn),你可以看看我以前的文章。

          哦,對(duì)了,樓上眾位兄弟哪位能夠幫我分析一下:我應(yīng)該有如何處理自己原創(chuàng)的文章的自由吧? 而且看與不看全憑自愿,為什么有些朋友的反應(yīng)會(huì)這么激烈?最好那些反應(yīng)過(guò)激的朋友能站出來(lái)說(shuō)說(shuō)你們的想法,大家交換一下意見(jiàn),謝謝。  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-05 09:43 zhuxing
          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-04 18:46 polygoncell
          @zhuxing

          理論上來(lái)說(shuō),creation method也是可以的,不過(guò)這樣一來(lái)就導(dǎo)致Performer類和過(guò)多的其他類產(chǎn)生耦合(因?yàn)樘幚砻恳粋€(gè)狀態(tài)需要用到完全不同的類),我用factory就是為了保持performer干凈。要是一定要用creation method的話,performer都可以省了,直接寫一個(gè)復(fù)雜的enum,而每一個(gè)enum實(shí)例正好就是creation method。


          大哥:只能說(shuō),俺長(zhǎng)見(jiàn)識(shí)了! ~_~  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-05 17:03 polygoncell
          @zhuxing

          我又仔細(xì)的考慮了一下,覺(jué)得靜態(tài)方法在這里并不適用,因?yàn)槲覀冃枰槍?duì)不同的狀態(tài)寫出完全不同的邏輯來(lái)處理狀態(tài)。靜態(tài)方法通常適用于參數(shù)實(shí)例繁多而邏輯相同的情況。  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-05 22:49 onlykeke
          其實(shí)我覺(jué)得 if else 很漂亮。不過(guò)我也不否認(rèn)模式應(yīng)用的好處。只是不要過(guò)度設(shè)計(jì)。  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-06 18:04 zhuxing
          @polygoncell
          我也只是和你打個(gè)比喻

          繼承封裝變化....靜態(tài)能繼承嗎?
          ---------簡(jiǎn)單工廠(靜態(tài)工廠方法)和工廠方法的最本質(zhì)區(qū)別

          如果你真的有封裝變化的需求,那你用工廠方法問(wèn)題不大。如果現(xiàn)有變化比較少,而且能夠預(yù)想到的擴(kuò)展需求不大,就別用工廠方法了...


          當(dāng)然你可能有你特定的需求,而且也沒(méi)法三言兩句說(shuō)的很清楚。說(shuō)實(shí)在的,你的那個(gè)反射...什么什么的... 有點(diǎn)亂~_~


          你的代碼是在使用工廠方法,但是這個(gè)創(chuàng)建過(guò)程有點(diǎn)煩瑣...不需要搞成這樣  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-07 19:59 polygoncell
          @zhuxing

          那個(gè)反射主要是為了分析@FactoryMethod注釋,用意很清晰:減少不必要的編碼。狀態(tài)增加后,程序員只需要增加一個(gè)帶@FactoryMethod的方法就行了。  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-08 09:31 zhuxing
          @polygoncell
          不知道你寫了幾年代碼了
            回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-08 15:33 polygoncell
          @zhuxing

          有些年頭了,不過(guò)寫java代碼還沒(méi)超過(guò)10年,你呢?

          你覺(jué)得這樣做繁瑣,請(qǐng)問(wèn)如何做才簡(jiǎn)單?能不能貼出你認(rèn)為簡(jiǎn)單的代碼?有時(shí)候旁觀和自己動(dòng)手做的感覺(jué)是完全不一樣的。還有,別忘了要把簡(jiǎn)單留給使用你代碼的人,而把繁瑣留給自己。

          有msn么?咱倆好好聊聊。:-)  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-08-13 23:33 小高
          這個(gè)代碼比if 更丑陋 ..... 看了本書 就強(qiáng)用書上的東西 .... 很有問(wèn)題 .......
          博主有團(tuán)隊(duì)工作的經(jīng)歷嗎 ...每個(gè)人都這樣寫(小提大作)...... 項(xiàng)目就真亂了....
          自己研究還差不多 ... 我打賭 你要是真的 遇到了 你還是用 if   回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-09-01 12:36 mikelij
          這樣重構(gòu)法不具普遍意義. 因?yàn)樗贿m合于enumeration. 如果是復(fù)雜條件呢. 我個(gè)人認(rèn)為這是design pattern的錯(cuò)誤應(yīng)用.兄弟你中毒了.  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-09-25 11:08 iridiumcao
          5篇有點(diǎn)多,合為一篇看起來(lái)比較好。
          博主能整理下,把文檔和代碼打個(gè)包,提供下載,更好。~我很懶。  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2008-09-25 14:42 iridiumcao
          HiMagic!
          ifelse -> switch -> map

          演了一遍,就是HiMagic總結(jié)的過(guò)程。  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2009-08-25 12:30 zhuxinyu
          我也同樣認(rèn)為if .... else .. 過(guò)多應(yīng)該進(jìn)行重構(gòu)。 我這里沒(méi)有那么復(fù)雜,僅僅是將
          判斷的集中狀態(tài)也寫出枚舉。 語(yǔ)法通過(guò)switch....case.... 去判斷。 如果再?gòu)?fù)雜的話我會(huì)寫出lz第5片的模式。

          第三篇中,我有個(gè)疑問(wèn)public abstract class SystemStatePerformer
          這里的SystemStatePerformer是抽象類,lz怎么將其實(shí)例化了呢
          new SystemStatePerformer(LOGGEDIN, getImage("loggedin.gif"))。 是否應(yīng)該單獨(dú)寫個(gè)類繼承此類?  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2009-11-20 23:28 rockallite
          @mikelij
          “這樣重構(gòu)法不具普遍意義. 因?yàn)樗贿m合于enumeration. 如果是復(fù)雜條件呢. 我個(gè)人認(rèn)為這是design pattern的錯(cuò)誤應(yīng)用.兄弟你中毒了. ”

          同意 mikelij。

          polygoncell 的代碼重構(gòu),核心就是從 if-else 改到 switch 再改到 Map,其必要條件是:業(yè)務(wù)判斷條件只包含簡(jiǎn)單的枚舉。假設(shè)發(fā)生變化的恰恰是判斷條件呢?polygoncell 的重構(gòu)把這種判斷條件可變的靈活性舍棄了,所以遇到以上假設(shè)的情況時(shí),代碼就無(wú)可避免的需要作大量更改。而用原來(lái)的 if-else,代碼就很靈活,更改的地方也很少。  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2010-06-30 17:46 virus
          @霉干菜
          不這么做的代碼,如果要交給別人,需要講更多都不會(huì)明白  回復(fù)  更多評(píng)論
            

          # re: 使用重構(gòu)移除丑陋的if else代碼(5) 2012-01-05 11:06 sagt
          其實(shí)if else的丑陋說(shuō)白了是不利于變化,難以修改。比如說(shuō)你的if else里原來(lái)有50種情況,現(xiàn)在要增加兩種,則你恐怕要去所有if else里面小心的去看,很容易弄出bug來(lái)。而用繼承和多態(tài)的方法只需要在一個(gè)地方增加就可以了。  回復(fù)  更多評(píng)論
            


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 固安县| 八宿县| 德清县| 曲阜市| 平阴县| 宕昌县| 凌云县| 罗源县| 靖西县| 旅游| 卢龙县| 专栏| 宁陕县| 汉源县| 思茅市| 临桂县| 扶绥县| 泗水县| 泰州市| 清水河县| 河东区| 炉霍县| 长沙市| 鸡西市| 晴隆县| 德安县| 彩票| 宁国市| 永仁县| 明水县| 綦江县| 濮阳县| 青海省| 陵川县| 沐川县| 凯里市| 白水县| 吉隆县| 精河县| 苏尼特右旗| 普定县|