lod, law of demeter, 迪公尺特原則 or lkp, least knowledge principle, 最少知識原則
乙個物件應該對其他物件有最少的了解。乙個類應該對自己需要耦合或呼叫的類知道的最少,類的內部如何實現與呼叫者或者依賴者沒有關係,呼叫者或者依賴者只需知道它需要的方法即可。
只與直接的朋友發生通訊。
降低類之間的耦合度,提高了模組的相對獨立性
耦合度降低,從而提高了類的可重用率和系統的擴充套件性
需強調需注意
例子:有乙個集團公司,下屬單位有分公司和直屬部門,現在要求列印出所有下屬單位的員工id。先來看一下違反迪公尺特法則的設計。
// 總公司員工
class employee
public void setid(string id)
}// 分公司員工
class subemployee
public void setid(string id)
}// 子公司管理
class subcompanymanager
return list;
}}// 總公司管理
class companymanager
return list;
}public void printallemployee(subcompanymanager subcompanymanager)
// 總公司員工
listemployeelist = getallemployee();
for (employee employee : employeelist)
}}public class lodclient
}
問題出現在companymanager類,根據迪公尺特法則,只與直接的朋友發生通訊。而subemployee類並不是companymanager類的直接朋友(以區域性變數出現的耦合不屬於直接朋友),從邏輯上講總公司只與他的分公司耦合就行了,與分公司的員工並沒有任何聯絡,這樣設計顯然是增加了不必要的耦合。按照迪公尺特法則,應該避免類**現這樣非直接朋友關係的耦合。修改後的**如下
// 總公司員工
class employee
public void setid(string id)
}// 分公司員工
class subemployee
public void setid(string id)
}// 子公司管理
class subcompanymanager
return list;
}public void printsubcompany()
}}// 總公司管理
class companymanager
return list;
}public void printallemployee(subcompanymanager subcompanymanager)
}}public class lodclient
}
修改後,為分公司增加了列印人員id的方法,總公司直接呼叫來列印,從而避免了與分公司的員工發生耦合。
迪公尺特法則的初衷是降低類之間的耦合,由於每個類都減少了不必要的依賴,因此的確可以降低耦合關係。
過分的使用迪公尺特原則,會產生大量這樣的中介和傳遞類,導致系統複雜度變大。所以在採用迪公尺特法則時要反覆權衡,既做到結構清晰,又要高內聚低耦合。
迪公尺特法則 LoD
乙個物件應當對其他物件有盡可能少的了解。如果兩個類不必彼此直接通訊,那麼這兩個類就不應當發生直接的相互作用。如果其中的乙個類需要呼叫另外乙個類的某乙個方法的話,可以通過第三者 這個呼叫。以下的條件成為朋友條件 1.當前物件本身 this 2.以參量形式傳入到當前物件方法中的物件 3.當前物件的例項變...
LoD 迪公尺特法則
迪公尺特法則 lod 又稱最少知識原則 lkp 就是說乙個物件應當對其他物件盡可能少的了解。狹義的迪公尺特法則 如果兩個類不必彼此直接通訊,那麼這兩個類就不應當發生直接的相互作用.如果其中乙個類需要呼叫另乙個類的方法的話,可以通過第三者 這個呼叫.缺點 會在系統內造出大量的小方法,散落在系統的各個角...
迪公尺特法則(LoD)最少知識原則
1.拉公尺特法則,如果兩個類不必彼此直接通訊,那麼這兩個類就不應當發生直接的相互作用 盡可能的封閉私有 如果其中乙個類需要呼叫另乙個類的某乙個方法的話,可以通過第三者 這個呼叫 如通過呼叫介面定義 2.在類的介面設計上,每乙個類都應當盡量降低成員的訪問許可權,封裝好私有成員,不需要被其他類知道的屬性...