知识卡片
业务组件聚类靠数据生成职责唯一性任务描述里的规则让它不是贫血模型
内容
把行为(任务)和数据(实体)结合成业务组件时,聚类不是随便 按”相关”就能归拢的,作者给出了两条决定组件边界的关键规则。 第一条是数据生成职责唯一性:如果A主题域引用了B主题域的数据 实体,对A主题域做任务聚类时,不会把B主题域中被引用数据实体 相关的任务也聚类进A——那些任务应该由B主题域在做自己的聚类时 去考虑,这样才能保证在企业级系统里,每份数据只有唯一一个组件 真正拥有”生成”它的职责,不会出现多个组件都能写同一份数据、 互相打架的情况。第二条与之呼应:对同一个数据实体做新增、修改、 删除操作的任务,都应该归属到同一个组件里,只有这个组件对该 数据实体拥有写权限,其他所有引用了这个数据实体的组件都只能有 读权限——这也是保证企业级数据一致性的重要措施(如果确实需要 建立主副本,主本数据的设计方是主要负责方,副本设计方必须考虑 如何与主本保持一致)。这套按数据写权限唯一性聚类的方式,表面 上看很容易被误认成”贫血模型”——毕竟组件内任务和实体的关联 主要体现为对实体的增删改操作,这正是贫血模型最典型的症状 (数据和行为分离,实体本身没有业务逻辑)。但作者澄清这不是 贫血模型:流程对数据更丰富的处理规则(校验逻辑、业务约束、 计算规则等)都被包含在任务本身的描述里,只是没有像面向对象 设计那样把这些规则直接绑定到实体对象上而已——聚类的依据是 “谁对这份数据拥有唯一写权限”,而不是”这份数据本身有没有携带 行为”,这是两个不同维度的问题。
结构图:
flowchart TB
A[主题域A] -.引用.-> B[主题域B的数据实体]
A2[A主题域任务聚类] -->|不聚类B的写操作任务| A
B2[B主题域任务聚类] -->|B数据实体的增/删/改任务归此| B
C[数据实体X] --> W[唯一写权限组件]
C --> R1[组件1 只读]
C --> R2[组件2 只读]
W -->|处理规则藏在任务描述里| N[非贫血 只是规则不绑在实体对象上]
参考来源
- 位置:《企业级业务架构设计:方法论与实践》第5章"业务架构的
设计过程"5.4节"组件分析:行为与数据的结合"(源文件:
_epub-src对应text00019.html一带)
- 结论依据:原文明确"数据关系中存在一个主题域引用另一个主题域
的数据实体的情况……在对A主题域进行任务聚类时,不会考虑将B
主题域中被引用的数据实体相关的任务聚类进来……这样做可以保证
在企业级业务系统中,数据生成职责的唯一性""对同一数据实体
进行新增、修改、删除操作的任务应当归属于同一组件……只有这些
任务具有数据的写权限,而其他任务只具有读权限,这也是保证
企业级数据一致性的重要措施""流程对数据的更丰富的处理规则
可以包含在任务的描述中,因此这绝不是一个'贫血模型'",直接
支撑数据生成职责唯一性原则及贫血模型辨析这一结论。
- 原始内容:这样做可以保证在企业级业务系统中,数据生成职责
的唯一性,这是应用企业级数据模型时非常重要的一点……流程对
数据的更丰富的处理规则可以包含在任务的描述中,因此这绝不是
一个"贫血模型"。