知识卡片

三种领域逻辑组织模式概览对比

结构图卡

内容

领域逻辑的组织方式主要有三种。事务脚本:每个用户动作对应一个过程,该过程负责接收表现层输入、校验计算、存取数据库、调用其他系统,再把结果返回表现层;脚本内部可拆成共享子例程,但每个动作始终由单一过程驱动。领域模型:围绕领域中的名词(如租约、资产)建立类,校验和计算逻辑分散到各个对象自身承担,不再由一个过程统揽全局,行为分布在对象网络里。表模块:介于二者之间,围绕数据库表(而非过程或对象实例)组织逻辑,每张表只对应一个公共类实例,与记录集配合工作——客户先查询生成记录集,再用记录集构造表模块对象,调用时需附带记录ID区分具体是哪一条记录。三者优缺点各有侧重:事务脚本简单、事务边界清晰、易与简单数据源层配合,但逻辑复杂后容易产生重复代码、结构杂乱;领域模型能用继承/策略等技术从容应对复杂逻辑的持续演化,但上手门槛高、数据源层映射代价大;表模块提供了比事务脚本更多的结构、更容易发现冗余,且天然契合基于记录集的GUI/ORM工具(如.NET环境),但拿不到领域模型的细粒度面向对象组织能力。三者并不互斥,同一系统里用事务脚本处理简单部分、领域模型或表模块处理复杂部分是常见做法。

结构图

flowchart TB
  A["领域逻辑组织模式"]
  A --> T["事务脚本<br/>过程驱动,每动作一脚本"]
  A --> D["领域模型<br/>对象驱动,行为分散到各对象"]
  A --> M["表模块<br/>表驱动,围绕记录集"]
  T --> T1["优:简单/事务边界清晰"]
  T --> T2["缺:复杂后重复代码/结构杂乱"]
  D --> D1["优:细粒度扩展(继承/策略)"]
  D --> D2["缺:上手代价高/数据源层复杂"]
  M --> M1["优:比事务脚本更结构化,契合记录集工具"]
  M --> M2["缺:无法用领域模型的细粒度OO技术"]

参考来源

- 位置:《企业应用架构模式》第一部分"表述"之"第2章 组织领域逻辑"(源文件:_epub-src/OEBPS/Text/000015.html) - 结论依据:原文分别定义"事务脚本是这样一个过程:从表示层获得输入、进行校验和计算处理、将数据存储到数据库中……""建立一个应用领域的模型,至少在开始的时候主要围绕领域中的名词来组织……而是由每一个对象都承担一部分相关逻辑""表模块……围绕表而非直接围绕过程来组织领域逻辑,提供了更多的结构,而且更容易发现和移除冗余代码",并逐一列出各自优缺点,直接支撑本卡结构图。 - 原始内容:这三种模式并不互相排斥。事实上,使用事务脚本来处理一部分领域逻辑,同时使用表模块或领域模型来处理剩下的部分,这也是很常见的。