德米特定律(LOD)或最小知识原理是开发软件,特别是面向对象程序的设计指南。
这项法律是由伊恩·霍兰德在1987年提出的。霍兰德和他的同事正在使用面向对象编程对一个名为Demeter的系统进行编程。在系统开发过程中,他们意识到满足一系列规则的代码耦合度较低。
德米特定律被称为“不要和陌生人说话”,因为:
每个单位应该只对与当前单位“密切”相关的其他单位有有限的了解。
每个单位应该只和自己的朋友说话,不要和陌生人说话。
更正式地说,德米特定律要求对象O的方法m只能调用以下类型的对象的方法:
总而言之,上面的所有规则都可以总结为:您应该避免调用由另一个方法返回的成员对象的方法。在现代面向对象语言中,使用的标识符是点或->;。因此,当代码在班级之间有一个以上的步骤时,就违反了德米特定律。例如,下面的代码显示了一个违反德米特定律的示例:
在这种情况下,来自A类的对象a可以请求B类的实例化对象的方法,但是对象A不应该直接到达对象B,因为这意味着对象A对对象B的内部结构(紧耦合)有更多的了解。
现在,我将展示一个用TypeScript实现的真实示例。在下面的UML图中,您可以看到a Person与House相关,而House与Address相关。
下面的代码可以在客户端/上下文中运行,而第一个代码违反了德米特定律,因为有人需要了解类House的内部实现。另一方面,第二个实现尊重德米特定律,代码耦合度较低。
以下步骤显示您必须实现代码以遵守Demeter定律并获得耦合较少的代码。因此,第一步是创建将在我们的具体类中实现的接口:
下一步将是具体类的实现,如下所示:
代码中最重要的是没有任何方法违反德米特定律(包含对象的连续调用不超过两次)。
在本例中,解决方案是在Person类中实现isZipCode方法,如以下代码所示: