定義:一個對象應該對其他對象保持最少的了解。
問題由來:類與類之間的關系越密切,耦合度越大,當一個類發生改變時,對另一個類的影響也越大。
解決方案:盡量降低類與類之間的耦合。
自從我們接觸編程開始,就知道了軟件編程的總的原則:低耦合,高內聚。無論是面向過程編程還是面向對象編程,只有使各個模塊之間的耦合盡量的低,才能提高代碼的復用率。低耦合的優點不言而喻,但是怎么樣編程才能做到低耦合呢?那正是迪米特法則要去完成的。
迪米特法則又叫最少知道原則,最早是在1987年由美國Northeastern University的Ian Holland提出。通俗的來講,就是一個類對自己依賴的類知道的越少越好。也就是說,對于被依賴的類來說,無論邏輯多么復雜,都盡量地的將邏輯封裝在類的內部,對外除了提供的public方法,不對外泄漏任何信息。迪米特法則還有一個更簡單的定義:只與直接的朋友通信。首先來解釋一下什么是直接的朋友:每個對象都會與其他對象有耦合關系,只要兩個對象之間有耦合關系,我們就說這兩個對象之間是朋友關系。耦合的方式很多,依賴、關聯、組合、聚合等。其中,我們稱出現成員變量、方法參數、方法返回值中的類為直接的朋友,而出現在局部變量中的類則不是直接的朋友。也就是說,陌生的類最好不要作為局部變量的形式出現在類的內部。
下面是一個違反迪米特原則的例子:
1
2
3
4
5
|
public class Teacher { public void teach(Classes classes){ classes.getStudents.getScore.show(); } } |
存在什么問題呢?耦合性太高。
1. Student 類中可能會取消Score類。
2. Score類的show方法也可能會被刪除。
Student類,Score類對于你來說都是陌生的,當他們改變時,你可能都不知道。
我們可以修改成:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public class Teacher { public void teach(Classes classes){ classes.showScore(); } } public class Classes { public void showScore(Student student){ student.showScore(); } } public class Student { Score score; public void showScore(){ score = new Score( 80 ); score.show(); } } |
總結:
1. 迪米特法則的優點在于降低類之間的耦合。
2. 缺點是會產生比較多的小方法,讓系統變得比較凌亂,而且通信效率會降低。
3. 設計模式中的應用:門面模式(Facade Pattern)和中介模式(Mediator Pattern)。