在物件導向設計中,如何通過很小的設計改變就可以應對設計需求的變化,這是令設計者極為關注的問題。為此不少oo先驅提出了很多有關物件導向的設計原則用於指導oo的設計和開發。下面是幾條與類設計相關的設計原則。
1. 開閉原則(the open closed principle ocp)
乙個模組在擴充套件性方面應該是開放的而在更改性方面應該是封閉的。因此在進行物件導向設計時要盡量考慮介面封裝機制、抽象機制和多型技術。該原則同樣適合於非物件導向設計的方法,是軟體工程設計方法的重要原則之一。
我們以收音機的例子為例,講述物件導向的開閉原則。我們收聽節目時需要開啟收音機電源,對準電台頻率和進行音量調節。但是對於不同的收音機,實現這三個步驟的細節往往有所不同。比如自動收縮電台的收音機和按鈕式收縮在操作細節上並不相同。因此,我們不太可能針對每種不同型別的收音機通過乙個收音機類來實現(通過過載)這些不同的操作方式。但是我們可以定義乙個收音機介面,提供開機、關機、增加頻率、降低頻率、增加音量、降低音量六個抽象方法。不同的收音機繼承並實現這六個抽象方法。這樣新增收音機型別不會影響其它原有的收音機型別,收音機型別擴充套件極為方便。此外,已存在的收音機型別在修改其操作方法時也不會影響到其它型別的收音機。
圖1是乙個應用ocp生成的收音機類圖的例子:
圖1 ocp應用(收音機)
2. 替換原則 (the liskov substitution principle lsp)
子類應當可以替換父類並出現在父類能夠出現的任何地方。這個原則是liskov於2023年提出的設計原則。它同樣可以從bertrand meyer 的dbc (design by contract) 的概念推出。
我們以學生為例,夜校生為學生的子類,因此在任何學生可以出現的地方,夜校生均可出現。這個例子有些牽強,乙個能夠反映這個原則的例子時圓和橢圓,圓是橢圓的乙個特殊子類。因此任何出現橢圓的地方,圓均可以出現。但反過來就可能行不通。
圖2 liskov 原則
運用替換原則時,我們盡量把類b設計為抽象類或者介面,讓c類繼承類b(介面b)並實現操作a和操作b,執行時,類c例項替換b,這樣我們即可進行新類的擴充套件(繼承類b或介面b),同時無須對類a進行修改。
3. 依賴原則 (the dependency inversion principle dip)
在進行業務設計時,與特定業務有關的依賴關係應該盡量依賴介面和抽象類,而不是依賴於具體類。具體類只負責相關業務的實現,修改具體類不影響與特定業務有關的依賴關係。
在結構化設計中,我們可以看到底層的模組是對高層抽象模組的實現(高層抽象模組通過呼叫底層模組),這說明,抽象的模組要依賴具體實現相關的模組,底層模組的具體實現發生變動時將會嚴重影響高層抽象的模組,顯然這是結構化方法的乙個"硬傷"。
物件導向方法的依賴關係剛好相反,具體實現類依賴於抽象類和介面(見圖-3)。
為此,我們在進行業務設計時,應盡量在介面或抽象類中定義業務方法的原型,並通過具體的實現類(子類)來實現該業務方法,業務方法內容的修改將不會影響到執行時業務方法的呼叫。
圖3依賴原則圖示
4. 介面分離原則(the inte***ce segregation principle isp)
採用多個與特定客戶類有關的介面比採用乙個通用的涵蓋多個業務方法的介面要好。
isp原則是另外乙個支援諸如com等元件化的使能技術。缺少isp,元件、類的可用性和移植性將大打折扣。
這個原則的本質相當簡單。如果你擁有乙個針對多個客戶的類,為每乙個客戶建立特定業務介面,然後使該客戶類繼承多個特定業務介面將比直接載入客戶所需所有方法有效。
圖4展示了乙個擁有多個客戶的類。它通過乙個巨大的介面來服務所有的客戶。只要針對客戶a的方法發生改變,客戶b和客戶c就會受到影響。因此可能需要進行重新編譯和發布。這是一種不幸的做法。
圖4 帶有整合介面的服務類
我們再看圖-5中所展示的技術。每個特定客戶所需的方法被置於特定的介面中,這些介面被service類所繼承並實現。
圖5 使用介面分離的服務類設計
如果針對客戶a的方法發生改變,客戶b和客戶c並不會受到任何影響,也不需要進行再次編譯和重新發布。
以上四個原則是物件導向中常常用到的原則。此外,除上述四原則外,還有一些常用的經驗諸如類結構層次以三到四層為宜、類的職責明確化(乙個類對應乙個具體職責)等可供我們在進行物件導向設計參考。但就上面的幾個原則看來,我們看到這些類在幾何分布上呈現樹型拓撲的關係,這是一種良好、開放式的線性關係、具有較低的設計複雜度。一般說來,在軟體設計中我們應當盡量避免出現帶有閉包、迴圈的設計關係,它們反映的是較大的耦合度和設計複雜化。
物件導向的設計原則 類設計原則
物件導向設計中,如何通過很小的設計改變就可以應對設計需求的變化,這是令設計者極為關注的問題。為此不少oo先驅提出了很多有關物件導向的設計原則用於指導oo的設計和開發。下面是幾條與類設計相關的設計原則。1.開閉原則 the open closed principle ocp 乙個模組在擴充套件性方面應...
物件導向的設計原則 類設計原則
在物件導向設計中,如何通過很小的設計改變就可以應對設計需求的變化,這是令設計者極為關注的問題。為此不少oo先驅提出了很多有關物件導向的設計原則用於指導oo的設計和開發。下面是幾條與類設計相關的設計原則。1.開閉原則 the open closed principle ocp 乙個模組在擴充套件性方面...
物件導向的設計原則 類設計原則
在物件導向設計中,如何通過很小的設計改變就可以應對設計需求的變化,這是令設計者極為關注的問題。為此不少oo先驅提出了很多有關物件導向的設計原則用於指導oo的設計和開發。下面是幾條與類設計相關的設計原則。乙個模組在擴充套件性方面應該是開放的而在更改性方面應該是封閉的。因此在進行物件導向設計時要盡量考慮...