私は、プレイするためのクエストを提供するJavascriptゲームを作成しています。各クエストには、特定の要件が満たされたときに完了する多数のタスクがあります。以下は、もともと一緒に行くことを意図したデザインです。クエストシステムでイベントやタスクを構造化/設計してコードを管理しやすくするには?
あなたが見ることができるように、各Task
及びGameEvent
(Event
に簡略化)が(辞書の中にカプセル化)タイプといくつかのデータを有しています。イベントがに送信されると、それはアクティブなQuest
オブジェクトに渡され、オブジェクトはタイプが同じであると仮定して、それぞれTask
に渡します。タスクの各requirement
は、そのイベントの相関data
に対してテストされます。私が1:1チェックをしないのは、イベントが追加のデータを持っている可能性があるからです。
例えばdata{item: someItem, locationFound: someLocation} != requirement{item: someItem}
これは、作成する必要があるクラスの数を最小限に抑えるという点で素晴らしい作品。イベントやタスクは一般的なものなので、大量のサブクラスを作成することなく簡単に作成してテストすることができます。
しかし、この設計では問題が発生します。その一般性のために、最初に同じタイプのイベントを見つけてそれに送信されるデータをチェックすることなく、タスクにどのような要件を与えるべきかは決して決してありません。プロジェクトが拡大するにつれて、これは管理する悪夢になります。
代わりに、私はこのように、様々なタイプをカバーするEvent
とTask
の両方のためのサブクラスを作成することができます。
Event -> ItemPickupEvent, MoveEvent, etc.
Task -> ItemPickupTask, ItemPickedUpAtLocationTask, MoveTask, etc.
しかし、データは、それらの間に同様であり、非常に不必要なようです。
次のように私の最後の考えは、特定のイベントタイプによって渡されるデータをカプセル化するデータオブジェクトを作成することでした。
ItemPickupData、MoveData、TalkDataなど
イベントとタスクはちょうど適切な与えることができますデータオブジェクト。これにより、使用されているデータの構造が改善されます。データの一部を要件にしてはならない場合は、デフォルトでnullにすることができます。
メンテナンス性と構造設計上、これは適切な解決策ですか、それともこの問題にアプローチする良い方法がありますか?
ありがとうございました。
あなたの答えをありがとう。最終的には、イベントやタスクのためにサブクラスに戻すことは避けられませんでした。あなたが言うように、要件がより具体的でなければならない場合があります(つまり、追加のプロパティを処理する必要があるかもしれません)。現時点では、タスクによって必要とされるすべてのデータはEventDataオブジェクトに取り込まれるため、ヌル以外のプロパティをチェックするだけで柔軟性を試すことができます。もし何らかの理由でこれが将来問題を引き起こすならば、自分の思考に沿ったアプローチをもっと見なければならないでしょう。 – sookie
@sookieもうひとつメモしておきますが、たくさんのクラスを作成しないようにするのは間違いですが、複雑さやタイピングからあなたを救うように見えるかもしれませんが、実際はそうではありません。小さなデータ構造を使用する小さなサブクラスの代わりに、すべてのエンティティのコードを記述する必要がありますが、型のない型とメソッドのないデータ構造の小さなサブクラスの管理は簡単です。 –