• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            OOD原則:SRP、OCP以及LSP

            Posted on 2008-05-14 13:21 RichardHe 閱讀(498) 評論(0)  編輯 收藏 引用 所屬分類: [轉(zhuǎn)]
            單一職責(zé)原則(SRP : Single Response Principle)

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

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

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

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

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

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

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

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

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


            Liskov替換原則(LSP)

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

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

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

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

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

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

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

            在單元測試中指定契約
            也可以通過編寫單元測試的方式來指定契約。客戶代碼編寫者會去查看這些單元測試,這樣他們就可以知道對于要使用的類,應(yīng)該做什么合理的假設(shè)。

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

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

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

            posts - 94, comments - 138, trackbacks - 0, articles - 94

            Copyright © RichardHe

            人妻中文久久久久| 久久er99热精品一区二区| AV狠狠色丁香婷婷综合久久| 精品久久久久久久久午夜福利| 久久精品亚洲一区二区三区浴池| 一本一本久久a久久综合精品蜜桃 一本一道久久综合狠狠老 | 久久久国产精品网站| 久久精品国产91久久综合麻豆自制| 国产精品久久久久9999| 久久强奷乱码老熟女网站| 精品久久亚洲中文无码| 国内精品久久久久久久涩爱 | 午夜不卡久久精品无码免费| 久久香综合精品久久伊人| 久久精品国产一区二区三区| 一本一本久久aa综合精品| 久久精品国产亚洲av瑜伽| 国产精品99久久精品| 伊人久久久AV老熟妇色| 日日狠狠久久偷偷色综合0 | 久久91这里精品国产2020| 亚洲国产精品久久久天堂| 日韩一区二区三区视频久久| 国产精品熟女福利久久AV| 久久久久国产精品熟女影院| 日韩电影久久久被窝网| 久久婷婷五月综合成人D啪| 伊人久久综合热线大杳蕉下载| 久久久久人妻精品一区二区三区 | 久久av高潮av无码av喷吹| 国产精品久久成人影院| 亚洲国产成人久久综合碰碰动漫3d| 浪潮AV色综合久久天堂| 国产成人久久精品激情| 国产精品免费看久久久 | 亚洲七七久久精品中文国产| 久久精品国产第一区二区| 亚洲国产另类久久久精品黑人| 久久亚洲日韩看片无码| 久久Av无码精品人妻系列| 国产2021久久精品|