Software Modeling & Design: UML, Use Cases, Patterns, & Software Architectures
出版者的话
译者序
前言
本书导读
致谢
第一部分 概览
第1章 引言 2
1.1 软件建模 2
1.2 面向对象方法与统一建模语言 2
1.3 软件体系结构设计 3
1.4 方法和表示法 3
1.5 COMET:一种基于UML的软件应用建模和设计方法 4
1.6 UML标准 4
1.7 软件体系结构的多视图 5
1.8 软件建模和设计方法的发展 5
1.9 面向对象分析和设计方法的发展 7
1.10 并发、分布式和实时设计方法 8
1.11 总结 8
练习 8
第2章 UML表示法概述 10
2.1 UML图 10
2.2 用例图 10
2.3 类和对象 11
2.4 类图 12
2.4.1 关联 12
2.4.2 聚合和组合层次 12
2.4.3 泛化和特化层次 13
2.4.4 可见性 13
2.5 交互图 13
2.5.1 通信图 13
2.5.2 顺序图 13
2.6 状态机图 14
2.7 包 15
2.8 并发通信图 16
2.9 部署图 17
2.10 UML扩展机制 17
2.10.1 构造型 18
2.10.2 标记值 18
2.10.3 约束 18
2.11 本书的约定 19
2.11.1 需求建模 19
2.11.2 分析建模 19
2.11.3 设计建模 20
2.12 总结 20
练习 20
第3章 软件生存周期模型和过程 22
3.1 软件生存周期模型 22
3.1.1 瀑布生存周期模型 22
3.1.2 瀑布模型的局限性 22
3.1.3 抛弃型原型 24
3.1.4 通过增量开发的演化式原型 24
3.1.5 抛弃型原型和增量开发的结合 24
3.1.6 螺旋模型 27
3.1.7 统一软件开发过程 27
3.2 设计验证和确认 28
3.2.1 软件质量保证 29
3.2.2 软件设计的性能分析 29
3.3 软件生存周期的活动 29
3.3.1 需求分析和规约 29
3.3.2 体系结构设计 29
3.3.3 详细设计 30
3.3.4 编码 30
3.4 软件测试 30
3.4.1 单元测试 30
3.4.2 集成测试 30
3.4.3 系统测试 30
3.4.4 验收测试 30
3.5 总结 31
练习 31
第4章 软件设计和体系结构概念 32
4.1 面向对象概念 32
4.2 信息隐藏 33
4.2.1 面向对象设计中的信息隐藏 34
4.2.2 信息隐藏示例 34
4.2.3 设计信息隐藏对象 36
4.3 继承和泛化/特化 36
4.4 并发处理 37
4.4.1 顺序应用与并发应用 38
4.4.2 并发对象 38
4.4.3 并发对象间的协作 38
4.4.4 同步问题 38
4.4.5 生产者/消费者问题 40
4.4.6 异步消息通信 40
4.4.7 带回复的同步消息通信 40
4.5 设计模式 41
4.6 软件体系结构和构件 41
4.6.1 构件和构件接口 42
4.6.2 连接器 42
4.7 软件质量属性 42
4.8 总结 42
练习 43
第5章 软件建模和设计方法概览 44
5.1 COMET基于用例的软件生存周期 44
5.1.1 需求建模 44
5.1.2 分析建模 44
5.1.3 设计建模 44
5.1.4 增量软件构建 46
5.1.5 增量软件集成 46
5.1.6 系统测试 46
5.2 COMET生存周期与其他软件过程的比较 46
5.2.1 COMET生存周期与统一软件开发过程对比 46
5.2.2 COMET生存周期与螺旋模型对比 47
5.3 需求、分析和设计建模 47
5.3.1 需求建模中的活动 47
5.3.2 分析建模中的活动 47
5.3.3 设计建模中的活动 48
5.4 设计软件体系结构 48
5.5 总结 49
练习 49
第二部分 软件建模
第6章 用例建模 52
6.1 需求建模 52
6.1.1 需求分析 52
6.1.2 需求规约 53
6.1.3 软件需求规约的质量属性 53
6.2 用例 54
6.3 参与者 55
6.3.1 参与者、角色和用户 55
6.3.2 主要和次要参与者 55
6.3.3 对参与者建模 55
6.3.4 谁是参与者 57
6.4 标识用例 57
6.5 用例模型中文档化用例 57
6.6 用例描述示例 58
6.7 用例关系 59
6.8 包含关系 59
6.8.1 包含关系和包含用例示例 60
6.8.2 结构化冗长的用例 61
6.9 扩展关系 61
6.9.1 扩展点 62
6.9.2 扩展点和扩展用例示例 62
6.10 用例组织指南 64
6.11 规定非功能性需求 64
6.12 用例包 65
6.13 活动图 65
6.14 总结 66
练习 67
第7章 静态建模 68
7.1 类之间的关联 68
7.1.1 类图描述关联 68
7.1.2 关联的多重性 69
7.1.3 三元关联 71
7.1.4 一元关联 71
7.1.5 关联类 71
7.2 组合和聚合层次 72
7.3 泛化/特化层次 73
7.4 约束 73
7.5 静态建模和UML 74
7.6 系统上下文的静态建模 75
7.7 使用UML构造型对类分类 76
7.8 外部类建模 77
7.8.1 从外部类开发软件系统上下文类图示例 78
7.8.2 参与者和外部类 78
7.8.3 从参与者开发软件系统上下文类图示例 79
7.9 实体类的静态建模 80
7.10 总结 81
练习 82
第8章 对象和类组织 83
8.1 对象和类的组织准则 83
8.2 对应用类和对象建模 83
8.3 对象和类的组织分类 84
8.4 外部类与软件边界类 85
8.5 边界类和对象 85
8.5.1 用户交互对象 85
8.5.2 代理对象 86
8.5.3 设备I/O边界对象 87
8.5.4 描述外部类和边界类 88
8.6 实体类和对象 89
8.7 控制类和对象 90
8.7.1 协调者对象 90
8.7.2 状态相关的控制对象 91
8.7.3 计时器对象 91
8.8 应用逻辑类和对象 92
8.8.1 业务逻辑对象 92
8.8.2 算法对象 92
8.8.3 服务对象 94
8.9 总结 94
练习 94
第9章 动态交互建模 96
9.1 对象交互建模 96
9.1.1 通信图 96
9.1.2 顺序图 97
9.1.3 对象交互建模的分析和设计决策 97
9.1.4 顺序图和通信图对比 98
9.1.5 用例和场景 98
9.1.6 通用和实例形式的交互图 99
9.2 交互图上的消息序列编号 99
9.2.1 交互图上的消息标签 99
9.2.2 交互图上的消息序列编号 100
9.2.3 并发和可替换的消息序列 100
9.2.4 消息序列描述 101
9.3 动态交互建模 101
9.4 无状态动态交互建模 101
9.5 无状态动态交互建模示例 102
9.5.1 查看警报示例 102
9.5.2 下单请求示例 103
9.6 总结 110
练习 110
第10章 有限状态机 112
10.1 有限状态机和状态转换 112
10.1.1 事件 112
10.1.2 状态 113
10.2 状态图示例 113
10.2.1 ATM状态图示例 113
10.2.2 微波炉状态图示例 115
10.3 事件和警戒条件 116
10.4 动作 117
10.4.1 状态转换中的动作 117
10.4.2 进入动作 119
10.4.3 退出动作 119
10.5 层次化状态图 120
10.5.1 层次化状态分解 121
10.5.2 复合状态 121
10.5.3 状态转换的聚合 121
10.5.4 正交状态图 122
10.6 开发状态图的指导原则 123
10.7 从用例开发状态图 124
10.8 从用例开发状态图示例 125
10.8.1 为每个用例开发状态图 125
10.8.2 考虑可替换序列 126
10.8.3 开发集成的状态图 126
10.8.4 开发层次化状态图 128
10.9 总结 129
练习 130
第11章 状态相关的动态交互建模 132
11.1 状态相关的动态交互建模中的步骤 132
11.2 使用交互图和状态图对交互场景建模 132
11.3 状态相关的动态交互建模示例:银行系统 133
11.3.1 确定主序列 133
11.3.2 确定可替换序列 135
11.3.3 主序列:有效PIN码 136
11.3.4 可替换序列:无效PIN码 136
11.3.5 可替换序列:第三次无效PIN码 137
11.3.6 可替换序列:被盗的或过期的卡片 137
11.3.7 所有场景通用的交互图 138
11.3.8 控制对象和状态图的编序 138
11.4 总结 140
练习 141
第三部分 软件体系结构设计
第12章 软件体系结构概览 144
12.1 软件体系结构以及基于构件的软件体系结构 144
12.1.1 基于构件的软件体系结构 144
12.1.2 体系结构构造型 145
12.2 软件体系结构的多视图 145
12.2.1 软件体系结构的结构视图 145
12.2.2 软件体系结构的动态视图 145
12.2.3 软件体系结构的部署视图 147
12.3 软件体系结构模式 147
12.3.1 抽象分层体系结构模式 148
12.3.2 调用/返回模式 150
12.3.3 异步消息通信模式 150
12.3.4 带回复的同步消息通信模式 153
12.4 描述软件体系结构模式 153
12.5 接口设计 154
12.6 设计软件体系结构 155
12.7 总结 157
练习 157
第13章 软件子系统体系结构设计 159
13.1 软件体系结构设计中的问题 159
13.2 集成通信图 160
13.3 子系统设计中的关注点分离 162
13.3.1 复合对象 162
13.3.2 地理位置 164
13.3.3 客户端和服务 164
13.3.4 用户交互 164
13.3.5 外部对象的接口 164
13.3.6 控制范围 165
13.4 子系统组织准则 166
13.4.1 客户端子系统 166
13.4.2 用户交互子系统 166
13.4.3 服务子系统 168
13.4.4 控制子系统 168
13.4.5 协调者子系统 169
13.4.6 输入/输出子系统 170
13.5 子系统间消息通信的决策 170
13.6 总结 172
练习 172
第14章 设计面向对象的软件体系结构 174
14.1 面向对象的软件体系结构的概念、体系结构和模式 174
14.2 设计信息隐藏类 174
14.3 设计类接口和操作 175
14.3.1 基于交互模型设计类操作 175
14.3.2 基于交互模型设计类操作示例 176
14.3.3 基于静态模型设计类操作 177
14.4 数据抽象类 177
14.5 状态机类 178
14.6 图形用户交互类 179
14.7 业务逻辑类 180
14.8 设计中的继承 180
14.8.1 类继承 180
14.8.2 抽象类 182
14.8.3 抽象类和子类示例 182
14.8.4 抽象超类和子类设计 184
14.9 类接口规约 185
14.10 信息隐藏类的详细设计 186
14.10.1 账户抽象超类的详细设计 187
14.10.2 支票账户子类的详细设计 187
14.10.3 储蓄账户子类的详细设计 188
14.11 多态和动态绑定 188
14.12 Java中类的实现 189
14.13 总结 190
练习 190
第15章 设计客户端/服务器软件体系结构 192
15.1 客户端/服务器体系结构的概念、体系结构和模式 192
15.2 客户端/服务软件体系结构的结构模式 192
15.2.1 多客户端/单服务体系结构模式 192
15.2.2 多客户端/多服务体系结构模式 194
15.2.3 多层客户端/服务体系结构模式 195
15.3 客户端/服务器体系结构的通信模式 195
15.3.1 带回复的同步消息通信模式 196
15.3.2 带回调的异步消息通信模式 196
15.4 客户端/服务器系统的中间件 197
15.4.1 客户端/服务器系统平台 197
15.4.2 Java远程方法调用 198
15.5 服务子系统的设计 199
15.5.1 顺序性服务的设计 199
15.5.2 顺序性服务设计示例 199
15.5.3 并发服务设计 200
15.6 包装器类的设计 202
15.6.1 数据库包装器类的设计 202
15.6.2 数据库包装器类示例 202
15.7 从静态模型到关系数据库的设计 203
15.7.1 关系数据库概念 203
15.7.2 确定主键 204
15.7.3 将关联映射到外键 204
15.7.4 将关联类映射到关联表 205
15.7.5 将整体/部分关系映射到关系数据库 206
15.7.6 将泛化/特化关系映射到关系数据库 207
15.8 总结 208
练习 208
第16章 设计面向服务的体系结构 210
16.1 面向服务的体系结构的概念、体系结构和模式 210
16.2 软件体系结构代理者模式 211
16.2.1 服务注册模式 211
16.2.2 代理者转发模式 212
16.2.3 代理者句柄模式 212
16.2.4 服务发现模式 213
16.3 面向服务的体系结构的技术支持 214
16.3.1 Web服务协议 214
16.3.2 Web服务 214
16.3.3 注册服务 214
16.3.4 代理和发现服务 215
16.4 软件体系结构事务模式 215
16.4.1 两阶段提交协议模式 216
16.4.2 复合事务模式 218
16.4.3 长事务模式 218
16.5 协商模式 219
16.6 面向服务体系结构中的服务接口设计 221
16.7 面向服务体系结构中的服务协调 222
16.8 设计面向服务的体系结构 223
16.9 服务复用 225
16.10 总结 225
练习 225
第17章 设计基于构件的软件体系结构 227
17.1 基于构件的软件体系结构的概念、体系结构和模式 227
17.2 设计基于构件的分布式软件体系结构 228
17.3 复合子系统和构件 228
17.4 使用UML建模构件 229
17.4.1 构件接口设计 229
17.4.2 供给和请求接口 230
17.4.3 连接器和交互构件 230
17.4.4 设计复合构件 231
17.5 构件组织准则 232
17.5.1 与物理数据源的邻近性 232
17.5.2 局部自治性 232
17.5.3 性能 233
17.5.4 特定硬件 233
17.5.5 I/O构件 234
17.6 组消息通信模式 234
17.6.1 广播消息通信模式 234
17.6.2 订阅/通知消息通信模式 234
17.6.3 使用订阅和通知的并发服务设计 236
17.7 应用部署 237
17.7.1 应用部署事务 237
17.7.2 应用部署示例 239
17.8 总结 239
练习 239
第18章 设计并发和实时软件体系结构 241
18.1 并发和实时软件体系结构的概念、体系结构及模式 241
18.2 实时系统的特点 241
18.3 实时软件体系结构中的控制模式 242
18.3.1 集中式控制体系结构模式 242
18.3.2 分布式控制体系结构模式 242
18.3.3 层次化控制体系结构模式 243
18.4 并发任务组织 244
18.5 I/O任务组织准则 244
18.5.1 事件驱动I/O任务 244
18.5.2 周期性I/O任务 245
18.5.3 按需驱动I/O任务 247
18.6 内部任务组织准则 248
18.6.1 周期性任务 248
18.6.2 按需驱动任务 248
18.6.3 控制任务 249
18.6.4 用户交互任务 250
18.7 开发并发任务体系结构 252
18.8 任务通信和同步 254
18.8.1 异步(松耦合)消息通信 254
18.8.2 带回复的同步(紧耦合)消息通信 254
18.8.3 不带回复的同步(紧耦合)消息通信 255
18.8.4 事件同步 255
18.8.5 信息隐藏对象上的任务交互 256
18.8.6 修正的并发通信图 257
18.9 任务接口和任务行为规约 257
18.9.1 针对银行服务任务的TIS示例 259
18.9.2 针对读卡器接口任务的TIS示例 259
18.10 Java中并发任务的实现 260
18.11 总结 260
练习 261
第19章 设计软件产品线体系结构 262
19.1 演化软件产品线工程 262
19.2 软件产品线的需求建模 263
19.2.1 软件产品线的用例建模 263
19.2.2 特征建模 264
19.3 软件产品线的分析建模 266
19.3.1 软件产品线的静态建模 266
19.3.2 软件产品线的动态交互建模 266
19.4 软件产品线的动态状态机建模 268
19.5 软件产品线的设计建模 269
19.5.1 建模基于构件的软件体系结构 269
19.5.2 软件体系结构模式 270
19.6 总结 270
练习 271
第20章 软件质量属性 272
20.1 可维护性 272
20.2 可修改性 273
20.3 可测试性 274
20.4 可追踪性 274
20.5 可扩展性 276
20.6 可复用性 276
20.7 性能 277
20.8 安全性 278
20.9 可用性 278
20.10 总结 279
练习 279
第四部分 案例研究
第21章 客户端/服务器软件体系结构案例研究:银行系统 282
21.1 问题描述 282
21.2 用例模型 282
21.2.1 “验证PIN码”用例 284
21.2.2 具体的“取款”用例 284
21.2.3 具体的“查询账户”用例 285
21.2.4 具体的“转账”用例 286
21.3 静态建模 286
21.3.1 问题域的静态建模 286
21.3.2 系统上下文的静态建模 286
21.3.3 实体类的静态建模 289
21.4 对象组织 290
21.4.1 客户端/服务器子系统组织 290
21.4.2 ATM客户端对象和类的组织:边界对象 291
21.4.3 ATM客户端对象和类的组织:用例中的对象 292
21.4.4 服务子系统中的对象组织 293
21.5 动态建模 293
21.5.1 客户端验证PIN码交互图的消息序列描述 294
21.5.2 服务器端验证PIN码交互图的消息序列描述 297
21.5.3 客户端取款交互图的消息序列描述 298
21.5.4 服务器端取款交互图的消息序列描述 299
21.6 ATM状态图 303
21.6.1 处理客户输入复合状态 304
21.6.2 处理交易复合状态 306
21.6.3 结束交易复合状态 307
21.7 银行系统的设计 308
21.8 集成通信模型 308
21.9 将系统划分为子系统 310
21.10 ATM客户端子系统的设计 310
21.10.1 设计ATM子系统并发任务体系结构 311
21.10.2 定义ATM子系统任务接口 312
21.10.3 设计ATM客户端信息隐藏类 314
21.11 银行服务子系统的设计 316
21.11.1 设计银行服务子系统并发任务体系结构 316
21.11.2 设计银行服务信息隐藏类 317
21.11.3 设计银行服务接口 318
21.12 关系数据库设计 318
21.13 银行系统的部署 320
21.14 其他设计考虑 322
21.15 详细设计 322
21.15.1 读卡器接口任务的事件顺序逻辑示例 322
21.15.2 ATM控制任务的事件顺序逻辑示例 323
21.15.3 银行服务任务的事件顺序逻辑示例 324
第22章 面向服务的体系结构案例研究:在线购物系统 326
22.1 问题描述 326
22.2 用例建模 326
22.2.1 “浏览目录”用例描述 327
22.2.2 “下单请求”用例描述 328
22.2.3 “处理配送订单”用例描述 328
22.2.4 “确认配送和给客户开账单”用例描述 329
22.2.5“查看订单”用例的活动图 331
22.3 静态建模 331
22.3.1 软件系统上下文建模 331
22.3.2 问题域的静态实体类建模 331
22.4 对象和类组织 332
22.5 动态建模 333
22.5.1 “浏览目录”用例的动态建模 333
22.5.2 “下单请求”用例的动态建模 334
22.5.3 “处理配送订单”用例的动态建模 335
22.5.4 “确认配送和给客户开账单”用例的动态建模 336
22.5.5 “查看订单”用例的动态建模 337
22.6 面向服务体系结构的代理者和包装器技术支持 338
22.7 设计建模 338
22.7.1 面向服务的体系结构概述 338
22.7.2 分层软件体系结构 338
22.7.3 体系结构通信模式 339
22.7.4 并发软件设计 339
22.7.5 服务接口设计 341
22.7.6 面向服务的软件体系结构设计 344
22.7.7 构件端口和接口设计 346
22.8 服务复用 347
第23章 基于构件的软件体系结构案例研究:应急监控系统 348
23.1 问题描述 348
23.2 用例建模 348
23.2.1 “查看监控数据”用例描述 349
23.2.2 “查看警报”用例描述 349
23.2.3 “生成监控数据”用例描述 350
23.2.4 “生成警报”用例描述 350
23.3 静态建模 351
23.4 动态建模 351
23.4.1 类和对象组织 351
23.4.2 用例的通信图 352
23.4.3 “查看警报”用例的通信图 352
23.4.4 “查看监控数据”用例的通信图 353
23.4.5 “生成警报”用例的通信图 354
23.4.6 “生成监控状态”用例的通信图 354
23.5 设计建模 355
23.5.1 集成的通信图 355
23.5.2 基于构件的分层体系结构 355
23.5.3 体系结构通信模式 357
23.5.4 基于分布式构件的软件体系结构 359
23.5.5 构件和服务接口设计 359
23.6 软件构件部署 362
第24章 实时软件体系结构案例研究:自动引导车辆系统 363
24.1 问题描述 363
24.2 用例建模 363
24.2.1 “移动到站点”用例 364
24.2.2 “发送车辆状态”用例 364
24.3 静态建模 365
24.3.1 概念静态模型 365
24.3.2 软件系统上下文建模 365
24.4 对象和类组织 366
24.5 动态状态机建模 366
24.6 动态交互建模 367
24.6.1 “移动到站点”用例的动态建模 367
24.6.2 “发送车辆状态”用例的动态建模 370
24.7 设计建模 370
24.7.1 集成通信图 370
24.7.2 基于构件的工厂自动化系统软件体系结构 370
24.7.3 自动引导车辆系统的软件体系结构 372
24.7.4 并发软件体系结构 373
24.7.5 体系结构通信模式 373
24.7.6 基于构件的软件体系结构 375
24.7.7 构件接口设计 377
附录A 软件体系结构模式分类 379
附录B 教学考虑 400
术语表 402
练习答案 412
参考文献 413
索引 420