设计 - 外部处理对象的状态
design - state of object handled externally
有一个设计相关的问题:
我有一个抽象的 class 播放器,带有子classes AIPlayer、HumanPlayer、NetworkPlayer 等以及 class GameManager。
当玩家走棋时,会为玩家提供不同类型的牌,可以在以后的走棋中使用。
我应该在哪里存储可供玩家使用的卡牌?
解决方案一:
使用 getter 和 setter 方法存储在抽象 class Player 中。
问题,subclass 可能会通过糟糕的编码意外更改玩家拥有的牌。即问题是 setter 方法对 Player 的子 class 可用,而实际上它应该只对 GameManager 可用 - 因为 GameManager 是唯一应该被允许的 class奖励卡片。
方案二:
创建不可修改的 class PlayerState 并在 GameManager 中存储从 Player 到 PlayerState 的私有映射。现在 GameManager 可以管理 Player 的状态,就像他们拥有的卡片一样,但是 Player 的子classes 只能从 GameManager 检索 PlayerState 对象,他们不能更改它。
问题,杀完了?我的意思是玩家本身就是对象,但他们使用另一个对象来获取状态。
我认为这取决于你把游戏逻辑放在哪里:
如果大部分逻辑都非常通用,因此在 GameManager 中,在 GameManager 中管理每个玩家的卡牌也会更容易.您实际上可以在 GameManager 中维护一个私有的 Map
来存储每个玩家的卡片,并通过将这些地图包装在一个不可修改的地图中来使卡片对 Player 及其实现可见,创建方式如 Collections.unmodifiableMap()
.
如果大部分逻辑是高度玩家特定的并且与其他玩家的交互不多,则最好将逻辑放在 Player 或 Player 中实施。在这种情况下,您可以直接在抽象 Player.
中维护可修改的 Set
卡片
但请始终牢记,如果不是在 Player 中,那么在 GameManager 中,您总是可以通过编码错误来搞砸事情。所以差异应该很小。
有一个设计相关的问题:
我有一个抽象的 class 播放器,带有子classes AIPlayer、HumanPlayer、NetworkPlayer 等以及 class GameManager。
当玩家走棋时,会为玩家提供不同类型的牌,可以在以后的走棋中使用。
我应该在哪里存储可供玩家使用的卡牌?
解决方案一: 使用 getter 和 setter 方法存储在抽象 class Player 中。
问题,subclass 可能会通过糟糕的编码意外更改玩家拥有的牌。即问题是 setter 方法对 Player 的子 class 可用,而实际上它应该只对 GameManager 可用 - 因为 GameManager 是唯一应该被允许的 class奖励卡片。
方案二: 创建不可修改的 class PlayerState 并在 GameManager 中存储从 Player 到 PlayerState 的私有映射。现在 GameManager 可以管理 Player 的状态,就像他们拥有的卡片一样,但是 Player 的子classes 只能从 GameManager 检索 PlayerState 对象,他们不能更改它。
问题,杀完了?我的意思是玩家本身就是对象,但他们使用另一个对象来获取状态。
我认为这取决于你把游戏逻辑放在哪里:
如果大部分逻辑都非常通用,因此在 GameManager 中,在 GameManager 中管理每个玩家的卡牌也会更容易.您实际上可以在 GameManager 中维护一个私有的
Map
来存储每个玩家的卡片,并通过将这些地图包装在一个不可修改的地图中来使卡片对 Player 及其实现可见,创建方式如Collections.unmodifiableMap()
.如果大部分逻辑是高度玩家特定的并且与其他玩家的交互不多,则最好将逻辑放在 Player 或 Player 中实施。在这种情况下,您可以直接在抽象 Player.
中维护可修改的
Set
卡片
但请始终牢记,如果不是在 Player 中,那么在 GameManager 中,您总是可以通过编码错误来搞砸事情。所以差异应该很小。