问题标签 [law-of-demeter]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - 得墨忒耳法则——真的只与朋友交流吗?
我读了一些关于得墨忒耳法则的文章,这让我很困惑。
它指出这样的事情:
应该换成这样:
我在这里有点困惑,因为后一个与第一个相同,但写法不同。在这两种情况下,我最终都会访问不是我当前班级的直接朋友的“宽度”。
那么为什么第二种方式真的更好呢?
php - 在模型中使用服务/工厂时不会损害得墨忒耳定律吗?
我知道findBadLanguage()
应该在另一个班级,但让我们假设没关系。让我们专注于 Services::get****() 调用。转向全局容器并从中获取对象可以吗?还是转厂?它不会加速得墨忒耳定律吗?它说我们不能使用来自外部的物体
pmd - 得墨忒耳法则:静态属性访问
我有一行代码如下所示:
String someString = "something";
if (Foo.SOME_CONSTANT_STRING.equals(someString))
导致违规:“可能违反德米特法则(静态财产访问)”
这里建议的方法是什么?
(编辑:我更改了代码示例)
oop - 嵌入golang是否违反了demeter法则?
这就是Effective GO关于在 golang 中嵌入的内容
当我们嵌入一个类型时,该类型的方法成为外部类型的方法,但是当它们被调用时,方法的接收者是内部类型,而不是外部类型
我有一个代码片段,我Struct User
定义如下
然后我打电话u.Query("some query here")
等。我专门这样做是为了避免像这样的电话u.Transaction.Query("query")
,这显然违反了德墨忒耳法则。现在在阅读了文档和有效的 go 之后,我也怀疑第一种方法的优点。我违反了得墨忒耳法则吗?如果是,我该如何避免?
ruby-on-rails - 如何在rails for loop中应用demeter定律
我有一个 Rails 应用程序,它的用户模型有一个 User_profile。当我想在一个页面上显示多个用户时,我使用一个 rails 循环,例如:
其中显示了用户的居住城市。然而,这并不遵循 demeter 定律(或者詹金斯建立在我的 bitbucket 上告诉我)。我可以在我的用户模型上创建一个城市范围,以便我可以调用 user.user_profile_city,但我不知道这是否是解决这个问题的最佳方法,因为我必须为每个 user_profile 属性(哪种使user_profile 表没用)。Rails 解决这个问题的方法是什么?
java - 吸气剂是否违反得墨忒耳定律?
想象有一种GameState
类型使用GameContext
(通过process
方法):
GameContext 将包含诸如 Player、Shops 等对游戏至关重要的东西。
一个州可以访问它需要的东西:
该语句player.isAlive()
可以重写为context.getPlayer().isAlive()
。
我的问题
得墨忒耳法则规定,物体只能与直系亲属互动。这是否违反了原则,如何解决?
对于要动态处理的每个状态,所有可能的状态都必须接受形式参数。这使得很难严格传递对象所需的内容,这就是每个状态从“主要来源”获取所需内容的原因。我觉得主要来源的凝聚力非常低,因为 aShopState
需要的数据与 a 不同CombatState
ruby-on-rails - 什么时候应该使用委托,什么时候应该使用 has_one :through?
Rails 有两种很好的方法来避免模型中违反得墨忒耳定律。
第一个是这样的:
第二个是这样的:
有什么区别?在某些或所有情况下,有什么可以推荐一个选项而不是另一个选项吗?
我能检测到的唯一区别是该delegate
选项似乎生成了两个 SQL 查询来获取后一条记录,而belongs_to :through
似乎是在一个查询中完成。
java - 就隐藏实现细节而言,处理由其他两个对象组成的对象的最佳方法是什么?
例如,我有一个名为 Car 的类,其中包含相应的 AdminPart 和PassengerPart 类型的两个字段。
对于使用我的代码的客户端代码,我希望客户端代码能够做到car.getLicense()
而不是car.getAdminPart().getLicense()
. 这当然是getLicense()
在 Car 中实现的,而 Car 又调用了相关的 getter。二传手也一样。
对此有最佳做法吗?我忽略了什么?
java - 什么是得墨忒耳法则?
让我们从维基百科开始:
更正式地说,函数的得墨忒耳定律要求对象O的方法m只能调用以下类型对象的方法:
- O本身
- m的参数
- 在 m 中创建/实例化的任何对象
- O 的直接组件对象
- 一个全局变量,可以被 O 访问,在 m 范围内
规则1:
规则 2:
规则 3:
规则 4(感谢@juharr):
规则 5:
任何人都可以帮我解决第 5 条规则吗?
德墨忒耳法则不是暗示链接是不好的吗?
这导致高耦合。
“告诉,不要问”不是类似的原则吗?
这就是一切吗?我错了吗?你怎么能遵守得墨忒耳法则?