得墨忒耳定律或最少知识原则,是一个设计指导原则,特别是面向对象的程序。
简介得墨忒耳定律(Law of Demeter,缩写LoD)亦称为“最少知识原则(Principle of Least Knowledge)”,是一种软件开发的设计指导原则,特别是面向对象的程序设计。得墨忒耳定律是松耦合的一种具体案例。该原则是美国东北大学在1987年末在发明的,可以简单地以下面任一种方式总结:
每个单元对于其他的单元只能拥有有限的知识:只是与当前单元紧密联系的单元;
每个单元只能和它的朋友交谈:不能和陌生单元交谈;
只和自己直接的朋友交谈。
这个原理的名称来源于希腊神话中的农业女神,孤独的得墨忒耳。
很多面向对象程序设计语言用"."表示对象的域的解析算符,因此得墨忒耳定律可以简单地陈述为“只使用一个.算符”。因此,a.b.Method()违反了此定律,而a.Method()不违反此定律。一个简单例子是,人可以命令一条狗行走(walk),但是不应该直接指挥狗的腿行走,应该由狗去指挥控制它的腿如何行走。1
优点遵循Demeter法则的优点是所得到的软件更易于维护和适应。由于对象较少依赖于其他对象的内部结构,因此可以在不重新处理其调用者的情况下更改对象容器。
Basili等。在1996年公布了实验结果,表明较低的响应类(RFC,响应调用该类方法可能调用的方法数)可以降低软件错误的概率。遵循Demeter法则可以导致较低的RFC。然而,结果还表明,每类加权方法的增加(WMC,每个类中定义的方法的数量)可以增加软件错误的可能性。遵循德米特定律也可以产生更高的WMC;看到缺点。
一个多层架构可以被认为是在软件系统中实现迪米特法则有系统的机制。在分层体系结构中,每个层中的代码只能调用层中的代码和下一层内的代码。“跳层”会违反分层架构。1
缺点尽管LoD增加了软件系统的适应性,但它可能(但不一定会)导致必须编写许多包装器方法来传播对组件的调用;在某些情况下,这会增加明显的时间和空间开销。
在方法级别,LoD导致接口狭窄,只能访问其完成工作所需的信息,因为每个方法都需要知道一小组密切相关的对象方法。另一方面,在类级别,LoD导致宽(即扩大)接口,因为LoD需要引入许多辅助方法而不是直接挖掘到对象结构。扩展类接口问题的一个解决方案是面向方面的方法,其中方法的行为被指定为高抽象级别的方面。这是通过使用自适应方法来完成的,该方法将操作的行为封装到一个地方,利用该方法解决散射问题。它还对类结构进行抽象,从而避免了纠结问题。宽接口通过指定实现的语言进行管理。遍历策略和自适应访问者仅使用参与操作的最小类集,并且抽象出关于这些类之间的连接的信息。
由于LoD举例说明了特定类型的耦合,并没有指定解决这种类型耦合的方法,因此它更适合作为代码气味的度量,而不是用于构建松散耦合系统的方法。2
面向对象程序设计面向对象程序设计(英语:Object-oriented programming,缩写:OOP)是种具有对象概念的程序编程典范,同时也是一种程序开发的抽象方针。它可能包含数据、属性、代码与方法。对象则指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,对象里的程序可以访问及经常修改对象相关连的数据。在面向对象程序编程里,计算机程序会被设计成彼此相关的对象。
面向对象程序设计可以看作一种在程序中包含各种独立而又互相调用的对象的思想,这与传统的思想刚好相反:传统的程序设计主张将程序看作一系列函数的集合,或者直接就是一系列对计算机下达的指令。面向对象程序设计中的每一个对象都应该能够接受数据、处理数据并将数据传达给其它对象,因此它们都可以被看作一个小型的“机器”,即对象。目前已经被证实的是,面向对象程序设计推广了程序的灵活性和可维护性,并且在大型项目设计中广为应用。此外,支持者声称面向对象程序设计要比以往的做法更加便于学习,因为它能够让人们更简单地设计并维护程序,使得程序更加便于分析、设计、理解。反对者在某些领域对此予以否认。
当我们提到面向对象的时候,它不仅指一种程序设计方法。它更多意义上是一种程序开发方式。在这一方面,我们必须了解更多关于面向对象系统分析和面向对象设计(Object Oriented Design,简称OOD)方面的知识。许多流行的编程语言是面向对象的,它们的风格就是会透由对象来创出实例。2
本词条内容贡献者为:
王沛 - 副教授、副研究员 - 中国科学院工程热物理研究所