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

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

新規登録して質問してみよう
ただいま回答率
85.48%
オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

解決済

3回答

2025閲覧

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

kznr.luk

総合スコア27

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

0クリップ

投稿2019/02/11 08:26

編集2019/02/11 09:02

知りたいこと

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

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

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

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

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

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

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

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

擬似コード

適当な攻撃命令

typesctipt

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

キャラクタクラス

typescript

1class Character { 2 private viability: CharacterViability = new CharacterViability(); 3 attackTo(target: Character) { 4 target.damage(this.power); 5 } 6 7 damage(damageValue: number) { 8 this.viability.decrease(ViabilityType.HP, damageValue); 9 } 10}

キャラクタ正常性クラス

typescript

1class CharacterViability { 2 private status: CharacterStatus = new CharacterStatus(); 3 private ailment: CharacterAilment = new CharacterAilment(); 4 5 decrease(type: ViabilityType, value: number) { 6 if (StatusType.indexOf(type)) { 7 this.status.decrease(type, value); 8 } else if (AilmentType.indexOf(type)) { 9 this.ailment.decrease(type, value); 10 } 11 } 12}

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

typescript

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

ステータスクラス

typescript

1class Status { 2 this.value = 0; 3 decrease(value) { 4 this.value -= value; 5 } 6}

所感

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

参考

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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 08:40

stdio

総合スコア3307

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kznr.luk

2019/02/11 09:03

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

2019/02/11 09:18

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

2019/02/12 00:29

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

0

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

ケースバイケース。

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

正常。

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

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

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

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

投稿2019/02/11 12:39

編集2019/02/11 12:40
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

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

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

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

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

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

投稿2019/02/11 09:37

sakura_hana

総合スコア11427

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問