3

这是一个设计问题,我将尽可能清楚地描述它,但我不确定如何称呼我面临的问题。

我正在开发一款视频游戏,设置和玩游戏涉及多个步骤。我想将这些步骤中的每一个都包装在某种对象中,以保持一切清洁。

我选择将游戏流程拆分为会话、回合和生成。游戏的会话是最高范围级别,您可以配置哪些玩家处于活动状态(通过加入屏幕)然后继续开始一轮。您可以在单个会话中进行多轮比赛,并且每一轮都将继承全局会话数据。同样,您可以在每一轮中多次死亡和重生,从轮次和会话中继承数据。

所以想象某种免费的。

  • 第 1 节
  • 第 2 节
    • A轮
    • B轮
      • 产生 1
      • 产卵 2
    • C轮
  • 第三节

Spawn 1 将有权访问 Round B 和 Session 2 的数据。

这似乎是一个非常干净的设计。我可以将会话范围的数据保存在一个地方,并使该对象在整个会话期间保持活动状态,每一轮都分支并继承这些数据。

现在有趣的问题。就像我之前说的,会话包含一组玩家(加入游戏并在整个会话期间处于活动状态的玩家)。回合还需要保留一些关于每个玩家的额外数据,但这些数据只存在于回合内(例如最后一个生成点,或当前分数)。我想遵循相同的模式并创建另一个类,该类将保存此轮特定数据。

这在维护集合时出现故障。因为会话包含玩家的权威列表,并且每一轮都提供额外的附加数据,所以该轮是否应该只更新 SessionPlayer 的成员?回合是否应该有自己的球员名单,每个球员都有回合级别的数据和指向会话级别数据的指针?它们是否应该包含具有匹配 ID 的单独集合?

这似乎可以通过一种巧妙的设计模式来解决,但我一直找不到。

总结一下:如何临时包装一个包含集合的对象,同时包装该集合的所有元素?

我希望我解释得当。谢谢您的帮助!

4

2 回答 2

2

首先回答你的最后一个问题:

总结一下:如何临时包装一个包含集合的对象,同时包装该集合的所有元素?

这可以通过复合设计模式来实现,其中类包含自身的元素,并且该类可以是独立的,也可以是容器。对此类的操作将对其自身及其包含的每个元素起作用。

关于您之前关于将播放器存储在哪里的问题,这有点困难,但您在决定时应该考虑以下几点:

  • 玩家数据确实应该都在一个地方。如果你将它的所有权分离到不同的对象,那是一个混乱的设计并且难以维护。
  • 尽量避免在依赖层次结构(Session、Round、Spawn)中来回使用指针/引用,因为这会很快变得非常复杂,并且它将不再是依赖层次结构,而是由非常高的相互交织的类组成的扭曲混乱耦合。
  • 如果依赖层次结构的所有级别都需要玩家数据,那么它应该包含在有意义的地方,并且层次结构的所有级别都可以轻松访问。如果是这种情况,您还应该考虑问自己是否真的有必要让所有级别都需要了解玩家数据。

如果绝对有必要拥有这些双向引用,那么实现它的最佳方法可能是使用Dependency Injection。这将简化维护双向引用所涉及的典型难题。尝试只注入所需的最具体的实体,而不仅仅是整个根级对象,如 Session。

于 2012-06-25T05:38:31.427 回答
0

所以有 SessionPlayer 和 RoundPlayer 类。让 RoundPlayer 成为 SessionPlayer 的非静态成员类怎么样?这样,您可以维护 2 个不同的集合,1 个用于 Session,1 个用于 Round,其中 RoundPlayer 隐式引用了 SessionPlayer。

于 2012-06-25T07:24:11.140 回答