我支持在线纸牌游戏的服务器,在考虑将其重构为更好的状态时,我发现自己无法根据自己的需要决定什么是正确的对象模型。
我有一个具有很多属性的Player类。第一个问题就是 - 班级太大了。第二个问题是我不知道如何重构它。我将列出一些属性和问题。
某些属性与玩家紧密相关:昵称,电子邮件,上次登录& c。我想,这些将直接保存在播放器类和DB中的同一个表中。
现在,一些属性有点难度,比如金钱和黄金金额。这些问题是它们历史上存储在不同的表中,以后可能会有更多的货币,它们必须按照自己的节奏同步到数据库中。
第三类属性与玩家松散耦合,如状态字符串,经验,成就,统计数据等。它们存储在数据库的不同表中,必须按照自己的节奏进行存储,检索,缓存和同步。
请注意,这里的一个大问题是我们必须实现相对复杂的数据库同步方案,因为我们有很多在线玩家,而且我们的游戏是软实时的,我们必须尽可能降低数据库的负载
我的问题是:
我很抱歉,如果我的问题是假的,我不是很擅长OOP设计,我更像是一个FP家伙。我的英语不是很好=)。
答案 0 :(得分:1)
PlayerView_Small
,PlayerBuying
,PlayerFighting
,PlayerSettings
(取决于您的游戏,它们可能无法达到完全相同的目的)......这种方式适用于每个人需要“播放器上的信息,您只需加载您需要的播放器数据,并且可以正确处理它。另外,如果某个类只是另一个类的更详细版本,则可以使用继承。PlayerAttributes
和PlayerFighting
中包含实例的子课程PlayerView_Detailed
。在数据库中,将它存储为字符串(由我们的类方便地输出,并在构造函数中接受)可能是有趣的,以避免有太多的字段,但你将失去排序能力。在我们的案例中,这可能不是问题,但可能在其他一些问题上。PlayerViewDetailInfo
(或PlayerAllData
中,根据您的需要),您可以放置一些方法,例如ToXmlClient1()
,ToJson()
,ToHumanReadableString()
(尽管这可能有点令人困惑,你应该考虑HTML ^^)。具有该方法的类应该是具有最少(但足以提供答案)数据的类。在请求时,您加载Player...
,其中包含提供正确输出的方法,并直接在响应中写入。