知识卡片
跨实体逻辑放聚合根方法还是领域服务:避免聚合根代码膨胀
内容
聚合内跨多个实体的复杂业务逻辑,理论上既可以写在聚合根的方法里,也可以写在领域服务里,两种方式都能组合多个实体对象完成复杂逻辑。但书中给出明确的实践建议:为了避免聚合根承担过多职责、导致聚合根类代码量过于庞大,聚合根除了承担聚合管理职能外,应该只实现和聚合根自身行为直接相关的业务逻辑,而把跨多个实体的复杂领域逻辑统一放到领域服务中实现;只有在聚合足够简单的情况下,才考虑把跨实体逻辑直接放进聚合根方法里。这条建议背后的原则是:聚合根已经承担了”实体+组织管理者+对外联络人”三重角色,如果再把所有跨实体的复杂业务计算逻辑也堆进聚合根,这个类很容易演变成一个职责混杂、难以维护的”上帝类”;把跨实体逻辑分离到领域服务,让聚合根始终保持相对聚焦和轻量,是一种为了长期可维护性主动限定单个类职责边界的取舍,代价是需要多认识”领域服务”这一层,但换来的是聚合根代码复杂度可控。
参考来源
- 位置:第8章《聚合和聚合根:怎样设计聚合》"8.2 聚合根"(源文件:_epub-src/OEBPS/Text/chapter3-4-2.xhtml)
- 结论依据:原文说明"但为了避免聚合根的业务逻辑过于复杂,避免聚合根类代码量过于庞大,我个人建议聚合根除了承担它的聚合管理职能外,只作为实体实现与聚合根自身行为相关的业务逻辑,而将跨多个实体的复杂领域逻辑统一放在领域服务中实现",直接支撑本卡片结论。
- 原始内容:但为了避免聚合根的业务逻辑过于复杂,避免聚合根类代码量过于庞大,我个人建议聚合根除了承担它的聚合管理职能外,只作为实体实现与聚合根自身行为相关的业务逻辑,而将跨多个实体的复杂领域逻辑统一放在领域服务中实现。