資源描述:
《0面向?qū)ο笤O(shè)計(jì)原則》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、面向?qū)ο笤O(shè)計(jì)的原則正如牛頓三大定律在經(jīng)典力學(xué)中的位置一樣,“開■閉''原則(Open-ClosedPrinciple)是面向?qū)ο蟮目蓮?fù)用設(shè)計(jì)(ObjectOrientedDesign或00D)的基石。其他設(shè)計(jì)原則(里氏代換原則、依賴倒轉(zhuǎn)原則、合成/聚合復(fù)用原則、辿米特法則、接口隔離原則)是實(shí)現(xiàn)“開-閉”原則的手段和工具?!?、“開■閉^原則(Open-ClosedPrinciple5OCP)1?1“開-閉,源則的定義及優(yōu)點(diǎn)1)定義:一個軟件實(shí)體應(yīng)當(dāng)對擴(kuò)展開放,對修改關(guān)Softwareentitiesshouldbeopenforextension,butclosedformodificati
2、on.)□即在設(shè)計(jì)一個模塊的時候,應(yīng)當(dāng)使這個模塊可以在不被修改的前提下被擴(kuò)展。2)滿足“開-閉瞧則的系統(tǒng)的優(yōu)點(diǎn)a)通過擴(kuò)展已有的軟件系統(tǒng),可以提供新的行為,以滿足對軟件的新需求,使變化屮的軟件系統(tǒng)有一定的適應(yīng)性和靈活性。b)已有的軟件模塊,特別是最重要的抽彖層模塊不能再修改,這就使變化屮的軟件系統(tǒng)有一定的穩(wěn)定性和延續(xù)性。c)這樣的系統(tǒng)同時滿足了可復(fù)用性與可維護(hù)性。1.2如何實(shí)現(xiàn)“開?閉”原則在面向?qū)ο笤O(shè)計(jì)中,不允許更改的是系統(tǒng)的抽象層,而允許擴(kuò)展的是系統(tǒng)的實(shí)現(xiàn)層。換言之,定義一個一勞永逸的抽象設(shè)計(jì)層,允許盡可能多的行為在實(shí)現(xiàn)層被實(shí)現(xiàn)。解決問題關(guān)鍵在于抽象化,抽象化是面向?qū)ο笤O(shè)計(jì)的第一個核心
3、本質(zhì)。對一個事物抽象化,實(shí)質(zhì)上是在概括歸納總結(jié)它的本質(zhì)。抽象讓我們抓住最最重要的東西,從更高一層去思考。這降低了思考的復(fù)雜度,我們不用同時考慮那么多的東西。換言之,我們封裝了事物的本質(zhì),看不到任何細(xì)節(jié)。在面向?qū)ο缶幊讨?,通過抽象類及接口,規(guī)定了具體類的特征作為抽象層,相對穩(wěn)定,不需更改,從而滿足“對修改關(guān)閉S而從抽象類導(dǎo)出的具體類可以改變系統(tǒng)的行為,從而滿足“對擴(kuò)展開放覽對實(shí)體進(jìn)行擴(kuò)展時,不必改動軟件的源代碼或者二進(jìn)制代碼。關(guān)鍵在于抽象。1.3對可變性的封裝原則"開■閉”原則也就是"對可變性的封裝原則"(PrincipleofEncapsulationofVariation,EVP)。即找
4、到一個系統(tǒng)的可變因素,將之封裝起來。換言之,在你的設(shè)計(jì)中什么可能會發(fā)生變化,應(yīng)使之成為抽象層而封裝,而不是什么會導(dǎo)致設(shè)計(jì)改變才封裝?!皩勺冃缘姆庋b原則”意味著:a)—種可變性不應(yīng)當(dāng)散落在代碼的許多角落,而應(yīng)當(dāng)被封裝到一個對象里面。同一可變性的不同表象意味著同一個繼承等級結(jié)構(gòu)中的具體子類。因此,此處可以期待繼承關(guān)系的出現(xiàn)。繼承是封裝變化的方法,而不僅僅是從一般的對象生成特殊的對象。b)—種可變性不應(yīng)當(dāng)與另一種可變性混合在一起。作者認(rèn)為類圖的繼承結(jié)構(gòu)如果超過兩層,很可能意味著兩種不同的可變性混合在了一起。使用“可變性封裝原則”來進(jìn)行設(shè)計(jì)可以使系統(tǒng)遵守“開■閉”原則。即使無法百分之百的做到“開
5、■閉”原則,但朝這個方向努力,可以顯著改善一個系統(tǒng)的結(jié)構(gòu)。二、里氏代換原則(LiskovSubstitutionPrinciple,LSP)2.1概念定義:如果對每一個類型為T1的對象01,都有類型為T2的對象02,使得以T1定義的所有程序P在所有的對象01都代換為02時,程序P的行為沒有變化,那么類型T2是類型T1的子類型。即,一個軟件實(shí)體如果使用的是一個基類的話,那么一定適用于其子類。而且它覺察不出基類對象和子類對象的區(qū)別。也就是說,在軟件里面,把基類都替換成它的子類,程序的行為沒有變化。反過來的代換不成立,如果一個軟件實(shí)體使用的是一個子類的話,那么它不一定適用于基類。任何基類可以出現(xiàn)
6、的地方,子類一定可以出現(xiàn)?;谄跫s的設(shè)計(jì)、抽象出公共部分作為抽象基類的設(shè)計(jì)。2.2里氏代換原則與“開?閉,源則的關(guān)系實(shí)現(xiàn)“開■閉”原則的關(guān)鍵步驟是抽象化?;惻c子類之間的繼承關(guān)系就是抽象化的體現(xiàn)。因此里氏代換原則是對實(shí)現(xiàn)抽象化的具體步驟的規(guī)范。違反里氏代換原則意味著違反了“開■閉”原則,反之未必。三、依賴倒轉(zhuǎn)原則(dependenceinversionprinciple,DIP〉3.1概念依賴倒轉(zhuǎn)原則就是要依賴于抽象,不要依賴于實(shí)現(xiàn)。(Abstractionsshouldnotdependupondetails.Detailsshoulddependuponabstractions.)要針
7、對接口編程,不要針對實(shí)現(xiàn)編程。(Programtoaninterface,notanimplementation.)也就是說應(yīng)當(dāng)使用接口和抽象類進(jìn)行變量類型聲明、參數(shù)類型聲明、方法返還類型說明,以及數(shù)據(jù)類型的轉(zhuǎn)換等。而不耍用具體類進(jìn)行變量的類型聲明、參數(shù)類型聲明、方法返還類型說明,以及數(shù)據(jù)類型的轉(zhuǎn)換等。要保證做到這一點(diǎn),一個具體類應(yīng)當(dāng)只實(shí)現(xiàn)接口和抽象類中聲明過的方法,而不要給岀多余的方法。傳統(tǒng)的過程性系統(tǒng)的設(shè)計(jì)辦法傾向于