3.7 迪米特法则

迪米特法则意在删除链条式调用(用“.”进行的调用链接),同时用低耦合的代码提供良好的封装。

了解链条调用的方法会破坏迪米特法则。例如,请看以下代码:

应当限定每一块代码了解的信息,即仅将其限定在最相关的代码层面。在迪米特法则中,代码应当进行主动告知而非主动询问,即应用迪米特法则时只能调用以下几种对象的方法:

  • 作为参数的对象
  • 局部创建的对象
  • 实例变量
  • 全局变量

实现迪米特法则有时是很难的,但仅仅告知而不主动询问的方式的优点之一是可以解除代码的耦合。

也许通过对比破坏迪米特准则和遵守迪米特准则的范例会更有助于理解。请参见3.7.1节中的内容。

遵守和破坏(链式调用)迪米特法则的范例对比

在遵守迪米特法则的范例中,我们调用了report实例对象的方法来打开链接。

以下Connection类中的方法可用于打开链接。

Database类创建了Connection对象,并打开链接:

Report类创建了Database对象,并打开数据库链接:

上例中的代码遵循了迪米特法则,接下来的代码则破坏了该法则。

Example类破坏了迪米特法则,因为我们引入了方法的链式调用,即report.Database.Connection.Open()

上述范例中,调用report变量中Database属性的getter并不违背迪米特法则,但后续进一步调用了(Database对象的)Connection属性的getter返回不同对象的方式就破坏了迪米特法则。而最后调用方法打开连接的方式同样破坏了迪米特法则。