簡介
得墨忒耳定律( Law of Demeter,縮寫 LoD)亦稱為“最少知識原則(Principle of Least Knowledge)”,是一種軟體開發的設計指導原則,特別是面向對象的程式設計。得墨忒耳定律是松耦合的一種具體案例。該原則是美國東北大學在1987年末在發明的,可以簡單地以下面任一種方式總結:
每個單元對於其他的單元只能擁有有限的知識:只是與當前單元緊密聯繫的單元;
每個單元只能和它的朋友交談:不能和陌生單元交談;
只和自己直接的朋友交談。
1.每個單元對於其他的單元只能擁有有限的知識:只是與當前單元緊密聯繫的單元;
2.每個單元只能和它的朋友交談:不能和陌生單元交談;
3.只和自己直接的朋友交談。
這個原理的名稱來源於希臘神話中的農業女神,孤獨的得墨忒耳。
很多面向對象程式設計語言用"."表示對象的域的解析算符,因此得墨忒耳定律可以簡單地陳述為“只使用一個.算符”。因此,a.b.Method()違反了此定律,而a.Method()不違反此定律。一個簡單例子是,人可以命令一條狗行走(walk),但是不應該直接指揮狗的腿行走,應該由狗去指揮控制它的腿如何行走。
優點
遵循Demeter法則的優點是所得到的軟體更易於維護和適應。由於對象較少依賴於其他對象的內部結構,因此可以在不重新處理其調用者的情況下更改對象容器。
Basili等。在1996年公布了實驗結果,表明較低的 回響類(RFC,回響調用該類方法可能調用的方法數)可以降低軟體錯誤的機率。遵循Demeter法則可以導致較低的RFC。然而,結果還表明, 每類加權方法的增加(WMC,每個類中定義的方法的數量)可以增加軟體錯誤的可能性。遵循德米特定律也可以產生更高的WMC;看到缺點。
一個多層架構可以被認為是在軟體系統中實現迪米特法則有系統的機制。在分層體系結構中,每個層中的代碼只能調用層中的代碼和下一層內的代碼。“跳層”會違反分層架構。
缺點
儘管LoD增加了軟體系統的適應性,但它可能(但不一定會)導致必須編寫許多包裝器方法來傳播對組件的調用;在某些情況下,這會增加明顯的時間和空間開銷。
在方法級別,LoD導致接口狹窄,只能訪問其完成工作所需的信息,因為每個方法都需要知道一小組密切相關的對象方法。另一方面,在類級別,LoD導致寬(即擴大)接口,因為LoD需要引入許多輔助方法而不是直接挖掘到對象結構。擴展類接口問題的一個解決方案是面向方面的方法,其中方法的行為被指定為高抽象級別的方面。這是通過使用自適應方法來完成的,該方法將操作的行為封裝到一個地方,利用該方法解決散射問題。它還對類結構進行抽象,從而避免了糾結問題。寬接口通過指定實現的語言進行管理。遍歷策略和自適應訪問者僅使用參與操作的最小類集,並且抽象出關於這些類之間的連線的信息。
由於LoD舉例說明了特定類型的耦合,並沒有指定解決這種類型耦合的方法,因此它更適合作為代碼氣味的度量,而不是用於構建鬆散耦合系統的方法。
面向對象程式設計
面向對象程式設計(英語:Object-oriented programming,縮寫:OOP)是種具有對象概念的程式編程典範,同時也是一種程式開發的抽象方針。它可能包含數據、屬性、代碼與方法。對象則指的是類的實例。它將對象作為程式的基本單元,將程式和數據封裝其中,以提高軟體的重用性、靈活性和擴展性,對象里的程式可以訪問及經常修改對象相關連的數據。在面向對象程式編程里,電腦程式會被設計成彼此相關的對象。
面向對象程式設計可以看作一種在程式中包含各種獨立而又互相調用的對象的思想,這與傳統的思想剛好相反:傳統的程式設計主張將程式看作一系列函式的集合,或者直接就是一系列對計算機下達的指令。面向對象程式設計中的每一個對象都應該能夠接受數據、處理數據並將數據傳達給其它對象,因此它們都可以被看作一個小型的“機器”,即對象。目前已經被證實的是,面向對象程式設計推廣了程式的靈活性和可維護性,並且在大型項目設計中廣為套用。此外,支持者聲稱面向對象程式設計要比以往的做法更加便於學習,因為它能夠讓人們更簡單地設計並維護程式,使得程式更加便於分析、設計、理解。反對者在某些領域對此予以否認。
當我們提到面向對象的時候,它不僅指一種程式設計方法。它更多意義上是一種程式開發方式。在這一方面,我們必須了解更多關於面向對象系統分析和面向對象設計(Object Oriented Design,簡稱OOD)方面的知識。許多流行的程式語言是面向對象的,它們的風格就是會透由對象來創出實例。