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: Tackling Complexity in the Heart of Software, Evans E. , 2003
一大串葡萄就算有一亿颗,也只是同一个类“葡萄”的对象集合。若干颗葡萄(数量不得少于煎蛋的2倍)、两个煎蛋、一根油条、一杯豆浆、若干张纸巾,再加一把叉子,组成一份早餐,这个才是有意义的“组合”。
图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年