Java 中的得墨忒耳法则

Law of Demeter in Java

我一直在构建 RTS 来提高我的 Java 技能。我已经阅读了很多关于 Demeter 法则的文章,因为我想保持代码整洁,但我仍然很困惑!目前,我在视图中有一些这样的代码,以显示所选星球上的舰队中某艘船的数量:

int numberOfFrigates = model.getSelectedPlanet().getFleet().getNumberOfFrigates();

据我了解,这违反了得墨忒耳法则。如果我只应该有 'one dot',我是否必须在每个 class 中都有一个方法来从下一个中获取信息?好像很麻烦。

Law Of Demeter遵循信息隐藏的原则努力降低对象之间的耦合。在您的示例中,方法 m 包含以下语句:

int numberOfFrigates = model.getSelectedPlanet().getFleet().getNumberOfFrigates();

只对Frigates的数量感兴趣。但是方法调用链确实将方法 m 和拥有 m 的类型 T 耦合到 getSelectedPlanet()getFleet().[=26 返回的类型=]

避免这种引入依赖关系的解决方案是向您的 model 添加一个方法,该方法直接 returns 当前所选飞机的护卫舰数量,例如:

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 types Planet or Fleet?

这样你也可以避免方法链。

你在这里所做的是在任何地方公开内部状态,在 OOP 中你不需要获取对象的内部状态来获取有关它的信息。所以它可能应该是 model.getSelectedPlanetNumberOfFrigates() 并且在对象中你可以处理对 selectedPlanet.getFleetNumberOfFrigates() 等的调用......