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

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

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

    posts - 120,  comments - 19,  trackbacks - 0
    單一職責(zé)原則(SRP : Single Response Principle)

    就一個(gè)類(lèi)而言,應(yīng)該僅有一個(gè)引起它變化的原因。
    在這里,職責(zé)的定義是: “變化的原因”。

    對(duì)于何時(shí)遵循SRP有以下的考慮:
    1.如果應(yīng)用程序的變化會(huì)影響到類(lèi)中某一種職責(zé),那么就應(yīng)該將它與另一種職責(zé)分開(kāi),這樣做可以避免客戶(hù)應(yīng)用程序和類(lèi)中的這兩職責(zé)耦合在一起。
    2.如果應(yīng)用程序的變化總是會(huì)導(dǎo)致兩個(gè)職責(zé)同時(shí)變化,那么就不必要分離它們。實(shí)際上,分離它們會(huì)引起不必要的復(fù)雜性。

    從上可以得知:變化的軸線僅當(dāng)變化實(shí)際發(fā)生時(shí)才具有真正的意義。如果沒(méi)有征兆,那么去應(yīng)用SRP,或者任何其它原則都是不明智。

    實(shí)際應(yīng)用:持久化(Persistence)
    實(shí)際開(kāi)發(fā)中,考慮到業(yè)務(wù)規(guī)則是會(huì)頻繁改變的,而持久化的方式卻不會(huì)如此頻繁的變化,并且變化的原因也是完全不同的。如果把業(yè)務(wù)規(guī)則和持久化方式綁定到一起,就會(huì)為以后的開(kāi)發(fā)、維護(hù)造成麻煩。運(yùn)用分層(layer)架構(gòu)模式或者TDD開(kāi)發(fā)方式可以很早分離這兩個(gè)職責(zé),特殊情況下,還可以使用FACADE或者PROXY模式對(duì)設(shè)計(jì)進(jìn)行重構(gòu),分離這兩個(gè)職責(zé)。

    開(kāi)閉原則(OCP : The Open-Close Principle)

    描述:軟件實(shí)體(類(lèi)、模型、函數(shù)等等)應(yīng)該是可以擴(kuò)展的,但是不可修改。

    遵循開(kāi)閉原則設(shè)計(jì)出的模塊具有兩個(gè)主要的特征。它們是:
    1. “對(duì)于擴(kuò)展是開(kāi)放的”(Open for extension)。
    ?? 這意味著模塊的行為是可以擴(kuò)展的。當(dāng)應(yīng)用的需要改變時(shí),我們可以對(duì)模塊進(jìn)行擴(kuò)展,使其具有滿(mǎn)足那些改變的新行為。換句話(huà)說(shuō),我們可以改變模塊的功能。
    2. “對(duì)于更改是封閉的”(Closed for modification)。
    ?? 對(duì)模塊行為進(jìn)行擴(kuò)展時(shí),不必改動(dòng)模塊的源代碼或者二進(jìn)制代碼。模塊的二進(jìn)制可執(zhí)行版本,無(wú)論是可鏈接的庫(kù)、DLL或者Java的.jar文件,都無(wú)需改動(dòng)。

    對(duì)于OCP,關(guān)鍵的是 抽象
    模塊可以操作一個(gè)抽象體。由于模塊依賴(lài)于一個(gè)固定的抽象體,所以它對(duì)于更改可以是關(guān)閉的。同時(shí),通過(guò)從這個(gè)抽象體派生,也可以擴(kuò)展此模塊的行為。

    在許多方面,OCP都是面向?qū)ο笤O(shè)計(jì)的核心所在。但實(shí)際應(yīng)用中,濫用OCP原則也是錯(cuò)誤的。正確的做法是應(yīng)該僅僅對(duì)程序中呈現(xiàn)出頻繁變化的那些部分做出抽象。拒絕不成熟的抽象和抽象本身一樣重要。


    Liskov替換原則(LSP)

    描述:子類(lèi)型(subtype)必須能夠替換掉它們的基類(lèi)型(base type)。

    此原則是Barbara Liskov首次在1988年寫(xiě)下的。所以就叫做Liskov替換原則。她如此寫(xiě)到:
    “這里需要如下替換性質(zhì):若對(duì)每個(gè)類(lèi)型S的對(duì)象o1,都存在一個(gè)類(lèi)型T的對(duì)象o2,使得在所有針對(duì)T編寫(xiě)的程序P中,用o1替換o2后,程序P行為功能不變,則S是T的子類(lèi)型。

    LSP然我們得出一個(gè)非常重要的結(jié)論:一個(gè)模型,如果孤立的看,并不具有真正意義上的有效性。模型的有效性只能通過(guò)它的客戶(hù)程序來(lái)表現(xiàn)。

    在考慮一個(gè)特定設(shè)計(jì)是否恰當(dāng)時(shí),不能完全孤立的來(lái)看這個(gè)解決方案。必須要根據(jù)該設(shè)計(jì)的使用者所做出的合理假設(shè)來(lái)審視它。

    有誰(shuí)知道設(shè)計(jì)的使用者會(huì)做出什么樣的合理假設(shè)呢?大多數(shù)這樣的假設(shè)都很難預(yù)測(cè)。事實(shí)上,如果試圖去預(yù)測(cè)所有這些假設(shè),我們所得到的系統(tǒng)很可能會(huì)充滿(mǎn)不必要的復(fù)雜性的臭味。因此,像所有其它原則一樣了,通常最好的辦法就是只預(yù)測(cè)那些最明顯的對(duì)于LSP的違反情況,而推遲所有其它的預(yù)測(cè),直到出現(xiàn)相關(guān)的脆弱性的臭味時(shí),才去處理它們。

    IS-A是關(guān)于行為的。
    LSP清晰的指出,OOD中IS-A關(guān)系是就行為方式而言的,行為方式是可以進(jìn)行合理假設(shè)的,是客戶(hù)程序所依賴(lài)的。

    基于契約設(shè)計(jì)
    基于契約設(shè)計(jì)(DBC:Design By Contract)。使用DBC,類(lèi)的編寫(xiě)者能夠顯式的規(guī)定針對(duì)該類(lèi)的契約??蛻?hù)代碼的編寫(xiě)者可以通過(guò)該契約獲悉可以依賴(lài)的行為方式。契約是通過(guò)為每個(gè)方法聲明的前置條件(preconditions)和后置條件(postconditions)來(lái)指定的。要使一個(gè)方法得以執(zhí)行,前置條件必須要為真。執(zhí)行完畢后,該方法要保證后置條件為真。

    在單元測(cè)試中指定契約
    也可以通過(guò)編寫(xiě)單元測(cè)試的方式來(lái)指定契約??蛻?hù)代碼編寫(xiě)者會(huì)去查看這些單元測(cè)試,這樣他們就可以知道對(duì)于要使用的類(lèi),應(yīng)該做什么合理的假設(shè)。

    啟發(fā)式規(guī)則和習(xí)慣用法

    1.派生類(lèi)中的退化函數(shù)
    ? 在基類(lèi)中實(shí)現(xiàn)了f()方法,在派生類(lèi)中的函數(shù)f()就是退化的,派生類(lèi)中的退化函數(shù)并不總表示為違反LSP,但是當(dāng)存在這種情況時(shí),還是值得注意一下的。
    2.從派生類(lèi)中拋出異常
    ? 在派生類(lèi)的方法中添加了其基類(lèi)不會(huì)拋出的異常。如果基類(lèi)的使用者不期望這些異常,那么把它們添加到派生類(lèi)的方法中就會(huì)導(dǎo)致不可替換性。此時(shí)要遵循LSP,要么就必須改變使用者的期望,要么派生類(lèi)就不應(yīng)該拋出這些異常。

    總結(jié):OCP是OOD中很多原則的核心。如果這個(gè)原則應(yīng)用的有效,應(yīng)用程序就會(huì)具有更多的可維護(hù)性、可重用性以及健壯性。LSP是使OCP成為可能的主要原則之一。正是子類(lèi)型的可替換性才使得使用基類(lèi)類(lèi)型的模塊在無(wú)需修改的情況下就可以擴(kuò)展。這種可替換性必須是開(kāi)發(fā)人員可以隱式依賴(lài)的。因此,如果沒(méi)有顯式的強(qiáng)制基類(lèi)類(lèi)型的契約,那么代碼就必須良好的并且明顯的表達(dá)出這一點(diǎn)。
    ????? 術(shù)語(yǔ)IS-A的含義過(guò)于廣泛以至于不能作為子類(lèi)型的定義。子類(lèi)型的正確定義是“可替換性”,這里的可替換性可以通過(guò)顯式或者隱式的契約來(lái)定義。


    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=749737

    相關(guān)文章:



    posted on 2006-09-06 20:35 阿成 閱讀(333) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Java
    主站蜘蛛池模板: 亚洲国产精品午夜电影| 99在线观看视频免费| 美女被免费网站91色| 亚洲av专区无码观看精品天堂| 一区二区三区四区免费视频| 深夜福利在线免费观看| 亚洲一级毛片在线播放| 水蜜桃亚洲一二三四在线| 亚洲精品成人a在线观看| 卡1卡2卡3卡4卡5免费视频| 久久精品免费一区二区| 成人免费区一区二区三区 | 三年片在线观看免费| 菠萝菠萝蜜在线免费视频| 国产精品亚洲精品青青青| 亚洲系列国产精品制服丝袜第| 一本色道久久综合亚洲精品| 免费jlzzjlzz在线播放视频| 午夜免费福利在线| 免费人成再在线观看网站| 亚洲国产成人无码AV在线| 亚洲香蕉久久一区二区| 亚洲成无码人在线观看| 亚洲视频在线播放| 国产男女猛烈无遮挡免费视频| 青苹果乐园免费高清在线| 久久午夜免费视频| 中文日本免费高清| eeuss影院ss奇兵免费com| 无码AV动漫精品一区二区免费 | 久久青草免费91观看| 中文字幕一区二区三区免费视频| 男女男精品网站免费观看 | 久久精品国产亚洲Aⅴ蜜臀色欲| 中文字幕在线观看免费视频| 久久永久免费人妻精品| 日本免费在线观看| 久久午夜免费鲁丝片| 99久久99久久精品免费观看| 91精品啪在线观看国产线免费| 国产在线jyzzjyzz免费麻豆 |