java - setter/getter 是否违反得墨忒耳法则?

标签 java getter law-of-demeter

假设有一个 GameState 类型,它使用 GameContext(通过 process 方法):

abstract class GameState {
    public abstract void process(GameContext context);
}

GameContext 将包含 Player、Shops 等对游戏必不可少的内容。

一个州可以访问它需要的东西:

class CombatState extends GameState {
    public void process(GameContext context) {
        Player player = context.getPlayer();

        if(player.isAlive()) {
            //...
        }
    }
}

语句 player.isAlive() 可以重写为 context.getPlayer().isAlive()

我的问题

Demeter 法则指出,对象只能与直系亲属互动。会不会违反原则,如何解决?

对于要动态处理的每个状态,形式参数必须为所有可能的状态所接受。 这使得严格按照对象的需要传递对象变得困难,这就是为什么每个状态都从“主要来源”获取它需要的东西的原因。我觉得主要来源的内聚性很低,因为 ShopState 需要的数据与 CombatState

不同

最佳答案

状态不是过程,过程是过程。战斗是一个过程,活着是一种境界。

使用process 的抽象名称需要打破得墨忒尔定律。

看这个例子:

class CombatProcess extends GameProcess {
    public void hit(Player puncher, Player beaten) {
        if (beaten.getState().isAlive()) {
           Weapon oneWeapon = one.getCurrentWeapon();
               ...
        }
    }
}

CombatProcess 中的一切都尽可能具体。

分析什么玩家与什么玩家战斗不是 CombatProcess 本身的责任!在 CombatProcess 开始之前,您必须知道您与谁作战。

编辑:

在你写的这个答案的评论中:

If I had the states in a Set, List or Map, I would not be able to polymorphically process the states,

这是绝对正确的。 Hook/Anchor-Pattern来自 1996 年,至今仍在 Windows 中广泛使用和荣耀(所谓的 system-hooks )。不幸的是,由于一些批评,它没有进入 OOD 的前 10 大模式。其中一位评论家是:

... its not easy to abstract all the operations of a process into logical independent hooks, and to thereafter anchor them and iterate them properly.

我个人的看法是,Hook/Ancher-Pattern 在 1996 年是革命性的, future 与 CDI(例如 spring)的结合将是革命性的。

终于!你可以决定:

  1. 打破 Demeter 的法则。
  2. 放弃 Hook/Ancher-Pattern。
  3. 写一个解决方法描述 here .

关于java - setter/getter 是否违反得墨忒耳法则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34173344/

相关文章:

Swift 多线程 Getter

design-patterns - 包装器/得墨meter耳的法律似乎是一种反模式

php - Demeter 法则非常令人困惑,因为看起来我永远无法编写返回对象的方法

java - 格式化字符串和简单字符串的区别

java - 从包含 java 命令的 java 文件执行 .class

Java - 尝试计算来自 Getter 的值的平均值

java - 驱动类ArrayList难度

java - 使用前强制转换变量

java - arrayAdapter 中的 AlertDialog 不工作

java - java 的得墨忒尔法则