定義:
一個(gè)對(duì)象應(yīng)該對(duì)其它的對(duì)象保持最少的了解。迪米特法則又稱為最少知識(shí)法則,英文全稱為L(zhǎng)east Knowledge PRinciple ,簡(jiǎn)稱為L(zhǎng)KP。
個(gè)人理解:
迪米特法則主要目的是類間解耦,弱耦合。只有類弱耦合了后,類的復(fù)用性才會(huì)提高。
問題由來:
類之間的關(guān)系越密切,類之間的耦合程度越高。當(dāng)一個(gè)類發(fā)改變時(shí),耦合度越大,對(duì)另一類的影響也就越大。
解決方案:
盡量降低類之間的耦合度。
從事編程的都知道,軟件編程總的原則是低耦合、高內(nèi)聚,只有這樣才能提高代碼的復(fù)用率,而這正是迪米特法則所要求的。迪米特法則還有一個(gè)更簡(jiǎn)單的定義:只與直接的朋友通信。首先來解釋一下什么是直接的朋友:每個(gè)對(duì)象都會(huì)與其他對(duì)象有耦合關(guān)系,只要兩個(gè)對(duì)象之間有耦合關(guān)系,我們就說這兩個(gè)對(duì)象之間是朋友關(guān)系。耦合的方式很多,依賴、關(guān)聯(lián)、組合、聚合等。其中,我們稱出現(xiàn)成員變量、方法參數(shù)、方法返回值中的類為直接的朋友,而出現(xiàn)在局部變量中的類則不是直接的朋友。也就是說,陌生的類最好不要作為局部變量的形式出現(xiàn)在類的內(nèi)部。
舉例說明:
老師(Teacher類)對(duì)組長(zhǎng)(GroupLeader類)發(fā)布命令,組長(zhǎng)對(duì)女生(Gril類)人數(shù)統(tǒng)計(jì)并輸出來。違反迪米特法則的代碼如下所示:
public class Girl { } public class GroubLeader { //有清查女生的工作 public void CountGrilNumber(List<Girl> girlslist) { Console.WriteLine("女生的數(shù)量是"+girlslist.Count); } } public class Teacher { public void Command(GroubLeader groubLeader) { var grilList = new List<Girl>(); //初始化女生列表 for (var i = 0; i < 30; i++) { grilList.Add(new Girl()); } //告訴體育委員要清查女生數(shù)量 groubLeader.CountGrilNumber(grilList); } } class Client { static void Main(string[] args) { var teacher = new Teacher(); //老師發(fā)布命令 teacher.Command(new GroubLeader()); Console.ReadKey(); } }上面的代碼中Teacher初始化了Gril的List列表,老師直接操作女生的列表這顯然不符合常規(guī),更不符合迪米特法則,正常的順序是老師對(duì)組長(zhǎng)發(fā)布命令,組長(zhǎng)統(tǒng)計(jì)女生人數(shù)。類的關(guān)系要盡量的解耦,降低他們的耦合度。改進(jìn)方法是GroupLeader內(nèi)部私有化一個(gè)List<Gril>變量,在構(gòu)造GroupLeader變量時(shí)傳遞List<Gril>參數(shù),這樣就降低了Gril和GroupLeader的耦合度。改進(jìn)代碼如下所示:
public class Girl { } public class GroubLeader { private readonly List<Girl> _girList; public GroubLeader(List<Girl> girlList) { _girList = girlList; } //有清查女生的工作 public void CountGrilNumber() { Console.WriteLine("女生的數(shù)量是" + _girList.Count); } } public class Teacher { public void Command(GroubLeader groubLeader) { //告訴體育委員要清查女生數(shù)量 groubLeader.CountGrilNumber(); } } class Client { static void Main(string[] args) { var girlList = new List<Girl>(); //初始化女生列表 for (var i = 0; i < 30; i++) { girlList.Add(new Girl()); } var teacher = new Teacher(); //老師發(fā)布命令 teacher.Command(new GroubLeader(girlList)); Console.ReadKey(); } }上面的例子只是單純的說明迪米特法則的使用,可能有些牽強(qiáng),關(guān)鍵還是理解一個(gè)對(duì)象應(yīng)盡量對(duì)其它對(duì)象保持少的了解這句話的意思。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注