了解得墨忒耳定律

Understanding Demeter's Law

我试图理解 OOP 背后的 SOLID 原则,但遇到了这个疑问。

根据前面的 class 图,我将计算车辆的 base_cost。为此,我需要访问马力和税收,然后使用 base_cost() 函数计算所有内容。

根据我在此 link 中的理解,我可以猜测它不会违反 Demeter 定律,因为您正在从本地创建的 class(车辆)访问方法。我说得对吗?

如评论中所述,SOLID 包括 Demeter 法则。真可惜,因为 it is much more pertinent and useful than all of the SOLID suggestions。只是为了解决这个问题。

关于您的具体情况,Demeter 当然允许在 vehicle 上调用方法,因为该对象作为实例变量保存。有一个明确的规则。

但是,如果我们考虑一个 object-oriented 系统,get_price()get_power() 和 [=13= 返回的东西] 也是对象,因为在 OO 系统中一切都应该是对象。在 Demeter 法则上下文中,将返回值 相乘是 向这些对象“发送消息”。现在这是不允许,因为您不直接持有对那些对象的引用,它们也不是参数,也不是在此调用中创建的。

因此,虽然根据 Demeter 法则,“获取”objects/values 在技术上可能是合法的,但调用您获取的 那些 objects/values 上的方法是不是。所以基本上任何有“吸气剂”的东西都会最终违反得墨忒耳法则。

这是故意的。 Demeter 法则实际执行的是封装。您不想从对象中“获取”数据,而是希望对象使用其拥有的数据执行行为的想法。