Java中的得墨忒耳定律

时间:2017-04-21 09:14:36

标签: java oop law-of-demeter

我一直在构建一个RTS来提高我的Java技能。我一直在读很多关于得墨忒耳的法则,因为我想保持我的代码干净,但我还是很困惑!目前我在视图中有一些这样的代码,以显示所选行星上的舰队中有多少艘船:

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

根据我的理解,这违反了得墨忒耳法则。如果我只应该有一个点'我是否必须在每个班级都有一个方法来获取下一个的信息?这看起来很麻烦。

2 个答案:

答案 0 :(得分:2)

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

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

仅对Frigates的数量感兴趣。但是方法调用链将方法mT类型m结合到getSelectedPlanet()getFleet()返回的类型。

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

int numberOfFrigates = model.getNumberOfFrigates();

但大多数情况下,违反委托人的行为是设计不良或责任错位的指标。这个问题的真正解决方案很可能不是像上面所示的例子那样直接在消费者处公开方法链获得的信息,而是通过移动部件或处理的全部责任更接近保存所需信息的对象。 / p>

在你的例子中尽量具体,问问自己:

  

为什么我需要方法m中的护卫舰数量?

     

我可以将m中完成的部分处理工作移到更靠近PlanetFleet的类型吗?

这样你就可以避开方法链了。

答案 1 :(得分:0)

你在这里做的是在任何地方暴露内部状态,在POO你不需要得到一个对象的内部状态来获取它的信息。所以它应该是model.getSelectedPlanetNumberOfFrigates(),并且在对象中你可以处理对selectedPlanet.getFleetNumberOfFrigates()的调用,等等......