設計模式六大原則(5) 迪公尺特法則

2021-07-09 04:42:33 字數 2473 閱讀 6882

迪公尺特法則:

迪公尺特法則(law of demeter)又叫作最少知識原則(least knowledge principle 簡寫lkp),就是說乙個物件應當對其他物件有盡可能少的了解,不和陌生人說話。英文簡寫為: lod.

定義:乙個物件應該對其他物件保持最少的了解。

問題由來:類與類之間的關係越密切,耦合度越大,當乙個類發生改變時,對另乙個類的影響也越大。

解決方案:盡量降低類與類之間的耦合。

自從我們接觸程式設計開始,就知道了軟體程式設計的總的原則:低耦合,高內聚。無論是面向過程程式設計還是物件導向程式設計,只有使各個模組之間的耦合盡量的低,才能提高**的復用率。低耦合的優點不言而喻,但是怎麼樣程式設計才能做到低耦合呢?那正是迪公尺特法則要去完成的。

迪公尺特法則又叫最少知道原則,最早是在2023年由美國northeastern university的ian holland提出。通俗的來講,就是乙個類對自己依賴的類知道的越少越好。也就是說,對於被依賴的類來說,無論邏輯多麼複雜,都盡量地的將邏輯封裝在類的內部,對外除了提供的public方法,不對外洩漏任何資訊。迪公尺特法則還有乙個更簡單的定義:只與直接的朋友通訊。首先來解釋一下什麼是直接的朋友:每個物件都會與其他物件有耦合關係,只要兩個物件之間有耦合關係,我們就說這兩個物件之間是朋友關係。耦合的方式很多,依賴、關聯、組合、聚合等。其中,我們稱出現成員變數、方法引數、方法返回值中的類為直接的朋友,而出現在區域性變數中的類則不是直接的朋友。也就是說,陌生的類最好不要作為區域性變數的形式出現在類的內部。

舉乙個例子:有乙個集團公司,下屬單位有分公司和直屬部門,現在要求列印出所有下屬單位的員工id。先來看一下違反迪公尺特法則的設計。

//總公司員工

class employee

public string getid()}

//分公司員工

class subemployee

public string getid()}

class subcompanymanager

return list;

}} class companymanager

return list;

}public void printallemployee(subcompanymanager sub)

listlist2 = this.getallemployee();

for(employee e:list2)

}} public class client

}

現在這個設計的主要問題出在companymanager中,根據迪公尺特法則,只與直接的朋友發生通訊,而subemployee類並不是companymanager類的直接朋友(以區域性變數出現的耦合不屬於直接朋友),從邏輯上講總公司只與他的分公司耦合就行了,與分公司的員工並沒有任何聯絡,這樣設計顯然是增加了不必要的耦合。按照迪公尺特法則,應該避免類中出現這樣非直接朋友關係的耦合。修改後的**如下:

class subcompanymanager

return list;

}public void printemployee()

}} class companymanager

return list;

}public void printallemployee(subcompanymanager sub)

}}

修改後,為分公司增加了列印人員id的方法,總公司直接呼叫來列印,從而避免了與分公司的員工發生耦合。

迪公尺特法則的初衷是降低類之間的耦合,由於每個類都減少了不必要的依賴,因此的確可以降低耦合關係。但是凡事都有度,雖然可以避免與非直接的類通訊,但是要通訊,必然會通過乙個「中介」來發生聯絡,例如本例中,總公司就是通過分公司這個「中介」來與分公司的員工發生聯絡的。過分的使用迪公尺特原則,會產生大量這樣的中介和傳遞類,導致系統複雜度變大。所以在採用迪公尺特法則時要反覆權衡,既做到結構清晰,又要高內聚低耦合。

設計模式六大設計原則導航:

1.  單一職責原則(single responsibility principle)

2.  黎克特制替換原則(liskov substitution principle)

3.  依賴倒置原則(dependence inversion principle)

4.  介面隔離原則(inte***ce segregation principle)

5.  迪公尺特法則(law of demeter)

6.開閉原則(open-close principle)

設計模式六大原則(5) 迪公尺特法則

定義 乙個物件應該對其他物件保持最少的了解。問題由來 類與類之間的關係越密切,耦合度越大,當乙個類發生改變時,對另乙個類的影響也越大。解決方案 盡量降低類與類之間的耦合。自從我們接觸程式設計開始,就知道了軟體程式設計的總的原則 低耦合,高內聚。無論是面向過程程式設計還是物件導向程式設計,只有使各個模...

設計模式六大原則(5) 迪公尺特法則

迪公尺特法則 迪公尺特法則 law of demeter 又叫作最少知識原則 least knowledge principle 簡寫lkp 就是說乙個物件應當對其他物件有盡可能少的了解,不和陌生人說話。英文簡寫為 lod.定義 乙個物件應該對其他物件保持最少的了解。問題由來 類與類之間的關係越密切...

設計模式六大原則(5) 迪公尺特法則

定義 乙個物件應該對其他物件保持最少的了解。問題由來 類與類之間的關係越密切,耦合度越大,當乙個類發生改變時,對另乙個類的影響也越大。解決方案 盡量降低類與類之間的耦合。自從我們接觸程式設計開始,就知道了軟體程式設計的總的原則 低耦合,高內聚。無論是面向過程程式設計還是物件導向程式設計,只有使各個模...