物件導向設計原則之迪米特法則

Liuwei-Sunny發表於2012-05-14

      迪米特法則來自於1987年美國東北大學(Northeastern University)一個名為“Demeter”的研究專案。迪米特法則又稱為最少知識原則(LeastKnowledge Principle, LKP)其定義如下:

迪米特法則(Law of  Demeter, LoD):一個軟體實體應當儘可能少地與其他實體發生相互作用。

      如果一個系統符合迪米特法則,那麼當其中某一個模組發生修改時,就會盡量少地影響其他模組,擴充套件會相對容易,這是對軟體實體之間通訊的限制,迪米特法則要求限制軟體實體之間通訊的寬度和深度。迪米特法則可降低系統的耦合度,使類與類之間保持鬆散的耦合關係。

      迪米特法則還有幾種定義形式,包括不要和“陌生人”說話只與你的直接朋友通訊等,在迪米特法則中,對於一個物件,其朋友包括以下幾類:

      (1) 當前物件本身(this)

      (2) 以引數形式傳入到當前物件方法中的物件;

      (3) 當前物件的成員物件;

      (4) 如果當前物件的成員物件是一個集合,那麼集合中的元素也都是朋友;

      (5) 當前物件所建立的物件。

      任何一個物件,如果滿足上面的條件之一,就是當前物件的“朋友”,否則就是“陌生人”。在應用迪米特法則時,一個物件只能與直接朋友發生互動,不要與“陌生人”發生直接互動,這樣做可以降低系統的耦合度,一個物件的改變不會給太多其他物件帶來影響。

      迪米特法則要求我們在設計系統時,應該儘量減少物件之間的互動,如果兩個物件之間不必彼此直接通訊,那麼這兩個物件就不應當發生任何直接的相互作用,如果其中的一個物件需要呼叫另一個物件的某一個方法的話,可以通過第三者轉發這個呼叫。簡言之,就是通過引入一個合理的第三者來降低現有物件之間的耦合度

      在將迪米特法則運用到系統設計中時,要注意下面的幾點:在類的劃分上,應當儘量建立鬆耦合的類,類之間的耦合度越低,就越有利於複用,一個處在鬆耦合中的類一旦被修改,不會對關聯的類造成太大波及在類的結構設計上,每一個類都應當儘量降低其成員變數和成員函式的訪問許可權在類的設計上,只要有可能,一個型別應當設計成不變類在對其他類的引用上,一個物件對其他物件的引用應當降到最低

      下面通過一個簡單例項來加深對迪米特法則的理解:

      Sunny軟體公司所開發CRM系統包含很多業務操作視窗,在這些視窗中,某些介面控制元件之間存在複雜的互動關係,一個控制元件事件的觸發將導致多個其他介面控制元件產生響應,例如,當一個按鈕(Button)被單擊時,對應的列表框(List)、組合框(ComboBox)、文字框(TextBox)、文字標籤(Label)等都將發生改變,在初始設計方案中,介面控制元件之間的互動關係可簡化為如圖1所示結構:

初始設計方案結構圖

      在圖1中,由於介面控制元件之間的互動關係複雜,導致在該視窗中增加新的介面控制元件時需要修改與之互動的其他控制元件的原始碼,系統擴充套件性較差,也不便於增加和刪除新控制元件。

      現使用迪米特對其進行重構。

      在本例項中,可以通過引入一個專門用於控制介面控制元件互動的中間類(Mediator)來降低介面控制元件之間的耦合度引入中間類之後,介面控制元件之間不再發生直接引用,而是將請求先轉發給中間類,再由中間類來完成對其他控制元件的呼叫。當需要增加或刪除新的控制元件時,只需修改中間類即可,無須修改新增控制元件或已有控制元件的原始碼,重構後結構如圖2所示:

2  重構後的結構圖

【作者:劉偉  http://blog.csdn.net/lovelion

相關文章