カードに2つの重要な機能セットがあるカードゲームをモデル化しようとしています。
最初は効果です。これらは、カードをプレイしたときに起こるゲームの状態の変化です。有効なインターフェイスは次のとおりです。
boolean isPlayable(Player p, GameState gs);
void play(Player p, GameState gs);
そして、あなたはそのコストをまかなうことができ、そのすべての効果がプレイ可能である場合にのみ、カードをプレイ可能と考えることができます。そのようです:
// in Card class
boolean isPlayable(Player p, GameState gs) {
if(p.resource < this.cost) return false;
for(Effect e : this.effects) {
if(!e.isPlayable(p,gs)) return false;
}
return true;
}
さて、これまでのところ、非常に簡単です。
カードの他の機能セットは能力です。これらの能力は、ゲームの状態の変化であり、自由にアクティブ化できます。これらのインターフェイスを思いついたとき、それらをアクティブ化できるかどうかを判断する方法と、アクティブ化を実装する方法が必要であることに気付きました。最終的には
boolean isActivatable(Player p, GameState gs);
void activate(Player p, GameState gs);
そして、「play」ではなく「activate」と呼ぶことを除いて、まったく同じ署名Ability
をEffect
持っていることに気付きました。
同一のシグネチャを持つ複数のインターフェースを持つのは悪いことですか?単純に1つを使用し、同じインターフェイスを2セット持つ必要がありますか?そのように:
Set<Effect> effects;
Set<Effect> abilities;
もしそうなら、どのようなリファクタリング(より多くの機能がリリースされるように)それらが同一ではなくなった場合、特に分岐している場合(つまり、どちらも一方が獲得するのではなく、他方が獲得すべきでないものを獲得する場合)手順を踏むべきですかそしてもう一方は完全なサブセットです)?特に、何かを変更するとすぐにそれらを組み合わせることが持続不可能になることを心配しています。
細かい活字:
この質問はゲーム開発によって生じたものであると認識していますが、ゲーム以外の開発でも、特に1つのアプリケーションで複数のクライアントのビジネスモデルに対応しようとすると、簡単に忍び寄ることができるような問題だと感じています私がこれまでに複数のビジネスに影響を与えてきたすべてのプロジェクト...また、使用されるスニペットはJavaスニペットですが、これは多くのオブジェクト指向言語に簡単に適用できます。