版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系我們

[科普中國(guó)]-得墨忒耳定律

科學(xué)百科
原創(chuàng)
科學(xué)百科為用戶提供權(quán)威科普內(nèi)容,打造知識(shí)科普陣地
收藏

得墨忒耳定律或最少知識(shí)原則,是一個(gè)設(shè)計(jì)指導(dǎo)原則,特別是面向?qū)ο蟮某绦颉?/p>

簡(jiǎn)介得墨忒耳定律Law of Demeter,縮寫(xiě)LoD)亦稱為“最少知識(shí)原則(Principle of Least Knowledge)”,是一種軟件開(kāi)發(fā)的設(shè)計(jì)指導(dǎo)原則,特別是面向?qū)ο蟮某绦蛟O(shè)計(jì)。得墨忒耳定律是松耦合的一種具體案例。該原則是美國(guó)東北大學(xué)在1987年末在發(fā)明的,可以簡(jiǎn)單地以下面任一種方式總結(jié):

每個(gè)單元對(duì)于其他的單元只能擁有有限的知識(shí):只是與當(dāng)前單元緊密聯(lián)系的單元;

每個(gè)單元只能和它的朋友交談:不能和陌生單元交談;

只和自己直接的朋友交談。

這個(gè)原理的名稱來(lái)源于希臘神話中的農(nóng)業(yè)女神,孤獨(dú)的得墨忒耳。

很多面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言用"."表示對(duì)象的域的解析算符,因此得墨忒耳定律可以簡(jiǎn)單地陳述為“只使用一個(gè).算符”。因此,a.b.Method()違反了此定律,而a.Method()不違反此定律。一個(gè)簡(jiǎn)單例子是,人可以命令一條狗行走(walk),但是不應(yīng)該直接指揮狗的腿行走,應(yīng)該由狗去指揮控制它的腿如何行走。1

優(yōu)點(diǎn)遵循Demeter法則的優(yōu)點(diǎn)是所得到的軟件更易于維護(hù)和適應(yīng)。由于對(duì)象較少依賴于其他對(duì)象的內(nèi)部結(jié)構(gòu),因此可以在不重新處理其調(diào)用者的情況下更改對(duì)象容器。

Basili等。在1996年公布了實(shí)驗(yàn)結(jié)果,表明較低的響應(yīng)類(RFC,響應(yīng)調(diào)用該類方法可能調(diào)用的方法數(shù))可以降低軟件錯(cuò)誤的概率。遵循Demeter法則可以導(dǎo)致較低的RFC。然而,結(jié)果還表明,每類加權(quán)方法的增加(WMC,每個(gè)類中定義的方法的數(shù)量)可以增加軟件錯(cuò)誤的可能性。遵循德米特定律也可以產(chǎn)生更高的WMC;看到缺點(diǎn)。

一個(gè)多層架構(gòu)可以被認(rèn)為是在軟件系統(tǒng)中實(shí)現(xiàn)迪米特法則有系統(tǒng)的機(jī)制。在分層體系結(jié)構(gòu)中,每個(gè)層中的代碼只能調(diào)用層中的代碼和下一層內(nèi)的代碼?!疤鴮印睍?huì)違反分層架構(gòu)。1

缺點(diǎn)盡管LoD增加了軟件系統(tǒng)的適應(yīng)性,但它可能(但不一定會(huì))導(dǎo)致必須編寫(xiě)許多包裝器方法來(lái)傳播對(duì)組件的調(diào)用;在某些情況下,這會(huì)增加明顯的時(shí)間和空間開(kāi)銷。

在方法級(jí)別,LoD導(dǎo)致接口狹窄,只能訪問(wèn)其完成工作所需的信息,因?yàn)槊總€(gè)方法都需要知道一小組密切相關(guān)的對(duì)象方法。另一方面,在類級(jí)別,LoD導(dǎo)致寬(即擴(kuò)大)接口,因?yàn)長(zhǎng)oD需要引入許多輔助方法而不是直接挖掘到對(duì)象結(jié)構(gòu)。擴(kuò)展類接口問(wèn)題的一個(gè)解決方案是面向方面的方法,其中方法的行為被指定為高抽象級(jí)別的方面。這是通過(guò)使用自適應(yīng)方法來(lái)完成的,該方法將操作的行為封裝到一個(gè)地方,利用該方法解決散射問(wèn)題。它還對(duì)類結(jié)構(gòu)進(jìn)行抽象,從而避免了糾結(jié)問(wèn)題。寬接口通過(guò)指定實(shí)現(xiàn)的語(yǔ)言進(jìn)行管理。遍歷策略和自適應(yīng)訪問(wèn)者僅使用參與操作的最小類集,并且抽象出關(guān)于這些類之間的連接的信息。

由于LoD舉例說(shuō)明了特定類型的耦合,并沒(méi)有指定解決這種類型耦合的方法,因此它更適合作為代碼氣味的度量,而不是用于構(gòu)建松散耦合系統(tǒng)的方法。2

面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)(英語(yǔ):Object-oriented programming,縮寫(xiě):OOP)是種具有對(duì)象概念的程序編程典范,同時(shí)也是一種程序開(kāi)發(fā)的抽象方針。它可能包含數(shù)據(jù)、屬性、代碼與方法。對(duì)象則指的是類的實(shí)例。它將對(duì)象作為程序的基本單元,將程序和數(shù)據(jù)封裝其中,以提高軟件的重用性、靈活性和擴(kuò)展性,對(duì)象里的程序可以訪問(wèn)及經(jīng)常修改對(duì)象相關(guān)連的數(shù)據(jù)。在面向?qū)ο蟪绦蚓幊汤?,?jì)算機(jī)程序會(huì)被設(shè)計(jì)成彼此相關(guān)的對(duì)象。

面向?qū)ο蟪绦蛟O(shè)計(jì)可以看作一種在程序中包含各種獨(dú)立而又互相調(diào)用的對(duì)象的思想,這與傳統(tǒng)的思想剛好相反:傳統(tǒng)的程序設(shè)計(jì)主張將程序看作一系列函數(shù)的集合,或者直接就是一系列對(duì)計(jì)算機(jī)下達(dá)的指令。面向?qū)ο蟪绦蛟O(shè)計(jì)中的每一個(gè)對(duì)象都應(yīng)該能夠接受數(shù)據(jù)、處理數(shù)據(jù)并將數(shù)據(jù)傳達(dá)給其它對(duì)象,因此它們都可以被看作一個(gè)小型的“機(jī)器”,即對(duì)象。目前已經(jīng)被證實(shí)的是,面向?qū)ο蟪绦蛟O(shè)計(jì)推廣了程序的靈活性和可維護(hù)性,并且在大型項(xiàng)目設(shè)計(jì)中廣為應(yīng)用。此外,支持者聲稱面向?qū)ο蟪绦蛟O(shè)計(jì)要比以往的做法更加便于學(xué)習(xí),因?yàn)樗軌蜃屓藗兏?jiǎn)單地設(shè)計(jì)并維護(hù)程序,使得程序更加便于分析、設(shè)計(jì)、理解。反對(duì)者在某些領(lǐng)域?qū)Υ擞枰苑裾J(rèn)。

當(dāng)我們提到面向?qū)ο蟮臅r(shí)候,它不僅指一種程序設(shè)計(jì)方法。它更多意義上是一種程序開(kāi)發(fā)方式。在這一方面,我們必須了解更多關(guān)于面向?qū)ο笙到y(tǒng)分析和面向?qū)ο笤O(shè)計(jì)(Object Oriented Design,簡(jiǎn)稱OOD)方面的知識(shí)。許多流行的編程語(yǔ)言是面向?qū)ο蟮?它們的風(fēng)格就是會(huì)透由對(duì)象來(lái)創(chuàng)出實(shí)例。2

本詞條內(nèi)容貢獻(xiàn)者為:

王沛 - 副教授、副研究員 - 中國(guó)科學(xué)院工程熱物理研究所