聚合根是唯一的吗

13-01-12 flyzb
如果出现两个领域模型,但是这两个领域模型的聚合根是相同的(比如人、书之类)。大家觉得这可能出现吗?如果出现这种情况,那么是分析设计出问题了,还是DDD出问题了?欢迎大家讨论
         

banq
2013-01-12 08:05
聚合根一般是实体,而实体的定义是标识唯一,那么聚合根应该是唯一的。

不过你的意思是,聚合根是唯一的类型?还是类型数量的唯一?比如Car有发动机 车轮 车厢高聚合组成,Car是聚合根,但是发动机也可以是聚合根,一个聚合边界内可以有几个聚合根,不过数量多操作复杂。

两个不同聚合边界分别有两个聚合根,如果他们相同,应该无所谓,根据实际情况,比如成品在进库入库子系统中是聚合根,在销售的子系统中也可能是一个聚合根。

两个子系统中运作改变的是同一个聚合根实体的不同状态而已。

我又要用这张万能图来说明了:

这张图其实说明一个聚合边界内的聚合根会发生什么?如果是两个聚合边界,还是用这张图再分析一次。在一个聚合边界内,无非是用户发出事件去改变聚合根的一些状态。

[该贴被banq于2013-01-12 08:06修改过]

flyzb
2013-01-12 10:18
  banq,其实我提出这个问题是考虑应该“如何正确地切分或设计领域边界”。因为按照“传统内聚”的思路,一个“聚合根”所有相关的逻辑都应该在一起的,那就不可能出现“2个领域模型,一个聚合根”的现象。

  如果“2个领域模型,一个聚合根”是合理的,那么在设计DDD的领域时,应该先根据业务确定领域边界,再确定”聚合根“。当然,一个领域模型内的”聚合根“应该是唯一的。但”聚合根“并不是这个领域模型存在的唯一理由,而是”场景+聚合根“才能确定一个领域模型。

  其实这里就存在了一个让我很担忧的隐患,因为每个人对实际业务”场景“的认识都是一个渐进的过程,那就可能造成领域模型的不稳定性。

[该贴被flyzb于2013-01-12 10:22修改过]

banq
2013-01-12 10:41
2013-01-12 10:18 "@flyzb"的内容
,因为每个人对实际业务”场景“的认识都是一个渐进的过程,那就可能造成领域模型的不稳定性 ...

是这样,特别是BDD敏捷中行为驱动开发讲究故事的渐进,这个过程实际是不断对领域模型的重构,其实DDD中强调BoundedContext也就是这个意思。

仔细分析场景是什么,场景实际主要是业务事件发生的地方,对场景认识不断加深影响到领域模型的认识,可以归结为:对业务事件的认识深入会影响到领域模型的认识。甚至不同的业务事件会作用于不太相同的领域模型上。那么需要从下面两个方面思考:

这种业务行为的改变是否需要改变领域模型的结构呢?还是只需要改变领域模型的状态呢?

归结为一句话:改变的是类型还是值?

孙悟空会72变,那么我们设计时,当孙悟空在白骨精洞这个场景变成苍蝇,那么我们是改变孙悟空这个类型还是其状态呢?

所以,我的意思是:根据具体场景来进行判断,如果发生改变类型的事情,说明我们从一开始就进入了错误的方向,角度就切入错误了。

[该贴被banq于2013-01-12 10:43修改过]

flyzb
2013-01-12 11:27
    banq,大体赞同你的观点,但细节上还有些差别。

    从你上面解释中,我发现有3个关键词:场景、事件和领域。DDD最本来的目的就是为了更好地”解决复杂场景描述问题“的。而在我看来,任何一种描述场景的设计思想都必须遵循2个基本原则:“单一性”和”复杂是简单的组合“,比如”复杂写可以分解为复杂读和简单写“、”复杂读可以分解为简单读“。

    按照这种思路,我更关注场景拆分是否合理,其中'领域的划分”和“事件”是必不可少的2个支撑“场景”拆分的关键技术。在这样过程中,我不特意强调“聚合根”,认为“敏捷DDD”只看“组合是否自然合理”。因为整个设计更强调组合,所以既使“对业务的认识有偏差”,重构更自然,成本更低。显然,重构成本是“敏捷DDD”的关键。

[该贴被flyzb于2013-01-12 12:18修改过]

猜你喜欢
2Go 1 2 下一页