- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在构建 RTS 来提高我的 Java 技能。我已经阅读了很多有关德米特定律的内容,因为我想保持代码干净,但我仍然很困惑!目前,我在 View 中有一些类似这样的代码,以显示所选星球上的舰队中有多少艘特定的船只:
int numberOfFrigates = model.getSelectedPlanet().getFleet().getNumberOfFrigates();
据我了解,这违反了德墨忒尔法则。如果我只应该有“一个点”,我是否必须在每个类中都有一个方法来从下一个类中获取信息?看起来很麻烦。
最佳答案
Law Of Demeter遵循信息隐藏的原则,努力减少对象之间的耦合。在您的示例中,方法 m
包含以下语句:
int numberOfFrigates = model.getSelectedPlanet().getFleet().getNumberOfFrigates();
仅对护卫舰
的数量感兴趣。但方法调用链确实将方法 m
以及拥有 m
的类型 T
与 getSelectedPlanet() 返回的类型耦合起来
和 getFleet()
。
避免引入这种依赖关系的解决方案是向您的模型
添加一个方法,该方法直接返回当前所选飞机的护卫舰数量,例如:
int numberOfFrigates = model.getNumberOfFrigates();
但大多数情况下,违反原则是设计不当或责任不当的表现。这个问题的真正解决方案很可能不是像上面所示的例子那样直接向消费者公开方法链获得的信息,而是通过将处理的部分或整个责任移近保存所需信息的对象。
为了在您的示例中尽可能具体,请问自己:
Why do I need the number of frigates in my method
m
?May I move parts of processing done in
m
closer to the typesPlanet
orFleet
?
这样您也可以避免方法链。
关于java - java 的得墨忒尔法则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43538605/
在 SO解释了为什么像 scalaz、cats (Scala) 或 Arrow (Kotlin) 中的 Validation 不能是 monad。 据我所知,这是因为他们已经根据应用仿函数对 mona
给定例如像 这样的类型 data Tree a = Branch (Tree a) (Tree a) | Leaf a 我可以轻松地为 Functor、Applicative、
从这里引用:https://en.wikipedia.org/wiki/Law_of_Demeter More formally, the Law of Demeter for functions r
以下代码打破了 Law of Demeter : public class Student extends Person { private Grades grades; public Stu
我有一个简单的 Store 类,其中包含一个 Inventory。 Inventory 包含一个 Item 列表。为了修改 Inventory 中的其中一个 Item,我必须这样写: Store st
public class BigPerformance { public decimal Value { get; set; } } public class Performance
当我需要多态行为时,我经常发现自己在 C++ 中使用唯一指针。我通常实现如下所示的纯抽象类: class A { public: virtual A* clone() const = 0; /
5 规则指出,如果一个类有一个用户声明的析构函数、复制构造函数、复制赋值构造函数、移动构造函数或移动赋值构造函数,那么它必须有其他 4 个。 但今天我突然明白了:你什么时候需要用户定义的析构函数、复制
编译器或库的更“ native ”部分(IO 或可以访问黑魔法和实现的函数)是否对这些定律做出假设?打破它们会导致不可能的事情发生吗? 或者它们只是表达了一种编程模式——也就是说,你唯一会因为破坏它们
我有点想用 Java 8 流编写 Selenium 页面对象,如下面的代码所述,并收到评论说我的代码违反了 Demeter 法则,因为我在一行中执行了很多操作。我被建议将代码分解为第一个流以收集列表并
我对如何避免一对多关联违反得墨忒耳法则感到困惑。假设我有一个这样的模型: class Organization < ActiveRecord::Base has_one :address ha
如果我有一个对象的 ArrayList,那么任何时候我需要调用 ArrayList 成员的任何方法时,我都需要这样做: list.get(i).doSomething(); 这看起来很可疑地违反了 D
我在我的 Purescript 代码中广泛使用了来自库和我自己的类型类。每个类型类法则似乎都提供了一个很好的测试。目前,我正在为每个类(class)和法律单独编写测试。有没有办法部分自动化?也许像 H
我看到提到过 ListT is a classic example of a buggy monad transformer that doesn't satisfy the monad laws.
当我审查一些代码时,我看到了这个片段。 List users = /* Some code that initializes the list */; users.stream() .fil
我是一名优秀的程序员,十分优秀!