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

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

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

    ivaneeo's blog

    自由的力量,自由的生活。

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks
    范例(Examples)
    下面有一個代表[定單]的Order class,其中以一個字符串記錄定單客戶。現在,我希望改為以一個對象來表示客戶信息,這樣我就有充裕的彈性保存客戶地址、信用等級等等信息,也得以安置這些信息的操作行為。Order class最初如下:
    class Order...
        public Order(String customer) {
           _customer = cusomer;
        }

        public String getCustomer() {
           return _customer;
        }
       
        public void setCustomer(String arg) {
           _customer = arg;
        }
        private String _customer;

    Order class的客戶代碼可能像下面這樣:
    private static int numberOfOrdersFor(Collection orders, String customer) {
        int result = 0;
        Iterator iter = orders.iterator();
        while(iter.hasNext()) {
           Order each = (Order)iter.next();
           if(each.getCustomer().equals(customer)) result ++;
        }
        return result;
    }

    首先,我要新建一個Customer class來表示[客戶]概念。然后在這個class中建立一個final值域,用以保存一個字符串,這是Order class目前所使用的。我將這個新值域命名為_name,因為這個字符串的用途就是記錄客戶名稱。此外我還要為這個字符串加上取值函數(getter) 和構造函數(constructor)。
    class Customer {
        public Customer(String name) {
           _name = name;
        }

        public String getName() {
           return _name;
        }
        private final String _name;
    }

    現在,我要將Order中的_customer值域的型別修改為Customer;并修改所有引用此一值域的函數,讓它們恰當地改而引用Customer實體。其中取值函數和構造函數的修改都很簡單;至于設值函數(setter),我讓它創建一份Customer實體。
    class Order...
        public Order(String customer) {
           _customer = new Customer(customer);
        }

        public String getCustomer() {
           return _customer.getName();
        }
       
        public void setCustomer(String arg) {
           _customer = new Customer(arg);
        }
        private Customer _customer;

    設值函數需要創建一份Customer實體,這是因為以前的字符串是個實值對象(value object),所以現在的Customer對象也應該是個實值對象。這也就意味每個Order對象都包含自己的一個Customer對象。注意這樣一條 規則:實值對象應該是不可修改內容的--這便可以避免一些討厭的[別名](aliasing)錯誤。日后或許我會想讓Customer對象成為引用對象(reference object),但那是另一項重構手法的責任。現在我可以編譯并測試了。

    我需要觀察Order class中的_customer值域的操作函數,并作出一些修改,使它更好地反映出修改后的新形勢。對于取值函數,我會用Rename Method(273)改變其名稱,讓它更清晰地表示,它所返回的是消費者名稱,而不是個Customer對象。
    public String getCustomerName() {
        return _customer.getName();
    }

    至于構造函數和設值函數,我就不必修改其簽名(signature)了,但參數名稱得改:
    public Order(String customerName) {
        _customer = new Customer(customerName);
    }
    public void setCustomer(String customerName) {
        _customer = new Customer(customerName);
    }

    本次 重構到此為止。但是,這個案例和其他很多案例一樣,還需要一個后續步驟。如果想在Customer中加入信用等級、地址之類的其他信息,現在還做不到,因為目前的Customer還是被作為實值對象(value object)來對待,每個Order對象都擁有自己的Customer對象。為了給Customer class加上信用等級、地址之類的屬性,我必須運用Change Value to Reference(179),這么一來屬于同一客戶的所有Order對象就可以共享同一個Customer對象。馬上你就可以看到這個例子。
    posted on 2005-09-01 09:59 ivaneeo 閱讀(205) 評論(0)  編輯  收藏 所屬分類: refactoring-從地獄中重生
    主站蜘蛛池模板: 久久亚洲精品人成综合网| 好大好深好猛好爽视频免费| 亚洲综合日韩久久成人AV| 青娱乐在线免费观看视频| 永久免费av无码网站大全| 亚洲精品永久在线观看| 免费无码一区二区三区蜜桃大| 亚洲日韩中文字幕一区| 日日AV拍夜夜添久久免费| 国产成人亚洲精品无码AV大片| 四虎永久在线精品视频免费观看| 日韩亚洲人成在线综合| 国产免费小视频在线观看| 一级特级aaaa毛片免费观看| 亚洲综合伊人久久大杳蕉| 久久久久久AV无码免费网站下载 | 国产成人免费a在线视频app| 亚洲国产成人久久一区二区三区| 国产美女无遮挡免费网站| 免费观看四虎精品成人| 亚洲精品乱码久久久久久久久久久久| 国产精品免费无遮挡无码永久视频| 久久亚洲国产精品成人AV秋霞| 足恋玩丝袜脚视频免费网站| 亚洲五月综合网色九月色| 国产精品深夜福利免费观看| 免费激情网站国产高清第一页| 亚洲区小说区图片区QVOD| 18女人腿打开无遮掩免费| 亚洲欧美综合精品成人导航| 亚洲国产精品一区二区九九| 免费无码AV一区二区| 国产亚洲美日韩AV中文字幕无码成人| 男女作爱在线播放免费网站| 中文文字幕文字幕亚洲色| 亚洲国产日韩在线观频| WWW国产亚洲精品久久麻豆| 亚洲性在线看高清h片| 久久WWW免费人成一看片| 特色特黄a毛片高清免费观看| 亚洲五月六月丁香激情|