有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java中Demeter的oop定律

我一直在构建一个RTS来提高我的Java技能。我已经读了很多关于德米特定律的书,因为我想保持我的代码干净,但是我仍然很困惑!目前,我在视图中有一些类似的代码,用于显示选定行星上舰队中的某艘船数量:

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

据我所知,这违反了德米特定律。如果我应该只有一个点,那么我必须在每个类中都有一个方法来从下一个类获取信息吗?看起来很麻烦


共 (2) 个答案

  1. # 1 楼答案

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

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

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

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

    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?

    这样也可以避免方法链

  2. # 2 楼答案

    您在这里所做的是在任何地方公开内部状态,在OOP中,您不需要获取对象的内部状态来获取有关它的信息。所以它应该是一个模型。getSelectedPlanetNumberOfFrigates()并在对象中处理对selectedPlanet的调用。GetFleetNumberOfFrights(),等等