Ich versuche ein Kartenspiel zu modellieren, bei dem Karten zwei wichtige Funktionen haben:
Der erste ist ein Effekt. Dies sind die Änderungen am Spielstatus, die auftreten, wenn Sie die Karte spielen. Die Schnittstelle für den Effekt ist wie folgt:
boolean isPlayable(Player p, GameState gs);
void play(Player p, GameState gs);
Und Sie könnten die Karte nur dann als spielbar ansehen, wenn Sie ihre Kosten decken können und alle ihre Effekte spielbar sind. Wie so:
// 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;
}
Okay, soweit ganz einfach.
Die anderen Funktionen der Karte sind Fähigkeiten. Diese Fähigkeiten sind Änderungen des Spielstatus, die Sie nach Belieben aktivieren können. Als ich die Schnittstelle für diese erstellte, stellte ich fest, dass sie eine Methode zum Bestimmen, ob sie aktiviert werden können oder nicht, und eine Methode zum Implementieren der Aktivierung benötigten. Es endet zu sein
boolean isActivatable(Player p, GameState gs);
void activate(Player p, GameState gs);
Und mir ist klar, dass ich mit der Ausnahme, dass ich es "aktivieren" anstatt "spielen" nenne Ability
und Effect
genau die gleiche Signatur habe.
Ist es eine schlechte Sache, mehrere Schnittstellen mit einer identischen Signatur zu haben? Sollte ich einfach eine verwenden und zwei Sätze der gleichen Schnittstelle haben? Wie so:
Set<Effect> effects;
Set<Effect> abilities;
Wenn ja, welche Refactoring- Schritte sollte ich unternehmen, wenn sie nicht mehr identisch sind (da mehr Features veröffentlicht werden), insbesondere wenn sie divergent sind (dh, beide erhalten etwas, was der andere nicht sollte, im Gegensatz zu nur einem Gewinn) und die andere ist eine vollständige Teilmenge)? Ich bin besonders besorgt, dass das Kombinieren nicht nachhaltig sein wird, sobald sich etwas ändert.
Das Kleingedruckte:
Ich bin mir bewusst, dass diese Frage von der Spieleentwicklung ausgeht, aber ich denke, dass diese Art von Problem bei der Entwicklung außerhalb des Spiels genauso leicht auftreten kann, insbesondere, wenn versucht wird, die Geschäftsmodelle mehrerer Clients in einer Anwendung unterzubringen, wie dies bei nahezu der Fall ist Jedes Projekt, das ich jemals mit mehr als einem geschäftlichen Einfluss durchgeführt habe ... Auch die verwendeten Snippets sind Java-Snippets, aber dies könnte genauso gut auf eine Vielzahl objektorientierter Sprachen zutreffen.