學習設(shè)計模式,自然會涉及面向?qū)ο蟮脑O(shè)計原則,面向?qū)ο蟮脑O(shè)計原則一般包括五個原則,下面詳細介紹下五個原則: 1、單一職責原則(single responsibility principle ) There should never be more than one reason for a class to change. 所謂單一職責原則,就是對一個類而言,應(yīng)該僅有一個引起它變化的原因。換句話說,一個類的功能要單一,只做與它相關(guān)的事情。在類的設(shè)計過程中要按職責進行設(shè)計,彼此保持正交,互不干涉。 什么是職責? 在SRP 中,職責定義為“變化的原因”。如果你能夠想到多于一個的動機去改變一個類,那么該類就具有多于一個的職責。 為什么要采用單一職責原則? 因為每一個職責都是變化的一個軸線,當需求變化時,該變化會反映為類的職責的變化。如果一個類承擔了多于一個的職責,那么就意味著引起它的變化的原因會有多個。如果一個類承擔的職責過多,那么就等同于把這些職責耦合在了一起。一個職責的變化可能會抑制到該類完成其他職責的能力,這樣的耦合會導致脆弱的設(shè)計。當變化發(fā)生時,設(shè)計會受到意想不到的破壞。單一職責原則正是實現(xiàn)高內(nèi)聚低耦合需要遵守的一個原則。 注意: 單一職責原則簡單而直觀,但在實際應(yīng)用中很難實現(xiàn)。只有變化的軸線僅當實際發(fā)生時才具有真正的意義。如果沒有預(yù)兆,那么去應(yīng)用SRP或者其他任何的原則都是不明智的。 下面就Modem接口為例,說明其原則。
大多數(shù)會認為看起來非常合理,該接口聲明的4個函數(shù)確實是調(diào)制解調(diào)器的功能。 然而,該接口中卻顯示出兩個職責。第一個職責連接管理,第二個職責是數(shù)據(jù)通信。dial和hangup函數(shù)進行調(diào)制解調(diào)器的連接管理,而send和recv負責進行數(shù)據(jù)通信。這兩個職責應(yīng)該被分開嗎?這依賴于應(yīng)用程序變化的方式。如果應(yīng)用程序的變化會影響到連接函數(shù)的簽名,那么這個設(shè)計就是僵硬的設(shè)計,因為調(diào)用send和 recv的類必須重新編譯、部署的次數(shù)會超過我們預(yù)想的情況。在這種情況下,這兩個職責必須被分離,我們分別實現(xiàn)這兩個職責于:
下面的類圖將它的2個不同職責分成2個不同的接口,這樣至少可以讓客戶端應(yīng)用程序使用具有單一職責的接口:
讓ModemImplementation 實現(xiàn)這兩個接口。我們注意到,ModemImplementation又組合了2個職責,這不是我們希望的,但有時這又是必須的。通常由于某些原因,迫使我們不得不綁定多個職責到一個類中,但我們至少可以通過接口的分割來分離應(yīng)用程序關(guān)心的概念。事實上,這個例子一個更好的設(shè)計應(yīng)該是這樣的,如圖: 小結(jié) Single Responsibility Principle (SRP)從職責(改變理由)的側(cè)面上為我們對類(接口)的抽象的顆粒度建立了判斷基準,在為系統(tǒng)設(shè)計類(接口)的時候應(yīng)該保證它們的單一職責性。
高內(nèi)聚、低耦合解釋: 這是軟件工程中的概念,是判斷設(shè)計好壞的標準,主要是面向OO的設(shè)計,主要是看類的內(nèi)聚性是否高,偶合度是否低 “高內(nèi)聚,低耦合”主要是闡述的面向?qū)ο笙到y(tǒng)中,各個類需要職責分離的思想。 類之間的設(shè)置應(yīng)該要低耦合,但是每個類應(yīng)該要高內(nèi)聚.耦合是類之間相互依賴的尺度.如果每個對象都有引用其它所有的對象,那么就有高耦合,這是不合乎要求的,因為在兩個對象之間,潛在性地流動了太多信息.低耦合是合乎要求的:它意味著對象彼此之間更獨立的工作.低耦合最小化了修改一個類而導致也要修改其它類的"連鎖反應(yīng)". 內(nèi)聚是一個類中變量與方法連接強度的尺度.高內(nèi)聚是值得要的,因為它意味著類可以更好地執(zhí)行一項工作.低內(nèi)聚是不好的,因為它表明類中的元素之間很少相關(guān).成分之間相互有關(guān)聯(lián)的模塊是合乎要求的.每個方法也應(yīng)該高內(nèi)聚.大多數(shù)的方法只執(zhí)行一個功能.不要在方法中添加'額外'的指令,這樣會導致方法執(zhí)行更多的函數(shù)。
|
|
來自: 醉三郎 > 《設(shè)計模式》