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

ゴンゾー牧師が提案した解決策は、カプセル化に違反しており、質問には答えていません。すべてのモンスターがエルフが好きかどうかを知る必要があり、非常に間接的で根深い方法ですべてのモンスターを特定のサブタイプ (エルフ) に結び付けているため、カプセル化は破られています。オークがエルフを好きで、エルフがオークを好きではないということは完全にあり得るので、それは質問に答えません!

instanceof を使用した最初のソリューションはまったく問題ないと思います。SLaks は良い点をもたらしますが、人種差別主義者のエルフ (エルフはオークが好きではなく、すべてのオークの親戚はかなり人種差別主義者に聞こえます ;)) は完全に正当な設計上の決定であり、プログラマーのエラーを示すものではないと私は主張します。

一歩下がって「オークが好きなエルフをどうやって持つのですか?」に対処するには、「一般的にモンスターが好きで嫌いな理由、特にオークが好きな理由をモデル化する」が最善の答えだと思います。単一のデータ ポイント (タイプ) をキーオフしている限り、動作は常に制限されます。

于 2013-05-16T20:59:46.367 に答える