问题标签 [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.

0 投票
1 回答
73 浏览

javascript - 得墨忒耳法则——真的只与朋友交流吗?

我读了一些关于得墨忒耳法则的文章,这让我很困惑。

它指出这样的事情:

应该换成这样:

我在这里有点困惑,因为后一个与第一个相同,但写法不同。在这两种情况下,我最终都会访问不是我当前班级的直接朋友的“宽度”。

那么为什么第二种方式真的更好呢?

0 投票
0 回答
48 浏览

php - 在模型中使用服务/工厂时不会损害得墨忒耳定律吗?

我知道findBadLanguage()应该在另一个班级,但让我们假设没关系。让我们专注于 Services::get****() 调用。转向全局容器并从中获取对象可以吗?还是转厂?它不会加速得墨忒耳定律吗?它说我们不能使用来自外部的物体

0 投票
4 回答
2270 浏览

pmd - 得墨忒耳法则:静态属性访问

我有一行代码如下所示:

String someString = "something"; if (Foo.SOME_CONSTANT_STRING.equals(someString))

导致违规:“可能违反德米特法则(静态财产访问)”

这里建议的方法是什么?

(编辑:我更改了代码示例)

0 投票
1 回答
511 浏览

oop - 嵌入golang是否违反了demeter法则?

这就是Effective GO关于在 golang 中嵌入的内容

当我们嵌入一个类型时,该类型的方法成为外部类型的方法,但是当它们被调用时,方法的接收者是内部类型,而不是外部类型

我有一个代码片段,我Struct User定义如下

然后我打电话u.Query("some query here")等。我专门这样做是为了避免像这样的电话u.Transaction.Query("query"),这显然违反了德墨忒耳法则。现在在阅读了文档和有效的 go 之后,我也怀疑第一种方法的优点。我违反了得墨忒耳法则吗?如果是,我该如何避免?

0 投票
1 回答
40 浏览

ruby-on-rails - 如何在rails for loop中应用demeter定律

我有一个 Rails 应用程序,它的用户模型有一个 User_profile。当我想在一个页面上显示多个用户时,我使用一个 rails 循环,例如:

其中显示了用户的居住城市。然而,这并不遵循 demeter 定律(或者詹金斯建立在我的 bitbucket 上告诉我)。我可以在我的用户模型上创建一个城市范围,以便我可以调用 user.user_profile_city,但我不知道这是否是解决这个问题的最佳方法,因为我必须为每个 user_profile 属性(哪种使user_profile 表没用)。Rails 解决这个问题的方法是什么?

0 投票
2 回答
932 浏览

java - 吸气剂是否违反得墨忒耳定律?

想象有一种GameState类型使用GameContext(通过process方法):

GameContext 将包含诸如 Player、Shops 等对游戏至关重要的东西。

一个州可以访问它需要的东西:

该语句player.isAlive()可以重写为context.getPlayer().isAlive()

我的问题

得墨忒耳法则规定,物体只能与直系亲属互动。这是否违反了原则,如何解决?

对于要动态处理的每个状态,所有可能的状态都必须接受形式参数。这使得很难严格传递对象所需的内容,这就是每个状态从“主要来源”获取所需内容的原因。我觉得主要来源的凝聚力非常低,因为 aShopState需要的数据与 a 不同CombatState

0 投票
1 回答
1754 浏览

ruby-on-rails - 什么时候应该使用委托,什么时候应该使用 has_one :through?

Rails 有两种很好的方法来避免模型中违反得墨忒耳定律。

第一个是这样的:

第二个是这样的:

有什么区别?在某些或所有情况下,有什么可以推荐一个选项而不是另一个选项吗?

我能检测到的唯一区别是该delegate选项似乎生成了两个 SQL 查询来获取后一条记录,而belongs_to :through似乎是在一个查询中完成。

0 投票
2 回答
163 浏览

ruby - 'Array#dig' 或 'Hash#dig' 方法是否违反得墨忒耳法则?

法:

通过在每一步调用 dig 提取由 idx 对象序列指定的嵌套值,如果任何中间步骤为 nil,则返回 nil。

这意味着:

通过对对象和对象依次:bar执行查找来返回。ArrayHash

第一次调用dig是对一个Array对象进行的,但下一次调用dig是对HashArray.

使用dig不违反得墨忒耳法则

0 投票
1 回答
110 浏览

java - 就隐藏实现细节而言,处理由其他两个对象组成的对象的最佳方法是什么?

例如,我有一个名为 Car 的类,其中包含相应的 AdminPart 和PassengerPart 类型的两个字段。

对于使用我的代码的客户端代码,我希望客户端代码能够做到car.getLicense()而不是car.getAdminPart().getLicense(). 这当然是getLicense()在 Car 中实现的,而 Car 又调用了相关的 getter。二传手也一样。

对此有最佳做法吗?我忽略了什么?

0 投票
3 回答
4227 浏览

java - 什么是得墨忒耳法则?

让我们从维基百科开始:

更正式地说,函数的得墨忒耳定律要求对象O的方法m只能调用以下类型对象的方法:

  1. O本身
  2. m的参数
  3. 在 m 中创建/实例化的任何对象
  4. O 的直接组件对象
  5. 一个全局变量,可以被 O 访问,在 m 范围内

规则1:

规则 2:

规则 3:

规则 4(感谢@juharr):

规则 5:

任何人都可以帮我解决第 5 条规则吗?


德墨忒耳法则不是暗示链接是不好的吗?

这导致高耦合。


“告诉,不要问”不是类似的原则吗?

这就是一切吗?我错了吗?你怎么能遵守得墨忒耳法则?