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

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

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

    ivaneeo's blog

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

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks
    讓我們從一個(gè)簡(jiǎn)單的Person class開始:
    class Person...
        public String getName() {
           return _name;
        }
        public String getTelephoneNumber() {
           return ("(" + _officeAreaCode + ")" + _officeNumber);
        }
        String getOfficeAreaCode() {
           return _officeAreaCode;
        }
        void setOfficeAreaCode(String arg) {
           _officeAreaCode = arg;
        }
        String getOfficeNumber() {
           return _officeNumber;
        }
        void setOfficeNumber(String arg) {
           _officeNumber = arg;
        }

        private String _name;
        private String _officeAreaCode;
        private String _officeNumber;

    在這個(gè)例子,我可以將[與電話號(hào)碼相關(guān)]的行為分離到一個(gè)獨(dú)立class中。首先我要定義一個(gè)TelephoneNumber class來表示[電話號(hào)碼]這個(gè)概念:
    class TelephoneNumber {
    }
    易如反掌!然后,我要建立從Person到TelephoneNumber的連接:
    class Person...
        private TelephoneNumber _officeTelephone = new TelephoneNumber();
    現(xiàn)在,我運(yùn)用Move Field(146)移動(dòng)一個(gè)值域:
    class TelephoneNumber {
        String getAreaCode() {
           return _areaCode;
        }
        void setAreaCode(String arg) {
           _areaCode = arg;
        }
        private String _areaCode;
    }

    class Person...
        public String getTelephoneNumber() {
           return ("(" + getOfficeAreaCode() + ")" + _officeNumber);
        }
        String getOfficeAreaCode() {
           return _officeTelephone.getAreaCode();
        }
        void setOfficeAreaCode(String arg) {
           _officeTelephone.setAreaCode(arg);
        }

    然后我可以移動(dòng)其他值域,并運(yùn)用Move Method(142)將相關(guān)函數(shù)移動(dòng)到TelephoneNumber class中:
    class Person...
        public String getName() {
           return _name;
        }
        public String getTelephoneNumber() {
           return _officeTelephone.getTelephoneNumber();
        }
        TelephoneNumber getOfficeTelephone() {
           return _officeTelephone;
        }

        private String _name;
        private TelephoneNumber _officeTelephone = new TelephoneNumber();


    class TelephoneNumber...
        public String getTelephoneNumber() {
           return ("(" + _areaCode + ")" + _number);
        String getAreaCode() {
           return _areaCode;
        }
        void setAreaCode(String arg) {
           _areaCode = arg;
        }
        String getNumber() {
           return _number;
        }
        void setNumber(String arg) {
           _number = arg;
        }
        private String _number;
        private String _areaCode;


    下一步要做的決定是:要不要對(duì)客戶揭示這個(gè)新class?我可以將Person中[與電話號(hào)碼相關(guān)]的函數(shù)委托(delegating)至 TelephoneNumber,從而完全隱藏這個(gè)新class;也可以直接將對(duì)用戶曝光。我還可以將它暴露給部分用戶(位于同一個(gè)package中的用 戶),而不暴露給其他用戶。

    如果我選擇暴露新class嗎,我就需要考慮別名(aliasing)帶來的危險(xiǎn)。如果我暴露了TelephoneNumber,而有個(gè)用戶修改了對(duì)象中的_areaCode值域值,我又怎么能知道呢?而且,做出修改的可能不是直接用戶,而是用戶的用戶的用戶。


    面對(duì)這個(gè)問題,我有下列數(shù)種選擇:
    1.允許任何對(duì)象修改TelephoneNumber對(duì)象的任何部分。這就使得TelephoneNumber對(duì)象成為引用對(duì)象(reference object),對(duì)于我應(yīng)該考慮使用Change Value to Reference(179)。這種情況下,Person應(yīng)該是TelephoneNumber的訪問點(diǎn)。
    2.不許任何人[不通過Person對(duì)象就修改TelephoneNumber對(duì)象]。為了達(dá)到目的,我可以將TelephoneNumber設(shè)為不可修改的(immutable),或?yàn)樗峁┮粋€(gè)不可修改的接口(immutable interface)。
    3.另一個(gè)辦法是:先復(fù)制一個(gè)TelephoneNumber對(duì)象,然后將復(fù)制得到的新對(duì)象傳遞給用戶。但這可能會(huì)造成一定程度的迷惑,因?yàn)槿藗儠?huì)認(rèn)為他們可以修改TelephoneNumber對(duì)象值。此外,如果同一個(gè)TelephoneNumber對(duì)象被傳遞給多個(gè)用戶,也可能在用戶之間造成別名(aliasing)問題。

    Extract Class(149)是改善并發(fā)(concurrent)程序的一種常用技術(shù),因?yàn)樗鼓憧梢蕴釤捄蟮膬蓚€(gè)classes分別加鎖(locks)。
    posted on 2005-08-30 16:33 ivaneeo 閱讀(208) 評(píng)論(0)  編輯  收藏 所屬分類: refactoring-從地獄中重生
    主站蜘蛛池模板: 在线亚洲v日韩v| 亚洲第一福利网站在线观看| 57pao一国产成视频永久免费| 99久久精品日本一区二区免费| 成年人网站在线免费观看| 亚洲av日韩av欧v在线天堂| 亚洲AV无码久久| 国产亚洲视频在线播放大全| 免费无码又爽又刺激高潮软件| 免费看成人AA片无码视频羞羞网| 日本一区二区三区日本免费| 国产亚洲一区二区三区在线观看 | 久久精品免费观看| 两个人的视频高清在线观看免费 | 一级毛片完整版免费播放一区| 免费无遮挡无码永久视频| 全亚洲最新黄色特级网站| 亚洲综合在线视频| 99视频免费在线观看| 亚洲&#228;v永久无码精品天堂久久| 亚洲av无码一区二区三区乱子伦 | 麻豆亚洲av熟女国产一区二| 老外毛片免费视频播放| 特级淫片国产免费高清视频| 亚洲精品美女在线观看| 免费日本一区二区| 亚洲成a人片在线观看无码| jizz在线免费观看| 国产亚洲综合久久系列| a毛片在线免费观看| 国产亚洲精久久久久久无码AV| 青娱乐在线视频免费观看| 大学生高清一级毛片免费| 亚洲成人激情小说| 搡女人真爽免费视频大全| 亚洲第一综合天堂另类专| 免费永久在线观看黄网站| 亚洲6080yy久久无码产自国产 | 九九久久精品国产免费看小说| 日本亚洲免费无线码| 亚洲日韩国产一区二区三区在线|