我一直在构建RTS以提高我的Java技能。我一直在阅读有关Demeter定律的文章,因为我想保持代码整洁,但我仍然很困惑!目前,我在视图中有这样的代码,以显示所选星球上的舰队中有多少艘特定船只:

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


据我了解,这违背了得墨meter耳定律。如果只应该有一个点,那么每个类中都必须有一个方法来获取下一个信息吗?看起来很麻烦。

最佳答案

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

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


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

避免这种引入的依赖性的解决方案是在model中添加一个方法,该方法直接返回当前选定飞机的护卫舰数量,例如:

int numberOfFrigates = model.getNumberOfFrigates();


但是最常见的情况是违反主体的情况表明设计不良或职责错位。解决此问题的真正方法很可能不是像上述示例那样直接将方法链获得的信息暴露给消费者,而是将处理的部分或全部责任移到更靠近持有所需信息的对象上。

在您的示例中尽可能具体,请问自己:


  为什么在方法m中需要护卫舰数量?
  
  我可以将在m中完成的部分处理移动到更接近PlanetFleet类型吗?


这样,您还可以避免方法链。

07-26 09:40