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

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

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

    隨筆-31  評(píng)論-2  文章-0  trackbacks-0
    原則內(nèi)容:OCP原則就是"開-閉原則",一個(gè)軟件應(yīng)該對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉。
    解釋 :在設(shè)計(jì)一個(gè)模塊的時(shí)候,應(yīng)當(dāng)使得這個(gè)模塊可以在不被修改的前提下面被擴(kuò)展。換言之,應(yīng)該可以在不必修改源代碼的情況下改變這個(gè)
    模塊的行為。這個(gè)原則有2點(diǎn)要求:
    ×:擴(kuò)展開放
    ×:關(guān)閉修改
    滿足OCP原則系統(tǒng)的優(yōu)點(diǎn):
    ×:通過擴(kuò)展已有的軟件系統(tǒng),提供新的行為,可以使得軟件系統(tǒng)滿足新需求
    ×:已有的軟件模塊,特別是重要的抽象層模塊不能做變更,這使得變化中的軟件系統(tǒng)有一定的穩(wěn)定性和延續(xù)性。
    如何實(shí)現(xiàn)OCP原則:
    1、抽象是關(guān)鍵。
       對(duì)需要設(shè)計(jì)的系統(tǒng)進(jìn)行抽象,在此前提下面,讓抽象的實(shí)現(xiàn)機(jī)制千變?nèi)f化。這個(gè)抽象層必須預(yù)見到所有的可能的擴(kuò)展,任何實(shí)現(xiàn)的改變都不會(huì)改變?cè)摮橄蠼Y(jié)構(gòu)。這樣使得系統(tǒng)的抽象層無需修改,從而滿足OCP原則的第二條-關(guān)閉修改。
    2、對(duì)可變性的封裝原則
       OCP從另一個(gè)角度來說,就是EVP(principle of Encapsulation Variation)原則。即找到系統(tǒng)的可變因素,將之封裝起來。這個(gè)原則意味著2點(diǎn):
    ×:一種可變性不應(yīng)當(dāng)散落在代碼的很多角落里,而應(yīng)當(dāng)被封裝到一個(gè)對(duì)象里面。繼承應(yīng)當(dāng)被看    做是封裝變化的方法,而不應(yīng)當(dāng)被認(rèn)為是從一般的對(duì)象生成特殊的對(duì)象方法。
    ×:一種可變性不應(yīng)當(dāng)與另一種可變性混合在一起。所有的類圖的繼承結(jié)構(gòu)一般不會(huì)超過兩層,不然就意味著將兩種不同的可變性混合在一起。
    與其他設(shè)計(jì)原則的關(guān)系
    LSP原則:這個(gè)原則是說任何基類出現(xiàn)的地方,子類一定可以出現(xiàn)。
    這個(gè)原則是對(duì)OCP原則的補(bǔ)充,基類和子類的關(guān)系就是抽象化的具體體現(xiàn),所以LSP原則是對(duì)實(shí)現(xiàn)抽象化的具體步驟的規(guī)范。一般來說,違背了LSP原則,一定違反了OCP原則,反之不一定成立。
    CARP原則:這個(gè)原則講的是要盡可能的多用合成/聚合,而不是繼承關(guān)系達(dá)到復(fù)用的目的。
    CARP原則和LSP原則相輔相成。二者都是對(duì)實(shí)現(xiàn)OCP原則的具體步驟的規(guī)范。前者要求設(shè)計(jì)師首先考慮合成/聚合關(guān)系;后者要求在使用繼承關(guān)系的時(shí)候, 必須確定這個(gè)關(guān)系是符合一定條件的。CARP原則是OCP原則的必要條件,違反了這個(gè)原則,就無法使系統(tǒng)實(shí)現(xiàn)OCP原則這個(gè)目標(biāo)。
    DIP原則:這個(gè)原則是說要依賴于抽象,不要依賴于實(shí)現(xiàn)。
    DIP原則和OCP原則是目標(biāo)和手段的關(guān)系。OCP是目標(biāo),DIP是手段。要想實(shí)現(xiàn)OCP原則,必須堅(jiān)持DIP原則。違反了DIP原則,則不可能達(dá)到OCP原則要求。

    LoD原則:這個(gè)原則講的是一個(gè)軟件實(shí)體應(yīng)該盡可能少的和其他實(shí)體發(fā)生作用。
    當(dāng)一個(gè)system面臨功能擴(kuò)展的時(shí)候,其中會(huì)有一些模塊,他們需要修改的壓力比其他的模塊要大一些,如果這些模塊是相對(duì)孤立的,那么他們就不會(huì)將修改的 壓力傳遞給其他模塊。根據(jù)LoD原則設(shè)計(jì)的系統(tǒng),在功能需要擴(kuò)展的時(shí)候,會(huì)相對(duì)容易的做到對(duì)修改的關(guān)閉。LoD原則是一條通向OCP原則的道路。
    ISP原則:這個(gè)原則是說,應(yīng)當(dāng)為客戶端提供盡可能小的單獨(dú)接口,而不要提供大的總接口。ISP原則和LoD原則講的都是一個(gè)軟件實(shí)體與另一個(gè)軟件實(shí)體的通訊限制。廣義的LoD原則要求盡可能限制通訊的寬度和深度,ISP原則所限制的是通信寬度。
    一個(gè)重構(gòu)方法的討論
    “將條件轉(zhuǎn)移語句改寫成為多態(tài)性”是一條廣為流傳的代碼重構(gòu)做法。

    這一做法本身并不能保證“開-閉”原則,應(yīng)當(dāng)以“開-閉”原則判斷是否需要改寫成多態(tài)。條件轉(zhuǎn)移并不是錯(cuò)誤,如果需要,完全可以選擇使用條件轉(zhuǎn)移。

    如果一個(gè)條件轉(zhuǎn)移語句確實(shí)封裝了某種商務(wù)邏輯的可變性,那么將此種可變性封裝起來就符合“開-閉”原則設(shè)計(jì)思想了。如果一個(gè)條件轉(zhuǎn)移語句沒有涉及重 要的商務(wù)邏輯,或者不會(huì)隨著時(shí)間的變化而變化,也不意味著任何的可擴(kuò)展性,那么它就沒有涉及任何有意義的可變性。這時(shí)候?qū)⑦@個(gè)條件轉(zhuǎn)移語句改寫成多態(tài)性就 是一種沒有意義的浪費(fèi)。
    抽象類應(yīng)當(dāng)擁有盡可能多的共同代碼

     在一個(gè)繼承的等級(jí)結(jié)構(gòu)中,共同的代碼應(yīng)當(dāng)盡量向等級(jí)結(jié)構(gòu)的上方移動(dòng)。把重復(fù)的代碼從子類里面移動(dòng)到超類里面,可以提高代碼的復(fù)用率。在代碼發(fā)生改變時(shí),設(shè)計(jì)師之需要修改一個(gè)地方。

    抽象類應(yīng)當(dāng)擁有盡可能少的數(shù)據(jù)

    與代碼的移動(dòng)方向相反,數(shù)據(jù)的移動(dòng)方向是從抽象類到具體類,向等級(jí)結(jié)構(gòu)的下方移動(dòng)。一個(gè)對(duì)象的數(shù)據(jù)不論是否使用都會(huì)占用資源,所以應(yīng)當(dāng)放到等級(jí)結(jié)構(gòu)的低端。

     

    什么時(shí)候才應(yīng)當(dāng)使用繼承復(fù)用

    1.子類是超類的一個(gè)特殊種類,而不是超類的一個(gè)角色,Is-A才符合繼承關(guān)系。

    2.永遠(yuǎn)不會(huì)出現(xiàn)需要將子類換成另一個(gè)類的子類的情況。

    3.子類具有擴(kuò)展超類的責(zé)任,而不是具有置換掉(Override)和注銷掉(Nullify)超類的責(zé)任。

    4.只有在分類學(xué)角度上有意義時(shí),才可以使用繼承,不要從工具類繼承。

    posted on 2009-08-03 23:15 xiaoxinchen 閱讀(978) 評(píng)論(0)  編輯  收藏

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 一级毛片成人免费看a| 真人做A免费观看| 亚洲美女视频一区| 毛片免费观看视频| 一个人看的免费高清视频日本| 国产AV无码专区亚洲A∨毛片| 亚洲人成网站免费播放| 一级毛片一级毛片免费毛片| 老色鬼久久亚洲AV综合| 日本一道综合久久aⅴ免费| AAAAA级少妇高潮大片免费看 | 亚洲人成网国产最新在线| www亚洲一级视频com| 无码一区二区三区免费| 日韩亚洲翔田千里在线| 美国毛片亚洲社区在线观看 | 在线91精品亚洲网站精品成人| 久久精品国产69国产精品亚洲| 女人与禽交视频免费看| 亚洲人成在线播放| 亚洲中久无码不卡永久在线观看| 99国产精品免费观看视频| 免费VA在线观看无码| 亚洲伊人成无码综合网 | 亚洲中文字幕一二三四区苍井空| 国产亚洲自拍一区| 日韩高清在线免费看| 91香蕉国产线在线观看免费| 未满十八私人高清免费影院| 亚洲情A成黄在线观看动漫软件| 亚洲国产三级在线观看| 亚洲国产成人VA在线观看| 99精品全国免费观看视频| 一级毛片全部免费播放| 国产免费MV大全视频网站| AV激情亚洲男人的天堂国语| 亚洲国产成人精品无码一区二区 | 岛国片在线免费观看| 222www免费视频| 免费国产在线视频| 亚洲日韩乱码中文无码蜜桃臀|