第Ⅰ部分 让领域模型发挥作用 5
第1章 消化知识 5
1.1 有效建模的因素 9
1.2 知识消化 10
1.3 持续学习 11
1.4 知识丰富的设计 12
1.5 深层模型 15
第2章 交流及语言的使用 17
2.1 通用语言 17
2.2 利用对话改进模型 22
2.3 一个团队,一种语言 24
2.4 文档和图 25
2.4.1 书面的设计文档 27
2.4.2 执行的基础 29
2.5 说明性模型 29
第3章 将模型和实现绑定 32
3.1 模型驱动设计 33
3.2 建模范型和工具支持 36
3.3 突出主旨:为什么模型对用户很关键 41
3.4 实践型建模人员 43
第Ⅱ部分 模型驱动设计的构建块 47
第4章 分离领域 47
4.1 分层架构 47
4.1.1 层间的联系 51
4.1.2 架构框架 51
4.2 模型属于领域层 52
4.3 其他种类的隔离 55
第5章 软件中的模型描述 56
5.1 关联 57
5.2 实体(又称引用对象) 62
5.2.1 实体建模 65
5.2.2 设计标识操作 66
5.3 值对象 68
5.3.1 设计值对象 71
5.3.2 设计包含值对象的关联 73
5.4 服务 74
5.4.1 服务和分隔的领域层 75
5.4.3 访问服务 77
5.5 模块(包) 77
5.4.2 粒度 77
5.5.1 敏捷的模块 79
5.5.2 基础结构驱动打包的缺陷 80
5.6 建模范式 82
5.6.1 对象范式的优势 82
5.6.2 对象世界中的非对象 84
5.6.3 在混合范式中使用模型驱动设计 85
第6章 领域对象的生命周期 87
6.1 聚合 88
6.2 工厂 96
6.2.1 工厂及其应用场所的选择 99
6.2.2 只需构造函数的情况 101
6.2.3 接口的设计 102
6.2.6 存储对象的重建 103
6.2.4 如何放置不变量的逻辑 103
6.2.5 实体工厂与值对象工厂 103
6.3 仓储 105
6.3.1 查询仓储 109
6.3.2 了解仓储实现的必要性 111
6.3.3 实现仓储 111
6.3.4 在框架内工作 113
6.3.5 与工厂的关系 113
6.4 为关系数据库设计对象 115
第7章 使用语言:扩展示例 117
7.1 货物运输系统概述 117
7.2 隔离领域:系统简介 119
7.3 区分实体和值对象 120
7.4 运输领域中的关联设计 121
7.5 聚合的边界 123
7.6 选择仓储 124
7.7 场景概述 125
7.7.1 应用特性示例:改变一件货物的目的地 126
7.7.2 应用特性示例:重复业务 126
7.8 对象的创建 126
7.8.1 Cargo的工厂和构造函数 126
7.8.2 添加一个Handling Event 127
7.9 停下来重构:Cargo聚合的另一种设计 129
7.10 运输模型中的模块 131
7.11 引入新特性:配额检查 133
7.11.1 连接两个系统 134
7.11.2 改进模型:划分业务 135
7.11.3 性能调整 137
7.12 小结 137
第Ⅲ部分 面向更深层理解的重构 143
第8章 突破 143
8.1 关于突破的故事 144
8.1.1 中看不中用的模型 144
8.1.2 突破 146
8.1.3 更深层的模型 148
8.1.4 冷静的决定 149
8.1.5 成效 150
8.2 时机 150
8.4 尾声:一连串的新理解 151
8.3 着眼于根本 151
第9章 隐含概念转变为显式概念 153
9.1 概念挖掘 153
9.1.1 倾听表达用语 154
9.1.2 检查不协调之处 157
9.1.3 研究矛盾之处 162
9.1.4 查阅书籍 162
9.1.5 尝试,再尝试 164
9.2 如何建模不太明显的概念 164
9.2.1 显式的约束 165
9.2.2 作为领域对象的流程 167
9.2.3 规格 168
9.2.4 规格的应用和实现 171
第10章 柔性设计 184
10.1 释意接口 186
10.2 无副作用函数 190
10.3 断言 194
10.4 概念轮廓 197
10.5 孤立类 201
10.6 操作封闭 203
10.7 声明性设计 205
10.8 一个声明性风格的设计 207
10.9 攻击角度 215
10.9.1 切分子领域 215
10.9.2 尽可能利用现成的形式 216
第11章 应用分析模式 225
第12章 把设计模式和模型联系起来 237
12.1 策略 238
12.2 组合 241
12.3 为什么不用Flyweight? 245
第13章 向更深层理解重构 247
13.1 发起重构 247
13.2 探索团队 248
13.3 前期工作 249
13.4 针对开发人员设计 249
13.5 时机选择 250
13.6 将危机视为机会 250
第Ⅳ部分 战略性设计 255
第14章 维护模型完整性 255
14.1 限界上下文 257
14.2 持续集成 261
14.3 上下文映射 263
14.3.1 在上下文边界上的测试 269
14.3.2 组织和文档化上下文映射 269
14.4 限界上下文之间的关系 270
14.5 共享内核 271
14.6 顾客/供应商开发团队 272
14.7 同流者 275
14.8 防腐层 277
14.8.1 设计防腐层的接口 279
14.8.2 实现防腐层 279
14.8.3 一个关于警戒的故事 282
14.9 隔离方式 282
14.11 公布语言 284
14.10 开放主机服务 284
14.12 盲人摸象 287
14.13 选择模型上下文的策略 290
14.13.1 团队或更高层的决策 290
14.13.2 把自己放在上下文中 291
14.13.3 转换边界 291
14.13.4 接受我们不能改变的东西:描绘外部系统 292
14.13.5 与外部系统的关系 292
14.13.6 在设计系统 293
14.13.7 满足不同模型的特别需要 293
14.13.8 部署 294
14.13.9 权衡 295
14.13.10 考虑项目已经进行的情况 295
14.14.1 合并上下文:隔离方式→共享内核 296
14.14 转换 296
14.14.2 合并上下文:共享内核→持续集成 297
14.14.3 逐步淘汰原有系统 298
14.14.4 开放主机服务→公布语言 299
第15章 精炼 301
15.1 核心领域 302
15.1.1 选择核心 305
15.1.2 谁来负责精炼工作 305
15.2 精炼的逐步升级 306
15.3 通用子域 307
15.3.1 通用不一定可重用 312
15.4 领域愿景声明 313
15.3.2 项目风险管理 313
15.5 突出核心 315
15.5.1 精炼文档 316
15.5.2 把核心标记出来 317
15.5.3 把精炼文档作为开发过程的工具 318
15.6 内聚机制 319
15.6.1 通用子域与内聚机制 320
15.6.2 属于核心领域的机制 321
15.7 精炼到声明性风格 321
15.8 隔离核心 322
15.8.1 创建隔离核心的代价 323
15.8.2 推进团队决策 323
15.9 抽象核心 328
15.11 选择重构的目标 329
15.10 深层模型精炼 329
第16章 大比例结构 330
16.1 渐进顺序 333
16.2 系统隐喻 335
16.3 职责层 337
16.4 知识级别 349
16.5 插件框架 356
16.6 结构的约束 360
16.7 重构到合适的结构 361
16.7.1 最小化 362
16.7.2 交流和自律 362
16.7.3 结构重组产生柔性设计 362
16.7.4 精炼为开发指路 363
17.1 大比例结构和限界上下文的结合 364
第17章 综合应用战略性设计 364
17.2 大比例结构和精炼的结合 367
17.3 首先进行评估 369
17.4 由谁制定策略 369
17.4.1 在开发过程中自发产生 369
17.4.2 以客户为中心的架构团队 370
17.5 制定战略性设计决策的6个要点 370
17.5.1 技术框架同样如此 373
17.5.2 提防总体规划 374
第18章 尾声 375
附录A 关于模式 380
附录B 术语表 383
附录C 参考文献 387
附录D 关系图 389