了解得墨忒耳定律
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 法则实际执行的是封装。您不想从对象中“获取”数据,而是希望对象使用其拥有的数据执行行为的想法。
我试图理解 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 法则实际执行的是封装。您不想从对象中“获取”数据,而是希望对象使用其拥有的数据执行行为的想法。