迪米特法则

迪米特法则(Law of Demeter),又称“最少知识原则”(Principle of Least Knowledge),其来源于1987年荷兰大学的一个叫做Demeter的项目。Craig Larman把Law of Demeter又称作“不要和陌生人说话”。在《程序员修炼之道》中讲LoD的那一章叫作“解耦合与迪米特法则”。关于迪米特法则有一些很形象的比喻:

  1. 如果你想让你的狗跑的话,你会对狗狗说还是对四条狗腿说?
  2. 如果你去店里买东西,你会把钱交给店员,还是会把钱包交给店员让他自己拿?

和狗的四肢说话?让店员自己从钱包里拿钱?这听起来有点荒唐,不过在我们的代码里这几乎是见怪不怪的事情了。

对于LoD,正式的表述如下:

对于对象 ‘O’ 中一个方法’M’,M应该只能够访问以下对象中的方法:

  1. 对象O;
  2. 与O直接相关的Component Object;
  3. 由方法M创建或者实例化的对象;
  4. 作为方法M的参数的对象。

在《Clean Code》一书中,有一段Apache framework中的一段违反了LoD的代码:

final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();

这么长的一串对其它对象的细节,以及细节的细节,细节的细节的细节……的调用,增加了耦合,使得代码结构复杂、僵化,难以扩展和维护。

在《重构》一书中的代码的环味道中有一种叫做“Feature Envy”(依恋情结),形象的描述了一种违反了LoC的情况。Feature Envy就是说一个对象对其它对象的内容更有兴趣,也就是说老是羡慕别的对象的成员、结构或者功能,大老远的调用人家的东西。这样的结构显然是不合理的。我们的程序应该写得比较“害羞”。不能像前面例子中的那个不把自己当外人的店员一样,拿过客人的钱包自己把钱拿出来。“害羞”的程序只和自己最近的朋友交谈。这种情况下应该调整程序的结构,让那个对象自己拥有它羡慕的feature,或者使用合理的设计模式(例如Facade和Mediator)。

迪米特法则应用的注意事项:

  1. 在类的划分上,应该创建有弱耦合的类;
  2. 在类的结构设计上,每一个类都应当尽量降低成员的访问权限;
  3. 在类的设计上,只要有可能,一个类应当设计成不变类;
  4. 在对其他类的引用上,一个对象对其它对象的引用应当降到最低;
  5. 尽量降低类的访问权限;
  6. 谨慎使用序列化功能;
  7. 不要暴露类成员,而应该提供相应的访问器(属性)。

Facade模式、Mediator模式是这一原则的践行者

LOD说的是什么?

主要是要保证一个类与其他类的交互要少,知道的其他的类也要少。

LOD的目的:(即为什么要这样做?)

保证程序的内聚性和程序间的松散耦合。因为一个类知道的别的类的东西越少那么与 其他类打交道的机会就少,自身的内聚性就高。

草木全
分享到:
共 0 条  此列表为空  当前1/1页

© 2014 究问社区 copyRight 豫ICP备13003319号-1