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

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

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

    PC的blog

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

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      9 Posts :: 0 Stories :: 54 Comments :: 0 Trackbacks
    我們知道因為編程語言的限制,歷史遺留下來的系統總是有很多的毛病,不夠面向對象,尤其是很多系統濫用if else。我曾經見過一個項目,大家基本上就是寫一個方法,然后在里面if else套if esle得嵌套了好幾層,難看就不必說了,這種代碼根本就沒法維護。

    今天我就使用從實際項目中提煉出來的例子來講解一下如何將這類代碼變得更加面向對象 - 重構成模式并且添加測試代碼,

    先來看一個丑陋的類:

    package de.jingge.refactoring;

     

    public class SystemManager {

     

        
    public static final int LOGGEDIN = 0;

        
    public static final int LOGGEDOUT = 1;

        
    public static final int IDLE = 2;

        
    int state;

     

        
    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(int state) {

            
    if (state == LOGGEDIN) {

                
    // do something after logging in is successful,

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

            } 
    else if (state == LOGGEDOUT) {

                
    // do something after logging out is successful,

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

            } 
    else if (state == IDLE) {

                
    // do something after the user is idle,

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

            } 
    else {

                
    throw new IllegalArgumentException("unknown state");

            }

            
    this.state = state;

        }

    }


    這里我們展示了一個 SystemManager,它負責處理用戶在系統中的狀態:登入(logged in),登出(logged out),以及空閑(idle)。從代碼中可以看到,這個類用了int來定義狀態并且因此導致了updatteState()方法里面出現大量if else。從目前看來這些if else是無法避免的,應為這個類需要針對不同的狀態作出反應。隨著狀態的增加,if else的數量也會繼續增加。這個解決方案顯然很差。

    那么怎么樣才能讓這個類更加地面向對象呢?

    在處理面向對象之前,我們首先要編寫一個測試類,這也是處理這類歷史遺留下來代碼所必需做的第一步,只有在測試代碼的保護下,我們才能放心大膽地進行重構。

    初步的測試代碼如下:

    package de.jingge.refactoring;

    import org.junit.AfterClass;
    import org.junit.BeforeClass;
    import org.junit.Test;
    import static org.junit.Assert.*;



    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.state, SystemManager.LOGGEDIN);

        }

        @Test
        
    public void logout() {

            manager.logout();

            assertEquals(manager.state, SystemManager.LOGGEDOUT);

        }

        @Test
        
    public void idle() {

            manager.idle();

            assertEquals(manager.state, SystemManager.IDLE);

        }

    }

    運行測試代碼->通過。

    在下一篇文章我們將正式開始重構。地址:使用重構移除丑陋的if else代碼(2)




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

    posted on 2008-08-04 02:36 polygoncell 閱讀(2700) 評論(3)  編輯  收藏

    Feedback

    # re: 使用重構移除丑陋的if else代碼(1) 2008-08-04 09:07 miaomiao
    汗,要是我寫肯定也是if esle結構的.  回復  更多評論
      

    # re: 使用重構移除丑陋的if else代碼(1) 2008-08-04 11:47 殘夢追月
    我也是if else……黨!  回復  更多評論
      

    # re: 使用重構移除丑陋的if else代碼(1) 2008-08-04 15:24 隔葉黃鶯
    google 廣告太多,影響了我繼續看這個系列的心情。  回復  更多評論
      


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


    網站導航:
     
    主站蜘蛛池模板: 欧洲人免费视频网站在线| 国产午夜亚洲精品不卡| 国产一精品一AV一免费| 亚洲国产成人影院播放| 国产亚洲精品仙踪林在线播放| 女人18毛片a级毛片免费视频| 亚洲人成在久久综合网站| 丁香花免费完整高清观看| 亚洲中文字幕无码亚洲成A人片| 最近中文字幕无免费视频| 亚洲AV无码片一区二区三区| 国产一区二区三区免费在线观看| 大桥未久亚洲无av码在线| 国产18禁黄网站免费观看| 日本黄页网址在线看免费不卡| 亚洲片一区二区三区| 一级免费黄色毛片| 亚洲国产成人精品无码区在线观看 | 亚洲国产日韩女人aaaaaa毛片在线| 97公开免费视频| 亚洲人精品亚洲人成在线| 日本免费网站观看| 国产精品免费视频观看拍拍| 久久精品国产亚洲av四虎| 日韩在线播放全免费| 亚洲欧美日韩中文二区| 亚洲欧洲自拍拍偷精品 美利坚| 国产一精品一AV一免费| 久久精品国产亚洲AV久| 无码欧精品亚洲日韩一区夜夜嗨| XXX2高清在线观看免费视频| 亚洲综合久久成人69| 国产精品无码一区二区三区免费 | 亚洲国产精品线观看不卡| 国产精品久免费的黄网站| 免费人成在线观看视频高潮| 亚洲经典在线观看| 免费观看国产小粉嫩喷水| a级毛片免费播放| 亚洲欧美日韩久久精品| 国产成A人亚洲精V品无码性色|