知识卡片

充血模型与贫血模型的区别

普通读书笔记卡

内容

充血模型和贫血模型是两种截然不同的实体类设计方式。充血模型里,业务逻辑都在领域实体对象内部实现——实体不仅包含属性,还包含自己的业务行为,DDD领域模型中的实体正是这样一个既有数据又有行为逻辑的对象,DDD更强调这种面向对象的设计方法,与单个实体相关的业务逻辑都写在实体类的方法里,跨多个实体的领域逻辑则放在领域服务中实现。贫血模型则相反:领域对象大多只有setter和getter方法用来读写属性,本身不包含任何业务逻辑,所有业务逻辑统一放在独立的业务逻辑层(Service层)来实现,实体退化成纯粹的数据容器。这个区分的价值在于:贫血模型看似分层清晰,实际上把”数据”和”操作这份数据的行为”人为拆开了,业务逻辑散落在Service层的各个方法里,容易变成大而全的”上帝类”,且实体本身失去了自我描述业务规则的能力;充血模型让每个实体自己负责维护和它相关的业务规则和状态一致性,更符合面向对象”数据和行为绑定在一起”的初衷,这也是DDD设计出来的实体类通常被期待采用充血模型而非贫血模型的原因。

参考来源

- 位置:第7章《实体和值对象:领域模型的基础单元》"7.1 实体","2. 实体的代码形态"(源文件:_epub-src/OEBPS/Text/chapter3-3-1.xhtml) - 结论依据:原文说明"在充血模型中,业务逻辑都在领域实体对象中实现,实体本身不仅包含了属性,还包含了它的业务行为。DDD领域模型中实体是一个具有业务行为和逻辑的对象。而在贫血模型中领域对象大多只有setter和getter方法,业务逻辑统一放在业务逻辑层实现,而不是在领域对象中实现",直接支撑本卡片结论。 - 原始内容:在充血模型中,业务逻辑都在领域实体对象中实现,实体本身不仅包含了属性,还包含了它的业务行为。DDD领域模型中实体是一个具有业务行为和逻辑的对象。而在贫血模型中领域对象大多只有setter和getter方法,业务逻辑统一放在业务逻辑层实现,而不是在领域对象中实现。