1

私は1995年のゲームThemeHospitalのクローンの一種である小さなJavaゲームに取り組んでいます。私は最近GUIとレベル構造に取り組んでいますが、パスファインディングとグリッドが機能するようになりました。私の現在の「もの作り」のやり方は、1つの部屋と1つの受付で構成されており、これまでのところ問題なく機能しますが、さまざまなタイプの部屋やアイテムを追加する方法を実装する必要があります。これは、オブジェクトを作成するためのボタンを押すときの現在のコードです(http://snipt.org/lUm)。

これを行うにはもっと良い方法があるはずです!私の実装は貧弱ですが、抽象クラスとインターフェースの使い方を理解し始めたのはつい最近のことです。

部屋やアイテムのプロパティを実際に設定しているので、現在問題はありません。私は先を考えていますが、ここStackで物事を行うための最良の方法についてさまざまな意見を得る方法が大好きです。そのようなことをどのように達成すべきかについてのアイデアでは?この種のものの例はありますか?私はそれを検索しますが、私がしていることが正確な名前を持っているかどうかわからないので、何を検索すればよいのかよくわかりません。

何を話しているのかはっきりしていなかったらごめんなさい。これに関する質問には喜んでお答えします。または、必要に応じて、または要求に応じて、コードのセクションをさらにアップロードします。

よろしくお願いします!

4

4 に答える 4

3

ファクトリパターンを確認してください。ファクトリは、パラメータを提供し、共通のインターフェイスに準拠するオブジェクトを元に戻すことによってオブジェクトを作成する手段です。ただし、実装は工場によって決定されます。呼び出し元のコードはこれを知る必要はありません。

オブジェクト構造を別のオブジェクト(ファクトリ)にカプセル化することにより、構築する特定のオブジェクトを選択するメカニズムが、呼び出し元のコードから抽象化されます。ファクトリ自体を変更するだけで、後日、さらにサブクラスを簡単に提供できます。

したがって、サンプルコードでは、buildMe()メソッドはファクトリの形式です。ビルドする必要があるもの(aRoomまたはa )を指定するいくつかのパラメーターを取りますReceptionDesk。これらは両方とも同じインターフェース(HospitalComponent?)を実装し、呼び出し元のコードはそのコンポーネントを病院内に配置します。HospitalComponentのサブクラスをファクトリ(?)にさらに追加できOperatingTheatre、呼び出し元のコードを変更する必要はありません。

オブジェクトを使用して一般的な問題を解決するさまざまな方法を理解し、ソリューションを他の人に伝える方法については、デザインパターン(このシナリオでは、作成パターンのリストを確認してください)を調査する価値があります。Gang-of-Fourの本は、この主題の聖書です。

于 2009-08-02T21:50:30.007 に答える
1

ポリモーフィズムは、あなたがしていることにやり過ぎかもしれません。

個人的には、各建物の値(最大サイズ、タイルあたりのコストなど)のテーブルを含むRoomクラスがあります。次に、新しい部屋を作成するときに、一致するテーブルエントリを取得し、テーブルの詳細を使用してRoomオブジェクトを作成します。

これはベストプラクティスではない可能性があり、おそらくJavaの規則(動的言語からJavaに来ました)に反しますが、新しい部屋を作るために変更が必要なコード行に関しては、私が見つけた中で最も低いものです。

于 2009-08-02T21:52:04.103 に答える
0

ポリモーフィズムでこの問題をモデル化する前に、慎重に考えます。

問題は、部屋のタイプごとに根本​​的に異なる動作がどのように現れるかということです。それらすべてに共通するものは何ですか?

ポリモーフィズムが常に答えであるとは限りません。作曲は時々物事をより柔軟に保つことができます。以前に推奨されたように、データ駆動型ソリューションが何よりも優れている可能性があります。

于 2009-08-03T00:59:52.190 に答える
0

これで、一連の静的関数を持つ 1 つのクラスができました。これはあまり OOP ではありません。クラスは、すべての関数を 1 つのファイルにグループ化する方法にすぎません。

OOP ルートに進む場合は、Room の基本クラスが必要であり、OperatingRoom、ReceptionistDesk、Bathroom、Office (for Staff)、MRIRoom、WaitingRoom、さらには Hall が Room の子クラスになります。

public class Room {
    protected int width, length;  //how many squares wide/long the room is

    protected int x, y;  //where it is on the gride

    protected float buildingProgress;  //how far construction has come

    protected bool isReady;  //is the building ready for use?

    protected Person occupants[];  //some list/array of people currently in the room

    protected Person resident;  //the person 'in charge' in the room--the receptionist, manager, MRI technician, etc etc.
}
于 2009-08-02T22:16:05.263 に答える