迪米特法則:一個軟件實體應當儘可能少的與其他實體發生相互作用
如果一個系統符合迪米特法則,那麼當其中某一個模塊發生修改時,就會盡力少的影響其他模塊,擴展會相對容易。這是對軟件實體之間通信的限制。迪米特法則要求限制軟件實體之間通信的寬度和深度。迪米特法則可降低系統的耦合度,使類與類之間保持鬆散的耦合關係。
迪米特法則還有幾種定義形式:不要和“陌生人”說話,只與你的直接朋友通信等。在迪米特法則中,對於一個對象,其“朋友”包括以下幾類:
(1)當前對象本身(this)
(2)以參數形式傳入到當前對象方法中的對象
(3)當前對象的成員對象
(4)如果當前對象的成員對象是一個集合,那麼集合中的元素也都是朋友
(5)當前對象所創建的對象
任何一個對象,如果滿足上面的條件之一,就是當前對象的“”朋友“,否則就是陌生人,在應用迪米特法則時,一個對象只能與直接朋友發生交互,不要與陌生人發生直接交互,這樣做可以降低系統的耦合度,一個對象的改變不會給太多其他對象帶來影響。
迪米特法則要求在設計系統時,應該儘量減少對象之間的交互。如果兩個對象之間不必彼此直接通信,那麼這兩個對象就不應當發生任何直接的相互作用。如果其中一個對象需要調用另一個對象的方法,可以通過第三者轉發這個調用。簡言之,就是通過引入一個合理的第三者來降低現有對象的耦合度。
下面舉個簡單的例子來理解一下:
1 /// <summary> 2 /// 甲 3 /// </summary> 4 public class Jia 5 { 6 public void Play(Frenid frenid) 7 { 8 frenid.Play(); 9 } 10 public void Play(Stranger stranger) 11 { 12 stranger.Play(); 13 } 14 15 } 16 17 18 /// <summary> 19 /// 甲的朋友 20 /// </summary> 21 public class Frenid 22 { 23 public void Play() 24 { 25 Console.WriteLine("朋友"); 26 } 27 } 28 29 /// <summary> 30 /// 陌生人 31 /// </summary> 32 public class Stranger 33 { 34 public void Play() 35 { 36 Console.WriteLine("陌生人"); 37 } 38 }
甲和甲的朋友,因爲認識可以在一起玩,但甲和甲的朋友的朋友是陌生人,所以不能直接一起玩,需要透過甲的朋友,才能和陌生人一起玩,上面的例子存在問題,甲和陌生人不認識,沒有辦法直接一起玩,這個時候我們通過迪米特原則來進行修改
1 /// <summary> 2 /// 甲 3 /// </summary> 4 public class Jia 5 { 6 public void Play(Frenid frenid) 7 { 8 frenid.Play(); 9 var stranger = frenid.GetStrangerInstance(); 10 stranger.Play(); 11 } 12 13 } 14 15 16 /// <summary> 17 /// 甲的朋友 18 /// </summary> 19 public class Frenid 20 { 21 public Stranger GetStrangerInstance() 22 { 23 return new Stranger(); 24 } 25 26 public void Play() 27 { 28 Console.WriteLine("朋友"); 29 } 30 } 31 32 /// <summary> 33 /// 甲的朋友的朋友(陌生人) 34 /// </summary> 35 public class Stranger 36 { 37 public void Play() 38 { 39 Console.WriteLine("陌生人"); 40 } 41 }