玩家对象设计

时间:2011-08-22 07:57:55

标签: database oop

我支持在线纸牌游戏的服务器,在考虑将其重构为更好的状态时,我发现自己无法根据自己的需要决定什么是正确的对象模型。

我有一个具有很多属性的Player类。第一个问题就是 - 班级太大了。第二个问题是我不知道如何重构它。我将列出一些属性和问题。

某些属性与玩家紧密相关:昵称,电子邮件,上次登录& c。我想,这些将直接保存在播放器类和DB中的同一个表中。

现在,一些属性有点难度,比如金钱和黄金金额。这些问题是它们历史上存储在不同的表中,以后可能会有更多的货币,它们必须按照自己的节奏同步到数据库中。

第三类属性与玩家松散耦合,如状态字符串,经验,成就,统计数据等。它们存储在数据库的不同表中,必须按照自己的节奏进行存储,检索,缓存和同步。

请注意,这里的一个大问题是我们必须实现相对复杂的数据库同步方案,因为我们有很多在线玩家,而且我们的游戏是软实时的,我们必须尽可能降低数据库的负载

我的问题是:

  1. 如何确定要在播放器类中存储哪些属性以及哪些不属于?说,经验,昵称,金额?
  2. 如果有一些属性可以组合在一起,如(力量,敏捷,耐力,& c。)和(handItem,headItem,feetItem,weapon)什么时候应该分组,什么时候不分组?
  3. 如何处理复杂的数据库同步方案?为需要独立同步的每个属性创建一个单独的模型,或者使一些DataManager类将它们分开并与它们一起使用?
  4. 如何让课程为外部消费者提供多种不同的“数据表示”?像XML,Json,一些外部服务的XML,人类可读的字符串,& c。
  5. 我很抱歉,如果我的问题是假的,我不是很擅长OOP设计,我更像是一个FP家伙。我的英语不是很好=)。

1 个答案:

答案 0 :(得分:1)

  1. 您可以在播放器类中存储的内容没有“限制”。只要它只涉及他和他,就应该在他的班上。但是你应该考虑的一件事是制作几个球员类。这个想法是:如果你不需要,不要查询它。您可能拥有PlayerView_SmallPlayerBuyingPlayerFightingPlayerSettings(取决于您的游戏,它们可能无法达到完全相同的目的)......这种方式适用于每个人需要“播放器上的信息,您只需加载您需要的播放器数据,并且可以正确处理它。另外,如果某个类只是另一个类的更详细版本,则可以使用继承。
  2. 如果您正在讨论该课程,则可能是在PlayerAttributesPlayerFighting中包含实例的子课程PlayerView_Detailed。在数据库中,将它存储为字符串(由我们的类方便地输出,并在构造函数中接受)可能是有趣的,以避免有太多的字段,但你将失去排序能力。在我们的案例中,这可能不是问题,但可能在其他一些问题上。
  3. 现在空白,我不明白哪里有同步,会在收到通知后进行编辑。
  4. PlayerViewDetailInfo(或PlayerAllData中,根据您的需要),您可以放置​​一些方法,例如ToXmlClient1()ToJson()ToHumanReadableString()(尽管这可能有点令人困惑,你应该考虑HTML ^^)。具有该方法的类应该是具有最少(但足以提供答案)数据的类。在请求时,您加载Player...,其中包含提供正确输出的方法,并直接在响应中写入。