这是德米特定律的一个好例子吗?

o0lyfsai  于 2021-06-26  发布在  Java
关注(0)|答案(2)|浏览(261)

我在准备口试,不知道我是否正确地理解了德米特定律。本质上,我已经理解了demeter定律的目的是通过减少类之间的依赖性来放松耦合,并且不明确地给出类如何获得某些信息。这句话的结尾是“只和你的直系朋友说话”。我举了一个简单的例子:
如果我们有一个类板,在我们的游戏场上有游戏块,例如想找出哪些块移动了一个直观的方法来找出这将是写下这样的东西:

Board.getGamePiece(p).getMovement();

但这违反了德米特的法律。因此,我们将该任务委托给getmovement方法,只需编写:

Board.getMovement(p);

我理解得对吗?我的解释有错误吗?我有点不确定如何在这里使用术语“delegate”,在我的示例中是否正确使用了它?

fnatzsnv

fnatzsnv1#

我正确地理解了德墨忒尔定律
这是一个模糊的,不科学的原则。它不像万有引力定律,也不像语言规范。您将它提升为一个二进制概念(代码要么违反它,要么不违反它)。这是双重错误:
这是一个意见的问题,这是灰色的阴影。不存在“这段代码违反了它,而这段代码没有”。
这是一个指导方针,不是规则。有时,编写许多人认为完全违反这一原则的代码是正确的编写方法(从这个意义上说,它导致了最有效、最容易理解、最容易测试和最容易修改的未来更改请求)。 Board.getGamePiece(p).getMovement();Board.getMovement(p); 这是我的观点,但是,从lod的Angular 来看,对这些行的任何评论都是观点,如果有人试图告诉你不是,那么他们错了:)
在lod的意义上,这些是完全相等的,并且这个代码(任何一个版本)都是完全正确的。
关键是:两者都意味着你知道一个概念,即有一个游戏棋子这样的东西,棋子可以移动。这两行代码还返回 Movement 以某种方式或形式,所以无论哪种情况,这段代码都不仅仅知道“游戏碎片存在”和“它们可以移动”,而且还知道“这就是移动的样子以及如何与之交互”。
你写作一无所获 board.getMovement(p) .
去掉这些模糊的概念,你就开始有所进展。如果你写过 board.advance() 作为一种方法,应用1回合的事件,通过询问每个棋子想要做的移动,然后移动所有棋子并处理,例如,一些棋子现在受到了伤害,那么你现在所涉及的概念就少了很多:运行的代码 board.advance() 知道有一块木板,有一种东西叫做转弯,你可以前进一个转弯。
代码不需要知道片段是否存在,或者它们是否可以移动。
将“lod”转换为java的任何代码如下所示: a.method1().method2() 一定是lod的一个中断,好吧,请随意这样做。但是,如果你把这些混为一谈,结果是: a.method1().method2() 中断lod。
破坏lod是一种糟糕的代码风格,导致代码难以维护。
因此, a.method1().method2() 是错误代码。
然后你把事情搞砸了。不是这样的;严格应用这一原则将导致您复制大量的代码,并从程序员的级别(现在的代码)添加更多的依赖关系 board 你需要知道更多关于碎片能做什么的信息(如果你不这么做的话)。
这给我们上了另一堂关于这种模糊不清的风格准则的课:它们几乎总是处于直接竞争中。如果你试图“优化”lod,你很可能会失败的其他规则,如干吨。
最终目标是编写可维护的代码。这比试图应用一些死记硬背的概念,比如“避免”要困难得多 a.x().y() '. 编程很难。

yvt65v4c

yvt65v4c2#

我认为你对这个想法很感兴趣,但我不确定你的例子是否真的有意义。在棋盘游戏的背景下,棋盘很难不考虑可能的动作(所以在这里应用demeter是没有意义的,因为董事会已经有权访问movement类)。

相关问题