私はこれを何日も考えてきましたが、どうすればよいかわかりません。私はPHPで戦闘システムをリファクタリングしようとしています(...申し訳ありません。)これまでに存在したものは次のとおりです。
- これまでのところ、戦闘に参加できるエンティティには2つのタイプがあります。それらをプレイヤーとNPCと呼びましょう。彼らのデータはすでにかなりよく書かれています。
- 戦闘に関与する場合、これらのエンティティはと呼ばれるDB内の別のオブジェクトでラップされ
Combatant
、特定の戦いに関する情報を提供します。彼らは一度に複数の戦闘に参加することができます。 - 戦闘員を投入して戦闘用のロジックエンジンを作成しようとしています。
- テスト用にすべてを模擬できるようにしたい。
ロジックとデータを分離するために、私は2つのインターフェース/基本クラス、ICombatantData
つまり1つともう1つを用意したいと考えていますICombatantLogic
。データの2つの実装者は、データベースに格納されている実際のオブジェクト用と、モックオブジェクト用です。
私は今、物事の論理的な側面を設計することに関して不確実性にぶつかっています。プレイヤーとNPCごとに1つの実装者を指定できますが、問題があります。戦闘員は、ラップするエンティティを返すことができる必要があります。このゲッターメソッドはロジックまたはデータの一部である必要がありますか?ロジック部分は戦闘の実行に使用されるため、データ内にあるべきだと強く思います。誰かが今度の戦いについての情報を探しているだけでは利用できません。しかし、データクラスはDBからモックのみを分離し、NPCからのプレーヤーは分離しません。DBデータインプリメンターの2つの子クラス(エンティティタイプごとに1つ)を試してみる場合、モックをループに維持しながらどのように設計すればよいですか?IEntityProvider
データクラスに注入するような3つ目のインターフェイスが必要ですか?
また、私が検討していたいくつかのアイデアでは、NPCのロジックが誤ってプレーヤーのデータをラップするなど、不一致がないことを確認するためにチェックを配置する必要があると思います。それは意味がありますか?それは、アーキテクチャが正しい場合にさえ起こり得る状況でしょうか、それとも、適切な設計がそれを完全に禁止しているので、チェックする必要がないのでしょうか?
誰かがクラス図などをレイアウトするのを手伝ってくれるなら、それはとても役に立ちます。ありがとう。
編集する
また、モックデータクラスではは実際には必要ありませんEntity
。代わりに、戦闘統計のようなすべてのパラメーターを直接指定しているだけです。おそらくそれは正しい設計に影響を与えるでしょう。
Combatant.entity
戦闘中には使用されないため、存在すべきではありません。おそらくEntityVsEntityCombat
、戦闘ロジックをラップし、Entity <--> Combatant
マッピングが含まれEntity
、戦闘終了後に状態を更新するような別のクラスが必要ですか?おそらく、現在のアーキテクチャに関するいくつかの情報が役立つかもしれません。