![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
どうもオブジェクト指向をかんがえると
どうもこんがらがる者です。
オブジェクト指向でRPGゲームを作成しようと思い立ちました。
そこでひとまず、マップとキャラクターの構成を下記のように
考えてみました。(フィールドやメソッドの説明は割愛します。)
※ 親<-子 ◇-集約を表す
<キャラクター関連>
キャラクタ <┬ ファイター <┬ 自キャラ
│ └ 敵キャラ
└ 町の人
<マップ関連>
フィールド ◇┬マップ(マップ配列を管理する)
└町の人[ ]
この時に、自キャラクラスがフィールドクラス
(マップの情報を管理するクラス)をインスタンスとして保持する
ことを思いついたのですが(キャラクタの現在位置という意味で)
そう考えると、自キャラがフィールドを持つことで
町の人を持っている状態になり、おかしいような気がしました。
根本的に間違っているかもしれませんので
なんでもいいのでご意見お願いします
No.1ベストアンサー
- 回答日時:
>自キャラがフィールドを持つことで町の人を持っている状態になり、おかしいような気がしました。
別に問題は無いと思います。(その方が都合の良い場合もあるでしょう。)
キャラaが持っているフィールドのインスタンスとキャラbが持っているフィールドのインスタンスが
同じならaとbは同じフィールド上に居ることになるでしょう。
ただキャラクラスが必ずしもフィールドのインスタンスを持つ必要はありません。
例えば描画するクラスは別に存在するとして
フィールドと町の人を描画する場合には引数としてフィールドのインスタンスを渡すだけで良いはずで
キャラクラスがフィールドのインスタンスを持っている必要はありません。
他にもキャラaとキャラbの距離を求めたいとするなら、フィールドクラスにそのメソッドを用意すれば良いのです。
その場合もキャラaとキャラbは座標を返すメソッドさえあれば良いはずです。
※その辺の設計は言語や環境にも依存する部分ですのでオブジェクト指向として
絶対的な答えがあるわけではありませんし好みの問題もあります。
・他の人がみてわかりやすい設計
・データが冗長的でない
・処理速度に問題がない
以上3点のバランスを考えて設計すれば問題ないと思います。
※マップの配列というのが意味がわかりませんでしたが森とか山とか海とかの属性を持つマスの配列という事ですよね?
ご回答ありがとうございました。
設計のアドバイスもしていただいてありがとうございます。
冗長関連でひとつ懸念事項を思いつきました。
自キャラが複数になる場合には、それぞれのキャラが
フィールドを持つのはおかしいですよね。
自キャラというクラスはパーティというクラスに変更して
ステータス用(HPなど)の各インスタンスを配列で持たせることで
解決するんですかね。
でもおっしゃるとおりキャラとフィールドを
分離させておくとそのような事も解決しますね。
No.5
- 回答日時:
> 実装後でも修正が容易にできるということではないですよね??
「容易に」の捕らえ方には程度の差があると思いますが・・・
ちゃんとカプセル化されている場合は、通常、容易に修正できます。
(再コンパイルは必要ですが)
例えば、Javaで標準で提供されているクラス郡について考えて見ます。
StringやVectorなどよく使いますよね。
これらもJavaで書かれていますが、実装を昔から変更していないと思いますか?
(実際に変更されているかどうか知りませんが)
利用する立場で考えた場合、そのクラスにどういうインタフェース(つまりパブリックメソッド)
があるかが重要で、内部でどんな処理がなされているかは重要ではないのです。
「キャラクタ」に対して、何を求めるかですが、現在位置をX,Y座標で教えてほしいのであれば、
「現在位置をX,Y座標で教えて」と聞けるパブリックメソッドがあればよくて、
「キャラクタ」クラスが、内部的にどんな形で保持していて、どう処理をしているかは知る必要がありません。
クラス間でどんなやり取りが生じるのか、という設計は後々変更が難しいですが、
クラスの内部でどんな処理をするのかは、そのクラス内部を修正すればよいだけですので
影響範囲は小さくて済みます。
カプセル化を強く意識して設計すると、再利用性の高いプログラムが出来ると思います。
それができるかどうかは、分析段階にかかっています。オブジェクト指向において、
分析段階がいい加減だと、メリットを一切享受できない最悪の結果を招くこともあります。
No.4
- 回答日時:
オブジェクト指向には、
オブジェクト指向分析とオブジェクト指向設計があります。
質問者さんが行ったのは、前者のオブジェクト指向分析にあたります。
対象となる事柄を分析するのがオブジェクト指向分析で、それを踏まえてJavaでどう実装するか考える(設計する)わけですが、分析時の関連をそのままクラス実装にする必要はありません。
Javaもオブジェクト指向の理想を100%実現できるわけではないので、分析に登場しないクラスや関連を付け加えたり関連を除去したりしてプログラムを完成させるのが普通です。
質問者さんのアプローチは特に間違っていないと思いますが、「オブジェクト指向」を意識しすぎるので戸惑うのかもしれません。
ご回答ありがとうございます。
つまり分析の後、クラスの関連を考える段階が重要という事ですね。
そこで問題があるかどうかが分かると、そういう事ですね。
分析>設計>コーディングという手順を踏んだことがないのですが
設計の段階で重要な事はなんでしょうか?
クラス図もシーケンス図もきちっと書いたほうがいいのでしょうか?
自作APIのリファレンスとかも用意するもんなんでしょうか?
No.3
- 回答日時:
ご質問は、キャラクタクラスの”プライベートで”保持する変数として、ということですよね。
プライベートで持つ以上、ほとんどの場合、答えは「どっちでもいい」となると
思います。
実装上の問題ですので、問題があれば実装を変更するだけでよいので。
これが、”パブリック”である場合は問題が異なります。
要は、カプセル化された中身の話はさほど重要ではないということです。
ご回答ありがとうございます。
はい。プライベートで保持するつもりです。
カプセル化された中身の話はさほど重要ではない
というのは実装前の変更には柔軟に対応できるという
認識でよろしいでしょうか?
実装後でも修正が容易にできるということではないですよね??
No.2
- 回答日時:
ご自身がおっしゃるように「キャラクタの現在位置という意味で」、
自キャラクラスがフィールドクラスをインスタンスとして保持するのは、
問題ないかと思います。
僕としては、キャラクター関連の「ファイター」が気になります。
もし、職業であればキャラクターの属性にしちゃいますね。
そうすると、職業の変更とかも可能ですから。
ご回答ありがとうございます。
ファイターというのは・・・わかり難かったかもしれませんが
職業ではなく「戦う者」という意味です。
町の人クラスと違って、HPや攻撃力などのステータスも管理できるクラスの意味です。
職業のような属性をキャラクラスに持たせるのも面白いですね…
別の意味で参考になりました・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java 複数TBLのオブジェクトを1つの変数(オブジェクト)でまとめて管理したい 1 2022/12/17 00:12
- その他(ゲーム) みなさんはシミュレーションRPGにどういうものを求めますか? 昔に比べたら作品数がどんどん先細っちゃ 1 2022/03/28 14:55
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
- JavaScript オブジェクト配列の各メンバを任意の式で評価して、その評価値が最大のオブジェクトを返す関数はありますか 2 2023/05/20 15:02
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/05/21 02:41
- JavaScript javaScriptで画面に値を入れるには 1 2022/08/14 12:27
- その他(Microsoft Office) ピボットテーブルへの集計フィールド挿入 1 2023/02/26 11:33
- その他(スマホアプリ・スマホゲーム) 原神のキャラで、育成順序がわからず悩んでいます。 こんにちは、私は原神を始めて5日の初心者です。 突 1 2023/05/25 00:29
- その他(教育・科学・学問) 教員の業績のために学生を動員できる範囲 1 2023/06/06 16:57
- PHP クラス 1 2022/08/08 15:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
interface,extend,implementの...
-
委譲って何ですか?
-
JavaのimplementsをC言語で例え...
-
C# 「データが失なわれる可能性...
-
c++でのヘッダーファイルの循環...
-
新規契約でUQモバイル申し込も...
-
エクセルVBAで、条件に一致する...
-
onClickで関数呼出し後に、結果...
-
private static という変数の修飾
-
JavaでのDirectXの使用
-
java gui のイベント処理が重い
-
DataGridViewの行追加について。
-
Javaのクラスのstaticメソッド...
-
変数名の付け方
-
どうしてListオブジェクトをIte...
-
ATLとMFCの違いは何でしょうか?
-
インスタンスを同じ名前で作成...
-
iterator とiterableの関係がわ...
-
EXCEL VBAにて動的にCheckBOXを...
-
ドラッグして矩形を描くには
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
interface,extend,implementの...
-
C# 「データが失なわれる可能性...
-
「ラッパークラス」の存在意義...
-
c++でのヘッダーファイルの循環...
-
(vba)他のアプリケーションの右...
-
「継承されたメソッドの可視性...
-
「IOException は対応する try ...
-
ゲッターを使わないで変数にア...
-
JavaでのAPIの覚え方ってみさな...
-
VB DLLプロジェクトについて
-
Javaで下線
-
【C#】クラスのコンストラクタ...
-
Javaのインスタンス化の構文の...
-
委譲って何ですか?
-
ASP.NETでの共通コードの書き方...
-
オーバーライドとラッパーの違い
-
抽象クラスをJUNITでテストする...
-
JTextFieldの入力制限
-
Commons-Discovery.jarとは?
-
setTextについて
おすすめ情報