第一部分 软件架构概念与思想篇 1
第1章 解析软件架构概念 3
1.1 软件架构概念的分类 3
1.1.1 组成派 4
1.1.2 决策派 5
1.2 软件架构概念大观 5
1.2.1 Booch、Rumbaugh和Jacobson的定义 5
1.2.2 Woods的观点 6
1.2.3 Garlan和Shaw的定义 6
1.2.4 Perry和Wolf的定义 6
1.2.5 Boehm的定义 6
1.2.6 IEEE的定义 6
1.2.7 Bass的定义 6
1.3 软件架构关注分割与交互 7
1.4 软件架构是一系列有层次性的决策 8
1.5 PM Tool案例:领会软件架构概念 10
1.5.1 案例故事 10
1.5.2 软件架构概念的体现 12
1.5.3 重要结论 14
1.6 总结与强调 14
第2章 子系统、框架与架构 15
2.1 子系统和框架在架构设计中的地位 16
2.1.1 关注点分离之道 16
2.1.2 子系统和框架在架构设计中的地位 17
2.2 子系统与软件架构 19
2.2.1 不同粒度的软件单元 20
2.2.2 子系统也有架构 21
2.2.3 子系统不同,架构不同 21
2.2.4 不同实践者眼中的粒度 23
2.3 框架与软件架构 23
2.3.1 框架的概念 23
2.3.2 架构和框架的区别 24
2.3.3 架构和框架的联系 25
2.3.4 框架也有架构 26
2.4 超越概念:立足实践理解架构 26
2.4.1 理解架构 26
2.4.2 回到实践 28
2.5 专题:框架技术 29
2.5.1 框架vs.类库 29
2.5.2 框架的分类 30
2.5.3 框架的开发过程 32
2.5.4 如何实现框架中的扩展点 33
2.6 总结与强调 36
第3章 软件架构的作用 37
3.1 充分发挥软件架构的作用 37
3.2 软件架构对新产品开发的作用 38
3.3 软件架构对软件产品线开发的作用 40
3.4 软件架构对软件维护的作用 42
3.5 软件架构重构 42
3.6 总结与强调 43
第二部分 软件架构设计方法与过程篇 45
第4章 软件架构视图 47
4.1 呼唤软件架构视图 47
4.1.1 办公室里的争论 48
4.1.2 呼唤软件架构视图 48
4.2 软件架构为谁而设计 49
4.2.1 为用户而设计 49
4.2.2 为客户而设计 50
4.2.3 为开发人员而设计 50
4.2.4 为管理人员而设计 51
4.2.5 总结 51
4.3 引入软件架构视图 52
4.3.1 生活中的“视图”运用 53
4.3.2 什么是软件架构视图 54
4.3.3 多组涉众,多个视图 54
4.4 实践指南:逻辑架构与物理架构 55
4.4.1 逻辑架构 56
4.4.2 物理架构 57
4.4.3 从逻辑架构和物理架构到设计实现 58
4.5 设备调试系统案例:领会逻辑架构和物理架构 59
4.5.1 设备调试系统案例简介 59
4.5.2 逻辑架构设计 59
4.5.3 物理架构设计 61
4.6 总结与强调 62
第5章 架构设计的5视图法 63
5.1 架构设计的5视图法 64
5.2 实践中的5视图方法 66
5.3 办公室里的争论:回顾与落实 67
5.4 案例:再谈设备调试系统 67
5.4.1 根据需求决定引入哪些架构视图 68
5.4.2 开发架构设计 68
5.4.3 运行架构设计 69
5.5 总结与强调 71
第6章 从概念性架构到实际架构 73
6.1 概念性架构 73
6.2 实际架构 77
6.3 从概念性架构到实际架构 78
6.4 网络管理系统案例:从分层架构开始 78
6.4.1 构思:概念性架构设计 78
6.4.2 深入:实际架构设计 81
6.5 总结与强调 82
第7章 如何进行成功的架构设计 83
7.1 何谓成功的软件架构设计 83
7.2 探究成功架构设计的关键要素 84
7.2.1 是否遗漏了至关重要的非功能需求 84
7.2.2 能否驯服数量巨大且频繁变化的需求 86
7.2.3 能否从容设计软件架构的不同方面 86
7.2.4 是否及早验证架构方案并做出了调整 87
7.3 制定软件架构设计策略 87
7.3.1 策略一:全面认识需求 88
7.3.2 策略二:关键需求决定架构 89
7.3.3 策略三:多视图探寻架构 89
7.3.4 策略四:尽早验证架构 90
7.4 总结与强调 90
第8章 软件架构要设计到什么程度 93
8.1 软件架构要设计到什么程度 94
8.1.1 分而治之的两种方式 94
8.1.2 架构设计与详细设计 96
8.1.3 软件架构是团队开发的基础 96
8.1.4 架构设计要进行到什么程度 98
8.2 高来高去式架构设计的症状 98
8.2.1 缺失重要架构视图 99
8.2.2 浅尝辄止、不够深入 100
8.2.3 名不副实的分层架构 101
8.3 如何克服高来高去症 101
8.4 网络管理系统案例:如何将架构设计落到实处 102
8.4.1 网管产品线的概念性架构 102
8.4.2 识别每一层中的功能模块 102
8.4.3 明确各层之间的交互接口 103
8.4.4 明确各层之间的交互机制 104
8.4.5 案例小结 105
8.5 总结与强调 105
第9章 软件架构设计过程 107
9.1 打造有效的架构设计过程 107
9.1.1 一般的软件过程 107
9.1.2 架构师自己的架构设计过程 109
9.2 软件架构设计过程解析 111
9.2.1 架构设计策略应成为一等公民 111
9.2.2 架构设计过程中的工作产品 112
9.3 总结与强调 114
第10章 需求分析 115
10.1 软件需求基础 116
10.1.1 什么是软件需求 116
10.1.2 需求捕获vs.需求分析vs.系统分析 116
10.1.3 需求捕获及其工作成果 118
10.1.4 需求分析及其工作成果 118
10.1.5 系统分析及其工作成果 119
10.2 需求分析在软件过程中所处的位置 120
10.2.1 概念化阶段所做的工作 120
10.2.2 需求分析所处的位置 122
10.3 架构师必须掌握的需求知识 123
10.3.1 软件需求的类型 123
10.3.2 各类需求对架构设计的不同影响 127
10.3.3 超市系统案例:领会需求类型的不同影响 129
10.3.4 各类需求的“易变更性”不同 130
10.3.5 质量属性需求与需求折衷 132
10.4 PM Tool实战:需求分析 135
10.4.1 上游活动:确定项目愿景 135
10.4.2 第1步:从业务目标到特性列表 135
10.4.3 第2步:从特性列表到用例图 136
10.4.4 第3步:从用例图到用例规约 138
10.4.5 需求启发与需求验证 139
10.4.6 最终成果:《软件需求规格说明书》 140
10.5 总结与强调 141
第11章 专题:用例技术及应用 143
11.1 用例图vs.用例简述vs.用例规约vs.用例实现 143
11.2 储蓄系统案例:需求变化对用例的影响 148
11.3 用例技术应用指南 150
11.4 用例与需求捕获 152
11.5 用例与需求分析 153
11.6 用例与《软件需求规格说明书》 154
11.7 总结与强调 155
第12章 领域建模 157
12.1 领域模型基础知识 157
12.1.1 什么是领域模型 158
12.1.2 领域模型相关的UML图 158
12.2 领域建模在软件过程中所处的位置 159
12.2.1 领域建模的必要性:从需求分析的两个典型困难说起 159
12.2.2 领域建模与需求分析的关系 161
12.2.3 领域建模所处的位置 162
12.3 领域模型对软件架构的重要作用 163
12.3.1 配置管理工具案例:探索复杂问题、固化领域知识 163
12.3.2 人事管理系统案例:决定功能范围、影响可扩展性 165
12.3.3 在线拍卖系统案例:提供交流基础、促进有效沟通 168
12.4 领域模型 vs. 文字说明 170
12.5 PM Tool实战:建立项目管理的领域模型 171
12.5.1 领域建模实录(1) 171
12.5.2 领域建模实录(2) 174
12.6 总结与强调 176
第13章 确定对软件架构关键的需求 177
13.1 虚拟高峰论坛:穷兵黩武还是择战而斗 177
13.1.1 需求是任何促成设计决策的因素 178
13.1.2 很少有开发者能奢侈地拥有一个稳定的需求集 178
13.1.3 关键性的第一步是缩小范围 178
13.1.4 要择战而斗 178
13.1.5 功能、质量和商业需求的某个集合塑造了构架 179
13.2 关键需求决定架构 179
13.2.1 实践中的常见问题 179
13.2.2 关键需求决定架构 181
13.3 确定关键需求在软件过程中所处的位置 182
13.3.1 对架构关键的需求vs.需求优先级 182
13.3.2 关键需求对后续活动的影响 183
13.4 什么是对软件架构关键的需求 184
13.4.1 关键的功能需求 184
13.4.2 关键的质量属性需求 185
13.4.3 关键的商业需求 186
13.5 如何确定对软件架构关键的需求 187
13.5.1 全面整理需求 188
13.5.2 分析约束性需求 188
13.5.3 确定关键功能需求 189
13.5.4 确定关键质量属性需求 190
13.6 PM Tool实战:确定关键需求 190
13.7 总结与强调 191
第14章 概念性架构设计 193
14.1 概念性架构设计的步骤 194
14.2 鲁棒性分析 195
14.2.1 分析和设计之间的鸿沟 195
14.2.2 鲁棒图简介 196
14.2.3 从用例到鲁棒图 197
14.3 运用架构模式 198
14.3.1 架构模式简介 198
14.3.2 架构模式的经典分类 199
14.3.3 架构模式的现代分类 200
14.3.4 分层 201
14.3.5 MVC 201
14.3.6 微内核 202
14.3.7 基于元模型的架构 203
14.3.8 管道—过滤器 204
14.4 PM Tool实战:概念性架构设计 204
14.4.1 进行鲁棒性分析 204
14.4.2 引入架构模式 206
14.4.3 质量属性分析 207
14.4.4 设计结果 207
14.5 总结与强调 208
第15章 质量属性分析 209
15.1 质量属性需求基础 210
15.2 质量属性分析的位置 211
15.3 利用“属性—场景—决策”表设计架构决策 211
15.3.1 概述 211
15.3.2 “属性—场景—决策”表方法 212
15.3.3 题外话:《需求文档》如何定义质量属性需求 214
15.4 PM Tool实战:可扩展性设计 214
15.5 总结与强调 215
第16章 细化架构设计 217
16.1 架构细化在软件过程中所处的位置 218
16.1.1 我们走到哪了 218
16.1.2 运用基于5视图方法进行架构细化 219
16.2 设计逻辑架构 220
16.2.1 概述 220
16.2.2 识别通用机制 220
16.3 设计开发架构 223
16.3.1 概述 223
16.3.2 分层和分区 223
16.4 设计数据架构 226
16.4.1 概述 226
16.4.2 如何将OO模型映射为数据模型 227
16.5 设计运行架构 229
16.5.1 概述 229
16.5.2 运用主动类规划并发 230
16.5.3 应用协议的设计 234
16.6 设计物理架构 234
16.6.1 概述 234
16.7 注意满足所有约束性软件需求 235
16.8 PM Tool实战:细化架构设计 236
16.9 总结与强调 239
第17章 实现并验证软件架构 241
17.1 基础知识 242
17.1.1 原型技术及分类 242
17.1.2 验证架构的两种方法 245
17.2 实现并验证软件架构的具体做法 245
17.3 总结与强调 247
第三部分 程序员成长篇 249
第18章 MIME编码类案例: 从面向过程到面向对象 251
18.1 设计目标 251
18.2 MIME编码基础知识 252
18.3 MIME编码类的设计过程 252
18.3.1 面向过程的设计方案 252
18.3.2 转向面向对象设计 254
18.3.3 面向对象设计方案的确定 257
18.3.4 Template Method和Strategy模式的对比 260
第19章 突破OOP思维:继承在OOD中的应用 261
19.1 从一则禅师语录说起 261
19.1.1 见继承是继承——程序员境界 262
19.1.2 见继承不是继承——成长境界 262
19.1.3 见继承只是继承——设计师境界 262
19.2 从OOD层面认识继承 262
19.3 针对接口编程——隔离变化 263
19.3.1 相关理论 263
19.3.2 针对接口编程举例——用于架构设计 263
19.3.3 针对接口编程举例——用于类设计 265
19.4 混入类——更好的重用性 266
19.4.1 相关理论 266
19.4.2 混入类举例 266
19.5 基于角色的设计——使用角色组装协作 267
19.5.1 相关理论 267
19.5.2 基于角色的设计举例 268
第20章 细微见真章:耦合其实并不空洞 269
20.1 顺序耦合性简介 269
20.2 案例研究:顺序耦合性Bug一例 269
20.2.1 项目简介 270
20.2.2 新的需求 270
20.2.3 发现顺序耦合性Bug 271
20.2.4 跟踪调试 271
20.2.5 分析原因 273
20.2.6 解决策略 273
20.2.7 运用重构的“Extract Method”成例 273
20.2.8 运用重构的“Hide Method”成例 274
20.2.9 运用重构的“Introduce Parameter Object”成例 274
20.2.10 其他改进 274
第21章 敏捷设计:从理论到实践 277
21.1 换个角度考察依赖 278
21.1.1 依赖的概念 278
21.1.2 从会不会造成“实际危害”的角度考察依赖 278
21.2 良性依赖原则 278
21.2.1 依赖是不可避免的 278
21.2.2 重要的是如何务实地应付变化 279
21.3 案例:需求改变引起良性依赖变成恶性依赖 279
21.4 案例:隔离第三方SDK可能造成的冲击 281
21.5 案例:对具体类的良性依赖 283
21.6 总结:如何处理好依赖关系 285
第22章 基于角色的设计:从理论到实践 287
22.1 基于角色的设计理论 288
22.2 基于角色的设计与团队开发 288
22.3 基于角色的设计实践 289
22.4 基于角色的设计案例 291
22.4.1 项目简介 291
22.4.2 通过基于角色的设计组织子系统之间的协作 291
22.4.3 通过基于角色的设计组织同一子系统内不同模块之间的协作 292
22.5 基于角色的设计与面向对象分析 293
第23章 超越设计模式:理解和运用更多模式 295
23.1 关于模式的两个问题 295
23.2 模式的正交分类法 296
23.2.1 正交思维 296
23.2.2 正交思维用于模式分类 297
23.3 专攻性能:性能模式简介 299
23.4 模型驱动开发的方方面面:MDD模式简介 301
23.5 总结:拥抱模式 302
第24章 如此轻松:立足图论学UML 303
24.1 管窥UML中的OO思想 304
24.1.1 一道笔试题的故事 304
24.1.2 UML背后的思想 305
24.2 图的定义与UML应用 306
24.2.1 图的定义 306
24.2.2 图的定义的UML应用——UML的图论观点 307
24.2.3 图的定义的UML应用——关联类语法的理解 308
24.2.4 图的定义的UML应用——说说序列图 309
24.3 有向边与UML应用 310
24.3.1 有向边 310
24.3.2 有向边的UML应用——依赖关系 310
24.3.3 有向边的UML应用——泛化、实现和关联的依赖思想 312
24.3.4 有向边的UML应用——一个例子 312
24.4 着色顶点与UML应用 313
24.4.1 着色顶点 313
24.4.2 着色顶点的UML应用——通过颜色为图元分类 314
24.4.3 着色顶点的UML应用——UML彩色建模方法介绍 315
24.5 着色边与UML应用 317
24.6 图的同构与UML应用 317
24.6.1 图的同构 317
24.6.2 图的同构的UML应用——UML风格 318
第25章 理解软件过程:解析RUP核心概念 321
25.1 架构师必须了解软件过程 321
25.1.1 架构师的工作职责 321
25.1.2 架构师必须了解软件过程 322
25.2 RUP实践中的常见问题 322
25.3 RUP核心概念解析 323
25.3.1 一图胜千言 323
25.3.2 角色执行活动,活动生产工件 323
25.3.3 阶段和迭代:提供不同级别的决策时机 324
25.3.4 配置和变更管理支持迭代式的基于基线的开发 326
25.3.5 发布是什么,发布不是什么 327
第26章 海阔凭鱼跃:通盘理解软件工程 329
26.1 什么是软件工程概念模型 329
26.2 一个精简的软件工程概念模型 329
26.3 一个细化的软件工程概念模型 330
26.3.1 模型概述 331
26.3.2 方法论 331
26.3.3 过程 331
26.3.4 目标 332
26.3.5 项目 332
26.3.6 其他 333
26.4 软件工程概念模型的具体应用 333
26.4.1 搞清楚Agile是过程还是方法论 333
26.4.2 为CMM定位 334
26.4.3 理解RUP定制 335
26.5 总结:软件工程概念模型的启示 335
26.5.1 软件工程,一门实践的科学 335
26.5.2 软件过程,合适的才是最好的 336
26.5.3 对个人的启示 336
26.5.4 呼唤高层次人才 336
参考文献 337