3

次のクラスを使用してプログラムを作成したいと考えています: クラスPlayerは、get/set 関数を使用してプレーヤーに関する情報を格納します。Player は、get/set 関数を使用して独自のデータを持つAttackPlayerのようにすることができます。また、Player はProtectorPlayerのようにすることもできます。また、 AttackPlayerとは異なる get/set 関数を持つ他の独自のデータを使用することもできます。

また、 Player はTeamPlayerまたはFreePlayerにすることができ、これらの各クラスには独自のデータなどがあります。

問題は、階層を正しく実装する方法です。

最初は多重継承のことを考えていたのですが、これはとにかく良くありません。次のようなもの: Player AttackPlayer extends Player ProtectorPlayer extends Player

TeamPlayer は AttackPlayer または ProtectorPlayer を拡張します FreePlayer は AttackPlayer または ProtectorPlayer を拡張します

また、戦略パターンについても考えましたが、一般的なアルゴリズムがないため、ここでは適用できません。

そのような相互作用を整理するのに役立つアプローチはありますか?

これを行う別の方法は、Player クラスにフィールドを用意することです。これは、TeamPlayer/FreePlayer が Attack または Protector タイプであるかどうかを識別し、それに応じて適切なフィールドにアクセスするのに役立ちます。この場合、継承は次のようになります。

Player TeamPlayer 拡張 Player FreePlayer 拡張 Player

攻撃、保護の構造体またはクラスは継承せずに、Player クラスのフィールドとして使用します。

しかし、私はそのようなアプローチが好きではなく、より良いデザインを探しています.

4

5 に答える 5

6

IMHO継承は、これには間違ったモデルです。代わりに、プレイヤー クラスとそれに対するさまざまな役割を用意します。プレイヤーが同時に複数の役割を持つことができるかどうかによって異なります。戦略パターンを使用します。

于 2013-06-07T07:01:24.150 に答える
0

これは、TDDが非常に便利な場合に問題になる可能性があります。最初はアプローチが遅いように見えますが、設計が明確でない場合は非常に便利です。TDD は、設計がコード自体から出現する傾向があります。

TDD を試してみたい場合は、当社のコーチが書いたこのブログから始めることができます。また、できれば、ここでTDDに関連する 2 つのエピソード (エピソード 6a と 6b) を見てください。

于 2013-06-07T07:15:53.440 に答える
0

以下のように、factory と Strategy を混在させることができます。

プレイヤーはチーム プレイヤーまたはフリー プレイヤーになり、アタッカーまたはプロテクター戦略を使用してプレイできます。したがって、Free Player または Team Player は Player クラスを継承することができ、それらの中で、Attacker または Protector になることができる Playing 戦略を関連付けることができます。したがって、この場合、プログラムの開始者は Factory を呼び出して、プレイヤーがフリー プレイヤーかチーム プレイヤーかを決定し、プレイに使用する戦略を渡すことができます。Player で戦略を関連として持つと、新しい戦略を追加するためのコードの拡張性を維持するのに役立ちます。プレーヤーのタイプのファクトリーは戦略とは別であるため、独立して拡張できます。継承を多用すると、コードのパフォーマンスと保守に問題が生じる可能性があります。

「拡張」などの言葉を Java 固有のものと見なさないでください。

于 2013-06-07T08:35:18.133 に答える
0

プレーヤーは TeamPlayer または FreePlayer にできます

TeamPlayer は AttackPlayer または ProtectorPlayer を拡張します FreePlayer は AttackPlayer または ProtectorPlayer を拡張します

私は、このアプローチは大丈夫だと思います。データの保存について考えてみましょう。データベースに保存したい場合は、それが良い方法です。すべてのプレーヤーデータを含むプレーヤーテーブルがあり、プレーヤーテーブルを拡張する他のテーブルを作成して、さまざまなタイプのプレーヤーのデータを保存します。クラステーブルの継承を見てください

実際、継承階層は 1 より大きくすることができますが、4 より大きくすることはできません。継承が明らかな場合は問題ありません。主なルールは、複雑さを低く保つことです。

一方、このデータをdbに保存したり、外部キーをプレーヤーオブジェクトからFreeオブジェクトに保存したりしない場合は、別のアプローチを使用してください。

于 2013-06-07T07:53:53.343 に答える