- 重學Java設計模式
- 付政委(小付哥)
- 1007字
- 2021-05-19 18:09:51
2.4 迪米特法則原則
2.4.1 迪米特法則定義
1987年秋天,迪米特法則由美國Northeastern University的Ian Holland提出,被UML的創始者之一Booch等人普及。后來,因為經典著作The Pragmatic Programmer而廣為人知。
迪米特法則(Law of Demeter,LoD)又稱為最少知道原則(Least Knowledge Principle,LKP),是指一個對象類對于其他對象類來說,知道得越少越好。也就是說,兩個類之間不要有過多的耦合關系,保持最少關聯性。
迪米特法則有一句經典語錄:只和朋友通信,不和陌生人說話。也就是說,有內在關聯的類要內聚,沒有直接關系的類要低耦合。這樣的例子在我們生活中也隨處可見,就像家里的水管裝修,有洗衣機地漏、衛生間地漏、廚房地漏,但它們最終都匯到同一個污水處理系統里。在平常使用時,我們不會考慮這些水管是怎么關聯流向的,只需要考慮最上層的使用即可。
2.4.2 模擬場景
本書通過模擬學生、老師、校長之間關系的例子來說明迪米特法則。老師需要負責具體某一個學生的學習情況,而校長會關心老師所在班級的總體成績,不會過問具體某一個學生的學習情況。
下面模擬這樣的例子,如果校長想知道一個班級的總分和平均分,是應該找老師要,還是跟每一個學生要再進行統計呢?顯然是應該找具體的班主任老師。我們在實際開發時,容易忽略這樣的真實情況,開發出邏輯錯誤的程序。
2.4.3 違背原則方案
首先定義一個學生信息類,這個類比較簡單,包括學生姓名、考試排名、總分。在實際的業務開發中會更復雜,這里只是簡化后的類。

之后再定義出老師類,在老師類里初始化學生的信息,以及提供基本的信息獲取接口。

在老師類中初始化了學生信息,同時提供了簡單的接口。接下來定義校長類,校長管理全局,并在校長類中獲取學生人數、總分、平均分等。

以上就是通過校長管理所有學生,老師只提供了非常簡單的信息。雖然可以查詢到結果,但是違背了迪米特法則,因為校長需要了解每個學生的情況。如果所有班級都讓校長類統計,代碼就會變得非常臃腫,也不易于維護和擴展。
2.4.4 迪米特法則改善代碼
從以上的實現方式我們發現,不該讓校長直接管理學生,校長應該管理老師,由老師提供相應的學生信息查詢服務。那么,接下來我們就把校長要的信息交給老師類去處理。


在使用迪米特法則后,把原來違背迪米特法則的服務接口交給老師類處理。這樣每一位老師都會提供相應的功能,校長類只需要調用使用即可,而不需要了解每一位學生的分數。
接下來再看校長類是如何使用的,如下所示。

校長類直接調用老師類的接口,并獲取相應的信息。這樣一來,整個功能邏輯就非常清晰了。
使用單元測試驗證程序結果。

- 移動UI設計(微課版)
- Visual FoxPro程序設計教程
- 程序員面試筆試寶典
- Java EE 7 Development with NetBeans 8
- Python數據結構與算法(視頻教學版)
- Advanced Express Web Application Development
- 響應式Web設計:HTML5和CSS3實戰(第2版)
- 運維前線:一線運維專家的運維方法、技巧與實踐
- Java Web應用開發給力起飛
- Learning Kotlin by building Android Applications
- VMware vSphere 5.5 Cookbook
- MySQL核心技術與最佳實踐
- Scala實用指南
- Performance Testing with JMeter 3(Third Edition)
- C++程序設計基礎(下)