J'essaie de modéliser un jeu de cartes où les cartes ont deux ensembles de fonctionnalités importants:
Le premier est un effet. Ce sont les changements d'état du jeu qui se produisent lorsque vous jouez la carte. L'interface pour l'effet est la suivante:
boolean isPlayable(Player p, GameState gs);
void play(Player p, GameState gs);
Et vous pourriez considérer la carte comme jouable si et seulement si vous pouvez couvrir son coût et que tous ses effets sont jouables. Ainsi:
// 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;
}
D'accord, jusqu'à présent, assez simple.
L'autre ensemble de fonctionnalités sur la carte sont les capacités. Ces capacités sont des modifications de l'état du jeu que vous pouvez activer à volonté. En proposant l'interface pour ceux-ci, j'ai réalisé qu'ils avaient besoin d'une méthode pour déterminer s'ils peuvent être activés ou non, et d'une méthode pour implémenter l'activation. Il finit par être
boolean isActivatable(Player p, GameState gs);
void activate(Player p, GameState gs);
Et je me rends compte qu'à l'exception de l'appeler "activer" au lieu de "jouer", Ability
et Effect
avoir exactement la même signature.
Est-ce une mauvaise chose d'avoir plusieurs interfaces avec une signature identique? Dois-je simplement en utiliser un et avoir deux ensembles de la même interface? Ainsi:
Set<Effect> effects;
Set<Effect> abilities;
Dans l'affirmative, quelles étapes de refactorisation dois-je suivre si elles deviennent non identiques (à mesure que davantage de fonctionnalités sont publiées), en particulier si elles sont divergentes (c'est-à-dire qu'elles gagnent toutes les deux quelque chose que l'autre ne devrait pas, par opposition à une seule gagnant et l'autre étant un sous-ensemble complet)? Je suis particulièrement préoccupé par le fait que leur combinaison ne sera pas durable dès que quelque chose changera.
Les petits caractères:
Je reconnais que cette question est engendrée par le développement de jeux, mais je pense que c'est le genre de problème qui pourrait tout aussi facilement surgir dans le développement non-jeu, en particulier lorsque vous essayez d'adapter les modèles commerciaux de plusieurs clients dans une application comme cela arrive avec à peu près chaque projet que j'ai jamais réalisé avec plus d'une influence commerciale ... De plus, les extraits de code utilisés sont des extraits de code Java, mais cela pourrait tout aussi bien s'appliquer à une multitude de langages orientés objet.