質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.59%

手持ちのインスタンスのメソッドを呼び出すだけのメソッドが存在するのは設計力不足か?

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,223

score 27

知りたいこと

自身が認識しているOOP的な設計手法を用いると、メソッドを呼び出すだけのメソッドが必要になる。
設計が誤っているのか、仕方がないことなのか、見当がつかない。

  • Q1. メソッドを呼び出すだけのメソッドは存在すべきではないのか。
  • Q2. オブジェクト指向が冗長になるのは正常か。
  • Q3. あなたは、拡張の必要がなければ省略をするか。
  • Q3. あなたは、仕様により拡張の必要性がないことが確定している場合、クラスをまとめる等OOP的趣向から外れた設計を行うか。
  • Q4. 下記例の設計は誤っているのか。
  • Q5. 設計についておすすめの書籍等

一部でも構いませんので、ご回答いただけると幸いです。

キャラクター同士がバトルを行う簡易的なゲームを例とする。

キャラクタークラスはキャラクター正常性クラスのインスタンスを所有している。
キャラクター正常性クラスはキャラクターステータスクラスとキャラクター状態異常クラスを所有している。
キャラクターステータスクラスはステータスクラスを所有している。

キャラクターのHPからN引くという処理を行う場合、キャラクタークラスからステータスクラスまでメソッドのいわゆるバケツリレーが必要になる。

なお、各クラスの想定されている役割は以下の通り。

  • キャラクタークラス: キャラクターを構成するプロパティを保つ
  • キャラクター正常性クラス: ゲーム中で変動するプロパティを保つ
  • キャラクターステータスクラス: ゲーム開始時にレベル等から算出されるプロパティを保つ HP・MPなど
  • キャラクター状態異常クラス: ゲーム中で付与されるプロパティを保つ 毒・氷など
  • ステータスクラス: プロパティそのもの。増減する。

擬似コード

適当な攻撃命令

const attack = () => {
    // charaX は Character のインスタンス
    charaA.attackTo(charaB);
}

キャラクタクラス

class Character {
    private viability: CharacterViability = new CharacterViability();
    attackTo(target: Character) {
        target.damage(this.power);
    }

    damage(damageValue: number) {
        this.viability.decrease(ViabilityType.HP, damageValue);
    }
}

キャラクタ正常性クラス

class CharacterViability {
    private status: CharacterStatus = new CharacterStatus();
    private ailment: CharacterAilment = new CharacterAilment();

    decrease(type: ViabilityType, value: number) {
        if (StatusType.indexOf(type)) {
            this.status.decrease(type, value);
        } else if (AilmentType.indexOf(type)) {
            this.ailment.decrease(type, value);
        }
    }
}

キャラクタステータスクラス

class CharacterStatus {
    private status = { [StatusType.HP]: new Status(), [StatusType.MP]: new Status() }
    decrease(type: StatusType, value: number) {
        this.status[type].decrease(value)
    }
}

ステータスクラス

class Status {
    this.value = 0;
    decrease(value) {
        this.value -= value;
    }
}

所感

  • 例外処理・拡張はしやすい。例えば、50ダメージ以上受けた時に状態異常を付与するなど。
  • 再利用性は薄そう。
  • ↑将来的にキャラクターと違うものが必要になったら括り出して継承すればよい?

参考

オブジェクト指向できていますか?
オブジェクト指向の設計と実装の学び方のコツ
スライド中で紹介されている本を入手したいが、中古かつ高額なので検討中。

以上です。簡単なご意見だけでも構いませんので、投稿していただけると幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

Q3がいまいち分かりません、もう少し掘り下げて質問して下さい。

Q1. メソッドを呼び出すだけのメソッドは存在すべきではないのか。
打たなければならない量にもよりますね。4つ以上ぐらいなら作った方が得だったりします。

Q2. オブジェクト指向が冗長になるのは正常か。
正常です。オブジェクト指向はいわば部品です。
車はおよそ3万の部品からできているので、正常と言えば正常です。

Q4. 下記例の設計は誤っているのか。
個人的にはHPとMPは一つの構造体に管理させた方が分かり易いかな?

Q5. 設計についておすすめの書籍等
https://www.amazon.co.jp/%E7%8B%AC%E7%BF%92%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3C-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%E3%83%86%E3%82%AF%E3%83%8E%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF%E3%83%BB%E3%82%A2%E3%83%BC%E3%83%88/dp/479811720X/ref=sr_1_3?ie=UTF8&qid=1549874176&sr=8-3&keywords=%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3+gof

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/11 18:03

    ご回答ありがとうございます。Q3の修正を行いました。
    内容に関しては追ってコメントいたします。

    キャンセル

  • 2019/02/11 18:18

    書籍のリンクは、マークダウンで
    [書籍名](リンク)
    のようにするとよいです。

    キャンセル

  • 2019/02/12 09:29

    コピペで何とかなるから良いかなと思ってました。
    参考にさせて頂きます。

    キャンセル

checkベストアンサー

+1

  • Q1. 「必要かどうか」によります。その判断は状況次第。
  • Q2. 冗長だと思う場合は(OOPだからではなく)まず自分の設計を疑うべきかと。その上で「しゃーない」or「もっと短くなるやん!」となります。
  • Q3. 行います。詳細後述。
  • Q4. 要件によります。
  • Q5. 必要ならググって、後はフィーリングとか前例に習うとか。

Wikipedia先生曰く『「カプセル化」「継承」「多態性」を持ってりゃオブジェクト志向』らしいので、
「OPP=全部の要素を個別のクラスに分ける」ではないと個人的に思います。

で、「どこまでクラスを細分化するか?」は
「どのようにクラスを細分化したら開発しやすいか?」と同義だと思います。

細分化した方がやりやすければ細分化するし、
細分化した方がやりにくければ細分化しません。

質問の例で言うと、私だったら全部キャラクタークラスに突っ込むと思います。
ですが何かの理由でこのように細分化した方が良い可能性もあるので「絶対にこれは不正解」とは言えないです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

Q1. メソッドを呼び出すだけのメソッドは存在すべきではないのか。

ケースバイケース。

Q2. オブジェクト指向が冗長になるのは正常か。

正常。

Q3. あなたは、仕様により拡張の必要性がないことが確定している場合、クラスをまとめる等OOP的趣向から外れた設計を行うか。

積極的にします。クラスにする理由がOOP的なポリシー以外になければ強いてまとめません。

Q4. 下記例の設計は誤っているのか。

個人の感想。this.viability.decreaseあたりまでは「あっても良いかな」と思いました。それ以下のは「要らないしかえって邪魔」と思いました。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る