Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 爪哇的德米特定律_Java_Oop_Law Of Demeter - Fatal编程技术网

Java 爪哇的德米特定律

Java 爪哇的德米特定律,java,oop,law-of-demeter,Java,Oop,Law Of Demeter,我一直在构建一个RTS来提高我的Java技能。我已经读了很多关于德米特定律的书,因为我想保持我的代码干净,但是我仍然很困惑!目前,我在视图中有一些类似的代码,用于显示选定行星上舰队中的某艘船数量: int numberOfFrigates = model.getSelectedPlanet().getFleet().getNumberOfFrigates(); 据我所知,这违反了德米特定律。如果我应该只有一个点,那么我必须在每个类中都有一个方法来从下一个类获取信息吗?这看起来很麻烦。遵循信息隐

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

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

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

int numberOfFrigates = model.getSelectedPlanet().getFleet().getNumberOfFrigates();
只对
护卫舰的数量感兴趣。但是方法调用链将方法
m
和类型
T
owning
m
getSelectedPlanet()
getFleet()
返回的类型耦合起来

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

int numberOfFrigates = model.getNumberOfFrigates();
但最常见的情况是,违反原则表明设计不好或责任错位。这个问题的真正解决方案很可能不是像上面所示的例子那样将方法链获得的信息直接暴露给消费者,而是通过将部件或整个处理责任移到保存所需信息的对象附近

在你的例子中,我尽可能具体地问你自己:

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

我可以将
m
中完成的部分处理移到更靠近类型
Planet
Fleet
的位置吗


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

你在这里做的就是到处暴露内部状态,在OOP中,你不需要获取对象的内部状态来获取有关它的信息。因此,它可能是model.getSelectedPlanetNumberOfFrigates(),在对象中,您可以处理对selectedPlanet.getFleetNumberOfFrigates()等的调用。

您可以阅读一些观点,但是模型中不是有一个类似于:int getNumberOfFrigates(){返回selectedPlanet.getFleet().getNumberOfFrigates();}的方法吗这也违反了法律?我扩展了我的答案,希望你能找到一个合适的解决办法。你打算如何处理
m
中的
numberofcrafters
?我的进一步解释对你有帮助吗?你说的“POO”是指“OOP”吗?也许是打字错误,或者有一个我不知道的缩写词,或者这是你说你不喜欢OOP的方式Thx,这只是一个打字错误。Np!我以为这只是一个打字错误,但在我孩子气的一面引起了一阵大笑,只是在玩它。但不幸的是,我身上喜剧演员的一面显然不太好