2

假设我有以下代码:

public boolean doesElfLikeIt ( Monster mon )
 {
    if ( mon instanceof Orc ) { return false; }
    if ( mon instanceof Elf ) { return true; }

 }

这是一种好的编程方法还是我应该选择这样的方法:

public boolean doesElfLikeIt ( Monster mon )
 {
    if ( mon.getType() == Orc.type ) { return false; }
    if ( mon.getType() == Elf.type ) { return true; }

 }

我问这个的原因是因为我听到很多关于instanceof比较有多邪恶,但我发现它很有用。

4

2 回答 2

7

两者都不。你真正应该做的是:

class Monster {
  public abstract boolean likesElves();
}

class Orc extends Monster {
  public boolean likesElves() {
    return false;
  }
}

class Elf extends Monster {
  public boolean likesElves() {
    return true;
  }
}
于 2012-12-17T17:15:27.563 回答
2

Reverend Gonzo 提出的解决方案违反了封装并且没有回答问题。封装被违反了,因为所有怪物现在都必须知道他们是否喜欢精灵,以非常间接和根深蒂固的方式将所有怪物与特定的子类型(精灵)联系起来。它没有回答这个问题,因为兽人完全有可能喜欢精灵,但精灵不喜欢兽人!

我觉得您使用 instanceof 的初始解决方案完全可以。虽然 SLaks 提出了一个很好的观点,但我认为种族主义精灵(精灵不喜欢兽人,所有兽人亲戚听起来都非常种族主义;))是一个完全合理的设计决策,而不是程序员错误的迹象。

退后一步并解决“我如何让精灵喜欢一些兽人?”,我认为最好的答案是“模型为什么他们喜欢和不喜欢怪物,特别是兽人”。只要您关闭单个数据点(类型),您总是会有有限的行为。

于 2013-05-16T20:59:46.367 回答