2014-01-17

http://anond.hatelabo.jp/20140117045337

わかりやすさについてとやかく言わないけどさ、攻撃するってことは、モンスターHPだとかが減るんだよね?

勇者.attack(モンスター)

って書いたとしてもさ、勇者.attackメソッドの中で、モンスターHPを直接書き換えるわけじゃないでしょ?

直接書き換えてたら、モンスターに守備力だとか、耐性追加した時に、勇者側を書き換えないといけなくなる。

守備力だとか、耐性だとかは、モンスター属性なので、影響はモンスター側で面倒見てもらいたいから

攻撃でHPを減らすのは、モンスターメソッド経由になると思う。

結局、

class 勇者 :
  method attack(モンスター: monster):
      monster.attackedBy(self.attackPower)

みたいなコードになると思うんだけど。


攻撃方法型は、具体的にはどんなメソッドフィールドが並ぶのか

攻撃方法に共通のメソッドが、インターフェイスになる。

例えば、攻撃力取得メソッド

interface 攻撃方法:
    /** 攻撃力取得 */
    method getAttackPower();


フィールドは、攻撃方法によって違うかもしれないが、攻撃者を持っとけば汎用的かな。

/** 通常攻撃は力=攻撃力 */
class 通常攻撃 implements 攻撃方法:

    field _attacker

    constructor(攻撃者: attacker):
        self._attacker = attacker

    method getAttackPower():
        return self._attacker.strength
/** 突撃は力*すばやさ=攻撃力 */
class 突撃 implements 攻撃方法:
    
    field _attacker

    constructor(攻撃者: attacker):
        self._attacker = attacker

    method getAttackPower():
        return self._attacker.strength * self._attacker.agility

そうすると、攻撃方法が違っても、モンスターのattackedByメソッドの処理は共通

class モンスター:
    method attackedBy(攻撃方法: attackMethod):
        self._hp = self._hp - attackMethod.getAttackPower()
monster.attackedBy(new 通常攻撃(player));
monster.attackedBy(new 突撃(player));

利点は、攻撃方法が増えた時に、攻撃方法型を実装したクラス定義すればよくて、

勇者モンスターも書き換える必要がないことだよ。

記事への反応 -
  • 例えばスーファミのFFみたいな、古典的なRPGの戦闘シーンを作っていて、「勇者がモンスターを攻撃する」。 勇者.attack(モンスター); という設計だったとする。 これに「モンスターが毒...

    • MVC以前にオブジェクト指向がしっくりきてないでしょ。 「勇者がモンスターを攻撃する」。 勇者.attack(モンスター); という設計だったとする。 これが既にオブジェクト指向的じゃな...

      • ご意見くださって、ありがとうございます。 例にあげたRPGのモデル設計はhttp://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1178047006を参考にしました。 ですが自分で書くとしても、十中八九そ...

        • 一理あるご意見をいただきました。ありがとうございます。 英語として読みにくいなら、メソッド名のほうを変えるよ。 モンスター.attackedBy(勇者.attackPower) 誤解を招いてしまったよ...

          • わかりやすさについてとやかく言わないけどさ、攻撃するってことは、モンスターのHPだとかが減るんだよね? 勇者.attack(モンスター) って書いたとしてもさ、勇者.attackメソッドの中で、...

            • 守備力だとか、耐性だとかは、モンスターの属性なので、影響はモンスター側で面倒見てもらいたいから、 攻撃でHPを減らすのは、モンスターのメソッド経由になると思う。 結局、 c...

        • 英語として読みにくいなら、メソッド名のほうを変えるよ。 モンスター.attackedBy(勇者.attackPower) 攻撃方法が増えるなら、攻撃方法を抽象化するでしょ。 攻撃方法型を作って モンスター....

    • モデルで発生するイベントが多く、複雑になるほど、ビューとの関連は密になる。 ここの所は、今回の例ではいまいち見えづらい気がする。今回の例で複雑になっているのはモデルだ...

      • 元増田です。ありがとうございます。 モデルで発生するイベントが多く、複雑になるほど、ビューとの関連は密になる。 ここの所は、今回の例ではいまいち見えづらい気がする。 ...

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん