第一部分 表述

用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个边界,而是让团队解释为什么某一步需要继续、合并或停止。

全书模式依赖地图

第一部分叙述中的模式族会与基础模式、数据源、对象关系和会话状态互相依赖。全书地图帮助读者从一个问题反查候选族,并看到某个局部选择可能影响哪些下游边界。

全书模式依赖网络基础模式 (5)领域逻辑 (4)数据源 (4)对象关系行为 (3)对象关系结构 (6)元数据 (3)Web 表示 (7)分布 (2)离线并发 (4)会话状态 (3)虚线 = 依赖方向(上层依赖下层) 颜色 = 逻辑分组10 个模式族、51 个模式的依赖网络:基础模式支撑全局
全书 51 个模式分为 10 个族,基础模式(Gateway / Mapper / Registry 等)支撑所有其他族。 学习路径:基础 → 领域逻辑 + 数据源 → 对象关系 → Web / 分布 / 并发 / 会话。

第一部分叙述路径

先从分层与领域责任开始,再进入关系映射和 Web 表示,随后用并发、会话和分布处理跨请求与跨进程约束。每一步都可以回退到前一个 Selection Problem,避免把后续复杂度提前引入。

第一部分:从应用切片到跨边界组合责任边界分层 + 领域逻辑谁拥有规则与状态先冻结应用切片表示边界关系映射 + Web数据与请求如何转换保存转换证据跨边界约束并发 + 会话 + 分布失败、延迟与恢复保留撤回路径每一步:选择问题 → 模式协作 → 证据 → 拒绝条件叙述路径逐步增加约束,而不是一次性堆叠模式
第一部分把应用切片从责任边界推进到跨进程约束,每一步都保留可验证的选择依据。

选择与拒绝矩阵

评审问题选择第一部分叙述路径的证据应拒绝当前方案的信号
起点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《企业应用架构模式》与公开模式目录权威目录界定学习范围,并结合正文列出的技术资料独立重写;不宣称复现原书正文,也不沿用原作表述。

原作版权归作者与出版社所有;本站原创教学结构与表述仅供学习交流。

讨论

评论区加载中…