知りたいこと
自身が認識している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ダメージ以上受けた時に状態異常を付与するなど。
- 再利用性は薄そう。
- ↑将来的にキャラクターと違うものが必要になったら括り出して継承すればよい?
参考
オブジェクト指向できていますか?
オブジェクト指向の設計と実装の学び方のコツ
スライド中で紹介されている本を入手したいが、中古かつ高額なので検討中。
以上です。簡単なご意見だけでも構いませんので、投稿していただけると幸いです。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/11 09:03
2019/02/11 09:18
2019/02/12 00:29