面向物件設計原則實踐:之五.迪米特原則,介面隔離原則
六、迪米特(第三者互動)原則
1. 定義
每一個軟體單位對其他的單位都只有最少的知識,而且侷限於那些與本單位密切相關的軟體單位。
2. 分析
1) 迪米特法則就是指一個軟體實體應當儘可能少的與其他實體發生相互作用。
這樣,當一個模組修改時,就會盡量少的影響其他的模組,擴充套件會相對容易,
這是對軟體實體之間通訊的限制,它要求限制軟體實體之間通訊的寬度和深度。
2) 狹義的迪米特法則:
可以降低類之間的耦合,但是會在系統中增加大量的小方法並散落在系統的各個角落,
它可以使一個系統的區域性設計簡化,因為每一個區域性都不會和遠距離的物件有直接的關聯,
但是也會造成系統的不同模組之間的通訊效率降低,使得系統的不同模組之間不容易協調。
3) 廣義的迪米特法則:
指對物件之間的資訊流量、流向以及資訊的影響的控制,主要是對資訊隱藏的控制。
資訊的隱藏可以使各個子系統之間脫耦,從而允許它們獨立地被開發、優化、使用和修改,同時可以促進軟體的複用,
由於每一個模組都不依賴於其他模組而存在,因此每一個模組都可以獨立地在其他的地方使用。
一個系統的規模越大,資訊的隱藏就越重要,而資訊隱藏的重要性也就越明顯。
4) 迪米特法則的主要用途在於控制資訊的過載。
a. 在類的劃分上,應當儘量建立鬆耦合的類,
類之間的耦合度越低,就越有利於複用,一個處在鬆耦合中的類一旦被修改,不會對關聯的類造成太大波及
b. 在類的結構設計上,每一個類都應當儘量降低其成員變數和成員函式的訪問許可權
c. 在類的設計上,只要有可能,一個型別應當設計成不變類
d. 在對其他類的引用上,一個物件對其他物件的引用應當降到最低。
3. 例項
某系統介面類(如Form1、Form2等類)與資料訪問類(如DAO1、DAO2等類)之間的呼叫關係較為複雜。
如圖所示:
第三者互動原則-圖-1
第三者互動原則-圖-2
圖(一)和圖(二)分析:
因為這樣就可以降低類的耦合性,是類中功能更加單一,相當於【外觀模式】。
4. 總結
一個軟體實體應當儘可能少的與其他實體發生相互作用
七、介面隔離原則(ISP--Interface Segregation Principle)
1. 定義
a) 客戶端不應該依賴那些它不需要的介面。
b). 一旦一個介面太大,則需要將它分割成一些更細小的介面,使用該介面的客戶端僅需知道與之相關的方法即可。
使用多個專門的介面比使用單一的總介面要好。
一個類對另外一個類的依賴性應當是建立在最小的介面上的。
一個介面代表一個角色,不應當將不同的角色都交給一個介面。
沒有關係的介面合併在一起,形成一個臃腫的大介面,這是對角色和介面的汙染。
不應該強迫客戶依賴於它們不用的方法。
介面屬於客戶,不屬於它所在的類層次結構。”這個說得很明白了,
再通俗點說,不要強迫客戶使用它們不用的方法,如果強迫使用者使用它們不使用的方法,
那麼這些客戶就會面臨由於這些不使用的方法的改變所帶來的改變。
2.分析
a). 介面隔離原則是指使用多個專門的介面,而不使用單一的總介面。
每一個介面應該承擔一種相對獨立的角色,不多不少,不幹不該乾的事,該乾的事都要幹。
b). 使用介面隔離原則拆分介面時,首先必須滿足單一職責原則,
將一組相關的操作定義在一個介面中,且在滿足高內聚的前提下,介面中的方法越少越好。
c). 可以在進行系統設計時採用定製服務的方式,
即為不同的客戶端提供寬窄不同的介面,只提供使用者需要的行為,而隱藏使用者不需要的行為
3.例項
下圖展示了一個擁有多個客戶類的系統,在系統中定義了一個巨大的介面(胖介面)AbstractService來服務所有的客戶類。
如圖所示:
介面隔離原則-圖-1
介面隔離原則-圖-2
圖(一)和圖(二)分析:
因為這樣做既滿足了介面隔離原則,又滿足了單一原則,何樂而不為呢,
但是也帶來了很多的不便,類增多了。
4. 舉例說明
參考下圖的設計,在這個設計裡,取款、存款、轉帳都使用一個通用介面介面,
也就是說,每一個類都被強迫依賴了另兩個類的介面方法,那麼每個類有可能因為另外兩個類的方法(跟自己無關)而被影響。
拿取款來說,它根本不關心“存款操作”和“轉帳操作”,可是它卻要受到這兩個方法的變化的影響。
那麼我們該如何解決這個問題呢?
參考下圖的設計,為每個類都單獨設計專門的操作介面,
使得它們只依賴於它們關係的方法,這樣就不會互相影了!
5. 總結
類應該完全依賴相應的專門的介面
實現方法:
a) 使用委託分離介面
b) 使用多重繼承分離介面