我一直在构建一个rts来提高我的java技能。我已经读了很多关于德米特定律的书,因为我想保持我的代码干净,但是我还是很困惑!目前,我在视图中有一些这样的代码来显示选定星球上的舰队中有多少艘特定的飞船:
int numberOfFrigates = model.getSelectedPlanet().getFleet().getNumberOfFrigates();
据我所知,这违反了德米特的法律。如果我应该只有一个点,我是否必须在每个类中都有一个方法来从下一个类中获取信息?看起来很麻烦。
我一直在构建一个rts来提高我的java技能。我已经读了很多关于德米特定律的书,因为我想保持我的代码干净,但是我还是很困惑!目前,我在视图中有一些这样的代码来显示选定星球上的舰队中有多少艘特定的飞船:
int numberOfFrigates = model.getSelectedPlanet().getFleet().getNumberOfFrigates();
据我所知,这违反了德米特的法律。如果我应该只有一个点,我是否必须在每个类中都有一个方法来从下一个类中获取信息?看起来很麻烦。
2条答案
按热度按时间b5lpy0ml1#
您在这里所做的是到处公开内部状态,在oop中,您不需要获取对象的内部状态来获取有关它的信息。所以它应该是model.getSelectedPlanetNumberOfRigates(),在对象中可以处理对selectedplanet.getfleetnumberoffrigates()的调用,等等。。。
sxpgvts32#
德米特定律遵循信息隐藏的原理,力求减少对象之间的耦合。在您的示例中
m
其中包含以下语句:感兴趣的是
Frigates
只是。但是方法调用链确实耦合了方法m
因此T
拥有m
返回的类型getSelectedPlanet()
以及getFleet()
.避免这种依赖关系的解决方案是向
model
它直接返回当前选定飞机的护卫舰数量,如:但大多数情况下,违反原则的行为都是设计不当或责任错位的表现。这个问题的真正解决方案很可能不是像上面所示的例子那样将通过方法链获得的信息直接暴露给消费者,而是通过将部件或整个处理责任移动到更靠近保存所需信息的对象的位置。
在你的例子中尽可能具体地问自己:
为什么我的方法需要护卫舰的数量
m
?我可以把加工的零件移开吗
m
更接近类型Planet
或者Fleet
?这样您也可以避免方法链。