3

これは設計上の質問であり、可能な限り明確に組み立てるつもりですが、私が直面している問題を何と呼ぶのかよくわかりません。

私はビデオゲームに取り組んでおり、ゲームのセットアップとプレイには複数のステップが含まれます。すべてをきれいに保つために、これらの各ステップをある種のオブジェクトでラップしたかったのです。

ゲームの流れをセッション、ラウンド、スポーンに分割することにしました。ゲームのセッションは最高のスコープレベルであり、どのプレーヤーがアクティブであるかを(参加画面を介して)構成してから、ラウンドを開始します。1つのセッション内で複数のラウンドをプレイでき、それらの各ラウンドはグローバルセッションデータを継承します。同様に、ラウンドとセッションの両方からデータを継承して、各ラウンドで複数回死んでリスポーンすることができます。

だから、ある種の無料を想像してみてください。

  • セッション1
  • セッション2
    • ラウンドA
    • ラウンドB
      • スポーン1
      • スポーン2
    • ラウンドC
  • セッション3

スポーン1は、ラウンドBとセッション2のデータにアクセスできます。

これはかなりきれいなデザインのようです。セッション全体のデータを1つの場所に保持し、セッション全体を通じてそのオブジェクトを存続させ、各ラウンドが分岐してこのデータを継承することができます。

今興味深い問題。前に言ったように、セッションにはプレーヤーのコレクションが含まれています(ゲームに参加し、セッション全体でアクティブなプレーヤー)。ラウンドはまた、各プレーヤーに関するいくつかの追加データを保持する必要がありますが、そのデータはラウンド内にのみ存在します(たとえば、最後のスポーンポイント、または現在のスコア)。同じパターンに従って、このラウンド固有のデータを保持する別のクラスを作成したかったのです。

これが故障するのは、コレクションを維持するときです。セッションにはプレーヤーに関する信頼できるリストが含まれ、各ラウンドは追加のアドオンデータを提供するため、ラウンドはSessionPlayerのメンバーを更新する必要がありますか?ラウンドには、ラウンドレベルのデータとセッションレベルのデータへのポインタを含む独自のプレーヤーのリストが必要ですか?IDが一致する個別のコレクションを含める必要がありますか?

これは巧妙なデザインパターンで解決できるように思えますが、私はそれを見つけることができませんでした。

要約すると、コレクションを含むオブジェクトを一時的にラップし、そのコレクションのすべての要素もラップする方法は?

私はそれをきちんと説明したと思います。助けてくれてありがとう!

4

2 に答える 2

2

最初に最後の質問に答えるには:

要約すると、コレクションを含むオブジェクトを一時的にラップし、そのコレクションのすべての要素もラップする方法は?

これは、クラスがそれ自体の要素を含み、クラスがスタンドアロンまたはコンテナである可能性がある複合デザインパターンで実現できます。このクラスの操作は、それ自体と、クラスに含まれる各要素で機能します。

プレーヤーをどこに保存するかについての以前の質問に関しては、これは少し難しいですが、決定する際には次のことを考慮する必要があります。

  • プレーヤーデータは確かにすべて1つの場所にある必要があります。所有権を異なるオブジェクト間で分離すると、設計が煩雑になり、保守が困難になります。
  • 依存関係の階層(Session、Round、Spawn)でポインタ/参照を前後に配置しないようにしてください。これにより、非常に複雑で非常に迅速になり、依存関係の階層ではなく、非常に高い絡み合ったクラスのねじれた混乱になります。カップリング。
  • プレーヤーデータが依存関係階層のすべてのレベルで必要な場合は、意味があり、階層のすべてのレベルから簡単にアクセスできる場所に含める必要があります。この場合、すべてのレベルがプレーヤーデータについて知る必要があることが本当に必要かどうかを自問することも検討する必要があります。

これらの双方向参照が絶対に必要な場合は、依存性注入を使用して実装するのがおそらく最善の方法です。これにより、双方向参照の維持に伴う一般的な頭痛の種が単純化されます。セッションのようにルートレベルのオブジェクト全体だけでなく、必要な最も具体的なエンティティのみを注入するようにしてください。

于 2012-06-25T05:38:31.427 に答える
0

つまり、SessionPlayerクラスとRoundPlayerクラスがあります。RoundPlayerをSessionPlayerの非静的メンバークラスにするのはどうですか?このようにして、2つの異なるコレクションを維持できます。1つはSession用、もう1つはRound用で、RoundPlayerは暗黙的にSessionPlayerへの参照を持ちます。

于 2012-06-25T07:24:11.140 に答える