首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >域驱动设计-如何聚合一个基于转弯的游戏

域驱动设计-如何聚合一个基于转弯的游戏
EN

Stack Overflow用户
提问于 2018-09-07 17:51:16
回答 2查看 420关注 0票数 0

我在公司里设计一个游戏。这是一个基于回合的游戏。

不变量:

A游戏至少有两个玩家,一个开始日期和其他属性。

( b)每个玩家在游戏中玩一个回合。

( c)当加入游戏时,成员成为玩家。

( d)成员可以是0-n比赛中的运动员.

我的主要问题是如何聚合这些概念。

起初,我认为该成员是它自己的aggregate.Since,其他人只维护对它的引用。

后来有可能游戏是另一个集合的根,包括玩家和回合。我能保证:

  • 当我创建它的时候。
  • 不变量b)聚合体内部满足不变量所需的所有条件。
  • 不变的c)这个聚合的=>不负责

我想听听你的做法,因为我真的被困住了。

EN

回答 2

Stack Overflow用户

发布于 2018-09-08 02:57:28

在一种基于回合的游戏中,比如零和叉、跳棋、国际象棋、铅棋,我通常会期望“游戏”集合包括移动和当前位置的令牌/棋盘/画面。

其理由是,要弄清楚游戏历史是否内在一致,就需要能够“一起”看到所有的历史,这样你才能发现矛盾。

看到这一点的一种方法是注意到两个不同的成员通常不存在任何依赖关系,因此它们是聚合的不同实例是有意义的。如果一个游戏是由两个成员共享的,那么它不可能仅仅属于任何一个成员,所以它必须是某个单独跟踪的第三个聚合。

票数 1
EN

Stack Overflow用户

发布于 2018-09-09 18:00:51

你说得对,有两个Aggregates,但现在你需要明白为什么。

成员聚合拥有成员的数据和行为。什么是会员的意思,如何成为会员,什么时候可以更名,什么时候可以解锁等等。

游戏集合拥有游戏规则和两个玩家。它拥有保护其不变量并在UI中显示它所需的所有数据。它保护的不变量是:

  1. 在游戏开始之前,至少有两个不同的玩家必须存在,而且一个成员只能在同一游戏中玩一次。
  2. 每个玩家都一个接一个地移动
  3. 当玩家处于游戏状态时,它就不能再移动了。
  4. 诸若此类

为了保护第二个不变量,游戏有一个turn状态,它是指向下一个玩家的指针。但是这里有一个有趣的问题:什么是播放器,如何在代码中表示它?

播放器是指向其中一个成员的指针。它拥有游戏聚合或UI所需的所有属性。游戏聚合需要它的ID来保护第一个不变量(检测重复ID),以加载成员所玩的所有游戏,并在UI中显示玩家的名称,以便其他玩家知道他们正在玩的是谁。

播放机似乎是一个实体,因为它有一个ID和另一个属性,它的名称,但这并不是因为它没有自己的名字或行为:当一个成员可以改变它的名字和如何改变它的名字是由成员聚合控制的,玩家的名字被更新,没有播放器有一个词,也许在背景中。

从游戏的角度来看,玩家只是一个普通的对象,是不可变的,有一个ID和一个名为string。这是一个值对象的完美候选。

因此,尽管成员是聚合根(这是一种实体类型),但是具有与成员相同的ID和名称的播放器不是实体,而是值对象。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52227429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档