PC的blog

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

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            9 Posts :: 0 Stories :: 54 Comments :: 0 Trackbacks
          本文緊接使用重構移除丑陋的if else代碼(3)

          OK, 到目前為止,所有的邏輯代碼已經從SystemManager重構到了SystemStatePerformer。下一步應該繼續重構SystemManager, 將SystemState替換為performer:

          1, 使用IDE的重構功能,將變量SystemState改為SystemStatePerformer

          2. 在updateState()方法中調用SystemStatePerformerFactory

          3. 在測試代碼里面,調用manager.statePerformer.getState()

          重構后的代碼如下:

          package de.jingge.refactoring;

           

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


          public class SystemManager {

           

              SystemStatePerformer statePerformer;

           

              
          public void login() {

                  
          // call service#login()

                  updateState(LOGGEDIN);

              }

           

              
          public void logout() {

                  
          // call service#logout()

                  updateState(LOGGEDOUT);

              }

           

              
          public void idle() {

                  
          // call some other services

                  updateState(IDLE);

              }

           

              
          public void updateState(SystemState state) {

                  
          this.statePerformer = SystemStatePerformerFactory.getInstance()

                          getSystemStatePerformer(state);

                  statePerformer.perform();

              }

          }

          可以看到if else已經消失了。


          測試代碼也要做相應修改:
          package de.jingge.refactoring;

           

          import org.junit.AfterClass;

          import org.junit.BeforeClass;

          import org.junit.Test;

          import static org.junit.Assert.*;

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


          public class SystemManagerTest {

              
          private static SystemManager manager;

              @BeforeClass
              
          public static void setUpClass() throws Exception {

                  manager 
          = new SystemManager();

                  
          // add some service mock objects

              }

              @AfterClass
              
          public static void tearDownClass() throws Exception {

              }

              @Test
              
          public void login() {

                  manager.login();

                  assertEquals(manager.statePerformer.getState(), LOGGEDIN);

              }

              @Test
              
          public void logout() {

                  manager.logout();

                  assertEquals(manager.statePerformer.getState(), LOGGEDOUT);

              }

              @Test
              
          public void idle() {

                  manager.idle();

                  assertEquals(manager.statePerformer.getState(), IDLE);

              }

          }

          到這里重構已經差不多完成了,代碼已經更加面向對象了。這里還有一個小問題,在factory里面還有一個switch,這個和if else其實是沒有本質區別的,也就是說if else并沒有被完全移除掉。


          那么如何能夠徹底把這個switch也移除掉呢?很簡單,我們只需要在getSystemStatePerformer()方法被調用之前先創建所有 performer匿名類的實例,然后在該方法被調用時直接返回對應的實力。 那么具體如何實現呢,請看下一篇文章使用重構移除丑陋的if else代碼(5)




          聲明:本文版權歸作者所有,如需轉載請注明出處。

          posted on 2008-08-04 03:08 polygoncell 閱讀(1942) 評論(1)  編輯  收藏

          Feedback

          # re: 使用重構移除丑陋的if else代碼(4)[未登錄] 2008-08-04 10:18 Matthew
          在enum中加入多態方法吧。  回復  更多評論
            


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


          網站導航:
           
          主站蜘蛛池模板: 方山县| 昔阳县| 涟水县| 文登市| 海丰县| 孙吴县| 阿荣旗| 靖江市| 舟曲县| 宁都县| 会宁县| 兖州市| 封开县| 锡林浩特市| 辽源市| 乌兰浩特市| 武鸣县| 天等县| 金湖县| 满城县| 高雄市| 马山县| 富锦市| 凤山市| 阳江市| 浦东新区| 南雄市| 乌兰浩特市| 建湖县| 罗城| 商河县| 仲巴县| 汝阳县| 白玉县| 鄂尔多斯市| 城口县| 西藏| 泰来县| 绵竹市| 德昌县| 万源市|