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

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

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

    莊周夢(mèng)蝶

    生活、程序、未來(lái)
       :: 首頁(yè) ::  ::  :: 聚合  :: 管理

    談NullObject模式

    Posted on 2007-07-31 17:48 dennis 閱讀(5176) 評(píng)論(7)  編輯  收藏 所屬分類: 模式與架構(gòu)
        知道這個(gè)模式還是通過(guò)《重構(gòu)》,這個(gè)模式的出現(xiàn)還是了為了解決代碼重復(fù)的壞味道。在項(xiàng)目中很經(jīng)常見(jiàn)到類似下面這樣的代碼:
    if(prj.getProjectId==null)
        plan.setCost(
    0.0);
    else
        plan.setCost(prj.getCost());

       我們?cè)诤芏嗟胤接蓄愃频臋z查對(duì)象是否為null,如果為null,需要一個(gè)默認(rèn)值等等這樣的場(chǎng)景。顯然,代碼重復(fù)是壞味道,怎么消除這個(gè)壞味道呢?答案就是使用NullObject替代之,Null Object繼承原對(duì)象。
    class NullProject extends Project{
       
    public boolean isNull(){
          
    return true;
       }
    }
    class Project{
       
    private double cost;
       
    private String projectId;
       .
       
    public boolean isNull(){
            
    return false;
       }
    }

    那么,原來(lái)的代碼可以改寫為:
    if(prj.isNull())
        plan.setCost(
    0.0);
    else
        plan.setCost(prj.getCost());

        如果Null Object的引入僅僅是帶來(lái)這個(gè)好處,似乎沒(méi)有理由讓我們多敲這么多鍵盤。問(wèn)題的關(guān)鍵是類似上面這樣的判斷也許出現(xiàn)在很多處,那么有價(jià)值的技巧出現(xiàn)了,我們?cè)贜ullObject覆寫getCost,提供缺省值:
    class NullProject extends Project{
       
    public boolean isNull(){
          
    return true;
       }
       
    public double getCost(){
          
    return 0.0;      
       }
    }
        因此,檢查對(duì)象是否為null的代碼可以去掉if...else了:
    plan.setCost(prj.getCost());

        請(qǐng)注意,只有那些大多數(shù)客戶端代碼都要求null object做出相同響應(yīng)時(shí),這樣的行為才有意義。比如我們這里當(dāng)工程id為null,很多地方要求費(fèi)用就默認(rèn)為0.0。 特殊的行為我們?nèi)匀皇褂胕sNull進(jìn)行判斷。
        當(dāng)然,另外在需要返回NullObject的地方,你應(yīng)該創(chuàng)建一個(gè)null object以替代一般的對(duì)象,我們可以建立一個(gè)工廠方法:

    class Project{
       
    private double cost;
       
    private String projectId;
       .
       
    public boolean isNull(){
            
    return false;
       }
       
    public Project createNullProject(){
            
    return new NullProject();
       }
    }

       Null Object模式帶來(lái)的好處:減少了檢查對(duì)象是否為null的代碼重復(fù),提高了代碼的可讀性,通常這些Null Object也可以為單元測(cè)試帶來(lái)簡(jiǎn)便。


    評(píng)論

    # re: 談NullObject模式[未登錄](méi)  回復(fù)  更多評(píng)論   

    2007-07-31 23:47 by xmlspy
    很早以前用過(guò)這個(gè)模式,不過(guò)感覺(jué)實(shí)在沒(méi)有必要
    很麻煩

    # re: 談NullObject模式  回復(fù)  更多評(píng)論   

    2007-08-01 07:48 by dennis
    @xmlspy
    如果只是少數(shù)地方有這樣的條件判斷,我也認(rèn)為實(shí)在沒(méi)有必要,不過(guò)在我們項(xiàng)目的場(chǎng)景中,賦予默認(rèn)值以及check null經(jīng)常出現(xiàn),因此使用此模式后確實(shí)大幅度減少了重復(fù)代碼,取舍之間就看大家自己判斷

    # re: 談NullObject模式  回復(fù)  更多評(píng)論   

    2007-08-01 09:25 by dreamstone
    對(duì)于長(zhǎng)業(yè)務(wù)流程,多個(gè)條件分支的情況下還是挺有用的。
    記得曾經(jīng)做過(guò)一個(gè)報(bào)文解析系統(tǒng),當(dāng)時(shí)我為了遍歷樹(shù)不為空做過(guò)一個(gè)類似的結(jié)構(gòu)。

    # re: 談NullObject模式  回復(fù)  更多評(píng)論   

    2007-08-01 11:31 by 金大為
    我想,我們常常用的 Collections.EMPTY_LIST之類的空列表,空map。
    和這里說(shuō)的NullObject算是同一類技巧吧。

    # re: 談NullObject模式  回復(fù)  更多評(píng)論   

    2007-08-01 13:43 by dennis
    @金大為
    有點(diǎn)類似的味道,java的collection框架真是模式大集合

    # re: 談NullObject模式  回復(fù)  更多評(píng)論   

    2007-08-03 09:35 by 一名
    這是故意讓null作為一種值來(lái)傳遞時(shí)候用的吧?如果我在數(shù)據(jù)庫(kù)查詢時(shí)候,出現(xiàn)異常,or映射的框架返回的null對(duì)象,那怎么辦?不是還是要判斷是否為null的情況嗎?

    # re: 談NullObject模式  回復(fù)  更多評(píng)論   

    2007-08-03 09:43 by dennis
    @一名
    這時(shí)候你應(yīng)當(dāng)返回一個(gè)NullObject,而不是一般的Object。這個(gè)模式有一定的適用場(chǎng)景,請(qǐng)看文中所述
    主站蜘蛛池模板: 在线观看视频免费国语| 国产亚洲福利在线视频| 国产国产人免费人成免费视频| 日韩精品无码免费一区二区三区| 羞羞漫画小舞被黄漫免费| 亚洲熟妇成人精品一区| 一区二区三区亚洲| 国产成人精品日本亚洲| 亚洲国产精品成人久久蜜臀| 午夜老司机免费视频| 青青草a免费线观a| 69视频免费观看l| 免费黄网站在线观看| 久久www免费人成看国产片| 国产一区二区三区亚洲综合 | 中文字幕在线视频免费| 国产成人综合亚洲绿色| 亚洲欧美日本韩国| 亚洲私人无码综合久久网| 亚洲中文字幕久久精品无码2021| 亚洲精品国产成人中文| 亚洲国产精品久久66| 久久精品国产99精品国产亚洲性色| 亚洲中文字幕无码爆乳AV| 亚洲美女在线国产| 亚洲情a成黄在线观看| 亚洲福利中文字幕在线网址| 四虎影视永久免费观看| 国产婷婷高清在线观看免费| 国产成人免费a在线资源| 国产婷婷高清在线观看免费| 免费永久在线观看黄网站| 国产乱色精品成人免费视频| 国产男女猛烈无遮挡免费视频网站 | 久久精品成人免费网站| 久久久国产精品福利免费| 久久国产精品免费专区| 99ee6热久久免费精品6| 99久久99这里只有免费费精品| 成人免费午夜无码视频| 午夜影视在线免费观看|