我在公司里设计一个游戏。这是一个基于回合的游戏。
不变量:
A游戏至少有两个玩家,一个开始日期和其他属性。
( b)每个玩家在游戏中玩一个回合。
( c)当加入游戏时,成员成为玩家。
( d)成员可以是0-n比赛中的运动员.
我的主要问题是如何聚合这些概念。
起初,我认为该成员是它自己的aggregate.Since,其他人只维护对它的引用。
后来有可能游戏是另一个集合的根,包括玩家和回合。我能保证:
我想听听你的做法,因为我真的被困住了。
发布于 2018-09-09 18:00:51
你说得对,有两个Aggregates,但现在你需要明白为什么。
成员聚合拥有成员的数据和行为。什么是会员的意思,如何成为会员,什么时候可以更名,什么时候可以解锁等等。
游戏集合拥有游戏规则和两个玩家。它拥有保护其不变量并在UI中显示它所需的所有数据。它保护的不变量是:
为了保护第二个不变量,游戏有一个turn
状态,它是指向下一个玩家的指针。但是这里有一个有趣的问题:什么是播放器,如何在代码中表示它?
播放器是指向其中一个成员的指针。它拥有游戏聚合或UI所需的所有属性。游戏聚合需要它的ID来保护第一个不变量(检测重复ID),以加载成员所玩的所有游戏,并在UI中显示玩家的名称,以便其他玩家知道他们正在玩的是谁。
播放机似乎是一个实体,因为它有一个ID和另一个属性,它的名称,但这并不是因为它没有自己的名字或行为:当一个成员可以改变它的名字和如何改变它的名字是由成员聚合控制的,玩家的名字被更新,没有播放器有一个词,也许在背景中。
从游戏的角度来看,玩家只是一个普通的对象,是不可变的,有一个ID和一个名为string
。这是一个值对象的完美候选。
因此,尽管成员是聚合根(这是一种实体类型),但是具有与成员相同的ID和名称的播放器不是实体,而是值对象。
https://stackoverflow.com/questions/52227429
复制相似问题