软件方法(下)分析和设计第8章分析 之 分析类图——知识篇(20211227更新)
软件方法(下)分析和设计第9章分析 之 分析类图——案例篇(20211228更新)
8.3.3.3 DDD****话语中的“聚合”
起名和隐喻
DDD话语中也有“聚合(Aggregate)”,和之前各种面向对象方法学以及UML的“聚合(Aggregation)”有一些差别。
Eric Evans在发明新式话语时,应该是借鉴了Aggregation,但为了“创新”,改一个词:Aggregate。DDD话语中的Aggregate相当于整个聚合/组合结构,整体类被称为“聚合根(Aggregate Root)”。
如前文所言,不管是Aggregation还是Aggregate,很容易误解成“累计”或“集合”,混同于各种集合类(List、Queue、Stack……)。
其实Eric Evans应该借鉴的是之前面向对象方法学和UML中的"组合(Composition)",然后发明“Composite”和“Composite Root”。
Eric Evans在发明“Aggregate”新式话语时,应该没有意识到这一点。从他在书中用一串葡萄来隐喻“聚合”就可以看出来。
图8-117 摘自Domain-Driven Design: TacklingComplexity in the Heart of Software, Evans E. , 2003
一大串葡萄就算有一亿颗,也只是同一个类“葡萄”的对象集合。若干颗葡萄、两个煎蛋、一根油条、一杯豆浆、若干张纸巾,再加一把叉子,组成一份早餐,这个才是有意义的“组合”。
图8-118 有意义的聚合/组合
另外,Eric Evans选用这个图片,可能还搞错了另一个知识,不过这个知识不是软件开发知识,而是植物学知识。
植物学上有聚合果(Aggregate Fruit)的概念,如下图
图8-119 摘自百度百科“聚合果”词条
Eric Evans可能想到“Aggregate Fruit”这个术语,觉得葡萄是成串的,以为葡萄是“Aggregate Fruit”,于是把图片放上去了——其实葡萄是单果。
图8-120 摘自https://zhuanlan.zhihu.com/p/37538771
当然,也可能Eric Evans用这个图片的时候,并没有意识到“Aggregate Fruit”之类的概念,觉得图片差不多意思就用上了。
如果要换一个更好的隐喻,可以从1994年出版的Grady Booch书中所给的类比中挑一个。
图8-121 摘自《面向对象分析与设计(原书第2版)》,Booch G. 著;冯博琴 等译,英文原版出版于1994年
实践中的思维颠倒
……
关于聚合,以前还发过一篇文章:猴子掰玉米?比较不同版《领域驱动设计》说“不变式”和“聚合”
UMLChina建模竞赛题大全-题目全文+分卷自测(11套110题)
全程字幕-26套UML+Enterprise Architect/StarUML建模示范视频(202201更新)
《软件方法》书中自测题-题目全文+分卷自测(1-8章)16套111题