第一部分 表述
用8个叙述章把分层、领域逻辑、映射、Web、并发、会话与分布组织成可验证的应用切片。
学习目标
- 能解释第一部分8个叙述章如何从分层、领域逻辑、映射、Web、并发、会话和分布问题逐步收敛
- 能用 TypeScript 为一个订单应用切片记录选择问题、模式协作、技术约束和拒绝条件
- 能根据跨层责任、状态所有权、失败路径和性能预算选择下一章,而不是按目录机械阅读
为什么第一部分表述值得单独学习
第一部分表述不是8个章节标题的集合,而是一条叙述路径:先建立层与职责,再决定业务规则放在哪里,接着处理对象与关系数据库之间的映射,最后面对 Web 表示、离线并发、会话状态和分布边界。每一步都应该由问题和证据推动,前一步的责任边界会成为下一步的约束。
↡以问题、语境、力量、方案和结果组织一组架构经验,使读者先理解选择为何发生,再查阅具体模式。让叙事章成为选择问题的导航,而不是把模式名称当成结论。本页依据 2024 年中文版公开目录限定第一部分范围,并根据 Martin Fowler 的作者图书页和模式目录独立重写;目录只决定要讲什么,案例、实验、判断题和答案均为本课程原创。
↡围绕一个业务用例切出的可观察范围,包含入口、业务规则、数据边界、状态和失败恢复路径。让跨章讨论落到同一个可验证切片上。
先建立直觉:从选择问题反向进入模式族
↡多个模式在同一应用切片中承担互补责任的关系,例如控制器、领域逻辑、映射和会话状态共同完成一次请求。不是把模式叠加得越多越好,而是要解释每个边界减少了什么变化传播。
↡描述当前系统痛点、约束、责任和需要比较的候选方案的问题记录,是进入叙事章和模式族的起点。把“应该用什么模式”改写为“什么力量冲突需要解决”。
↡从运行问题反查模式族、候选模式、协作关系和替代方案的导航结构,支持独立复核者重建阅读路径。让读者可以从超时、冲突、映射或状态泄漏反向定位章节,而不是只能从目录向下浏览。
对第一部分表述,优先比较的替代路线是:先写 Selection Problem,选择一个 Application Slice,再沿 Narrative Chapter 组织 Mode Collaboration,并用 Reverse Index 检查相邻候选。若只是按章节复制代码,没有问题、证据和拒绝条件,就不能据此选择第一部分路径。
目录单元到教学证据
第一部分表述
第一部分表述要求把8个叙述章变成可复核证据:冻结版次、应用切片与目录坐标;从问题与语境比较候选模式;手算远程、映射或冲突成本;验证正常样本与恰好边界;只注入一个故障并定位首差;让独立复核者重放并接入发布门禁。本文把这些证据串在同一订单应用切片中,而不是把章节看成互不相关的教程。
专属代码案例:订单系统架构评审
把订单系统评审切成“分层 → 领域逻辑 → 数据映射 → Web 表示 → 并发会话 → 分布组合”六个观察点。设计草案必须写出谁拥有状态、谁作出业务决定、失败怎样传播,以及8个叙述章、选择问题、模式协作、技术约束和通盘考虑中哪个指标最先提示当前方案不再适用。
设计记录采用五个可换行字段:单元键为 poeaa24-part-01-narratives;模式族为 book;裁决是“从一个 Application Slice 出发,逐章保留选择证据和撤回路径”;观测项包括8个叙述章、选择问题、模式协作、技术约束、通盘考虑;拒绝条件是“把同一技术栈复制到每章,却无法解释责任和失败如何变化”。
先预测:订单查询已经有 Web 控制器和数据库查询,接下来出现慢查询、领域规则分散和跨服务超时,应该沿哪条路径继续?先写问题、边界和首个观测指标,再选择下一叙述章;验证时要能指出每次引入新边界增加了什么成本。
type ChapterStep = {
chapter: string;
problem: string;
owner: string;
evidence: string;
reject: string;
};
function reviewNarrativePath(steps: ChapterStep[]): string[] {
const findings: string[] = [];
for (const step of steps) {
if (!step.problem.trim()) findings.push(`${step.chapter}: 缺少选择问题`);
if (!step.owner.trim()) findings.push(`${step.chapter}: 缺少责任所有者`);
if (!step.evidence.trim()) findings.push(`${step.chapter}: 缺少可复核证据`);
if (!step.reject.trim()) findings.push(`${step.chapter}: 缺少拒绝条件`);
}
return findings;
}这段代码把叙事路径的最小合同固定下来:每个章节步骤都必须有问题、所有者、证据和拒绝条件。它不强迫项目采用8个边界,而是让团队解释为什么某一步需要继续、合并或停止。
全书模式依赖地图
第一部分叙述中的模式族会与基础模式、数据源、对象关系和会话状态互相依赖。全书地图帮助读者从一个问题反查候选族,并看到某个局部选择可能影响哪些下游边界。
第一部分叙述路径
先从分层与领域责任开始,再进入关系映射和 Web 表示,随后用并发、会话和分布处理跨请求与跨进程约束。每一步都可以回退到前一个 Selection Problem,避免把后续复杂度提前引入。
选择与拒绝矩阵
| 评审问题 | 选择第一部分叙述路径的证据 | 应拒绝当前方案的信号 |
|---|---|---|
| 起点 | Selection Problem 和 Application Slice 已明确 | 直接从框架目录挑模式 |
| 协作 | Mode Collaboration 解释每个边界的责任 | 每章独立复制同一套类名 |
| 路径 | Narrative Chapter 能说明下一步为何出现 | 读完一个章节却无法提出可验证问题 |
| 复核 | Reverse Index 能从故障或指标回到候选族 | 没有证据、替代方案和撤回路径 |
常见误区
可验证练习
练习
本组练习覆盖第一部分表述,并要求把八个叙述章映射到一个可复核的订单应用切片。
问题 1:选择下一章。 订单查询的业务规则散落在控制器和 SQL 中,应该先进入哪类问题?
问题 2:记录协作。 Web 控制器、领域服务和 Mapper 都参与一次订单读取,如何判断它们是否构成合理 Mode Collaboration?
问题 3:构建反向索引。 出现数据库往返激增时,如何让复核者从指标回到正确章节?
名词解释
名词解释
本章出现的专业名词,用大白话再讲一遍。
- Narrative Chapter
以问题、语境和结果组织架构经验,帮助读者理解选择为何发生的叙述章节。
- Application Slice
围绕一个业务用例切出的入口、规则、数据、状态和失败恢复范围。
- Mode Collaboration
多个模式在同一应用切片中承担互补责任并共同完成请求的关系。
- Selection Problem
描述痛点、约束、责任和候选方案的问题记录,是进入模式族的起点。
- Reverse Index
从运行问题反查模式族、候选模式、协作关系和替代方案的导航结构。
本章小结
掌握第一部分表述的标志不是记住8个章节标题,而是能在订单应用切片中解释“问题 → 分层 → 领域逻辑 → 数据映射 → Web 表示 → 并发会话 → 分布组合”的责任链。学习者应利用选择问题、模式协作、技术约束、通盘考虑和反向索引作出可证伪的路径选择,并在章节清单化、模式堆叠和无法回溯故障时明确拒绝当前方案。
前后导航
来源与改写范围
- Martin Fowler 作者图书页:核对全书主题、教程与模式参考结构。
- Martin Fowler 模式目录:核对模式名称、所属模式族和作者公开摘要。
- Pearson 出版社页面:交叉核对英文版出版信息与目录范围。