我正在尝试为纸牌游戏建模,其中纸牌具有两项重要功能:
首先是效果。这些是您玩纸牌时对游戏状态所做的更改。效果界面如下:
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);
我认识到,与调用它的异常“激活”,而不是“玩”,Ability
并且Effect
有相同的签名。
具有具有相同签名的多个接口是否不好?我应该简单地使用一个,并拥有两组相同的接口吗?因此:
Set<Effect> effects;
Set<Effect> abilities;
如果是这样,如果它们变得不相同(随着更多功能的发布),我应该采取哪些重构步骤,特别是如果它们之间存在分歧(即它们都获得了彼此不应该获得的东西,而不是仅仅获得一个)另一个是完整的子集)?我特别担心的是,一旦发生变化,将它们结合起来将是不可持续的。
精美印刷品:
我认识到这个问题是由游戏开发引起的,但是我认为这是在非游戏开发中同样容易出现的问题,尤其是当试图在一个应用程序中容纳多个客户的业务模型时,我所做的每个项目都具有不止一个业务影响力...而且,所使用的代码段是Java代码段,但这可以很容易地应用于多种面向对象的语言。