第1章 简介 1
1.1 什么是面向对象 1
1.2 什么是OO开发 3
1.2.1 对概念而非实现建模 3
1.2.2 OO方法论 3
1.2.3 三种模型 4
1.3 OO主题 5
1.3.1 抽象 5
1.3.2 封装 5
1.3.3 组合数据和行为 5
1.3.4 共享 6
1.3.5 强调对象的本质 6
1.3.6 协同 6
1.4 关于OO开发有效性的证据 7
1.5 OO建模历史 7
1.6 本书的组织结构 8
参考文献注释 8
参考文献 9
习题 9
第一部分 建模的概念 12
第2章 建模是一种设计技术 12
2.1 建模 12
2.2 抽象 12
2.3 三种模型 13
2.3.1 类模型 13
2.3.2 状态模型 13
2.3.3 交互模型 14
2.3.4 模型间的关系 14
2.4 小结 14
参考文献注释 14
习题 15
第3章 类建模 17
3.1 对象和类的概念 17
3.1.1 对象 17
3.1.2 类 17
3.1.3 类图 18
3.1.4 值和属性 19
3.1.5 操作和方法 20
3.1.6 类表示法小结 21
3.2 链接和关联的概念 21
3.2.1 链接和关联 21
3.2.2 多重性 23
3.2.3 关联端名 24
3.2.4 排序 26
3.2.5 包和序列 26
3.2.6 关联类 26
3.2.7 限定关联 28
3.3 泛化和继承 29
3.3.1 定义 29
3.3.2 泛化的用途 31
3.3.3 覆写特征 31
3.4 类模型的一个示例 32
3.5 类模型导航 34
3.5.1 遍历类模型的OCL构件 35
3.5.2 构建OCL表达式 35
3.5.3 OCL表达式的示例 36
3.6 实践技巧 37
3.7 小结 38
参考文献注释 39
参考文献 40
习题 40
第4章 高级类建模 47
4.1 高级对象和类的概念 47
4.1.1 枚举 47
4.1.2 多重性 48
4.1.3 作用域 48
4.1.4 可见性 49
4.2 关联端 49
4.3 n元关联 50
4.4 聚合 51
4.4.1 聚合与关联 52
4.4.2 聚合与组合 53
4.4.3 操作的传播 53
4.5 抽象类 54
4.6 多重继承 55
4.6.1 多重继承的种类 55
4.6.2 多重分类 56
4.6.3 应对方案 57
4.7 元数据 58
4.8 具体化 59
4.9 约束 59
4.9.1 对象上的约束 60
4.9.2 泛化集上的约束 60
4.9.3 链接上的约束 60
4.9.4 使用约束 61
4.10 派生数据 61
4.11 包 62
4.12 实践技巧 62
4.13 小结 63
参考文献注释 64
参考文献 64
习题 65
第5章 状态建模 69
5.1 事件 69
5.1.1 信号事件 69
5.1.2 变更事件 70
5.1.3 时间事件 70
5.2 状态 71
5.3 迁移和状态 72
5.4 状态图 73
5.4.1 状态图示例 73
5.4.2 单触发状态图 74
5.4.3 状态图的基本表示法小结 75
5.5 状态图行为 76
5.5.1 活动效应 76
5.5.2 do活动 76
5.5.3 进入和退出活动 77
5.5.4 完成迁移 78
5.5.5 发送信号 78
5.5.6 带有活动的状态图示例 78
5.6 实践技巧 79
5.7 小结 80
参考文献注释 80
参考文献 81
习题 81
第6章 高级状态建模 85
6.1 嵌套状态图 85
6.1.1 平面状态图的问题 85
6.1.2 扩展状态 85
6.2 嵌套状态 86
6.3 信号泛化 88
6.4 并发 89
6.4.1 聚合并发 89
6.4.2 对象内的并发 90
6.4.3 并发活动的同步 90
6.5 状态模型示例 91
6.6 类和状态模型的关系 95
6.7 实践技巧 96
6.8 小结 97
参考文献注释 97
参考文献 98
习题 98
第7章 交互建模 102
7.1 用例模型 102
7.1.1 参与者 102
7.1.2 用例 103
7.1.3 用例图 104
7.1.4 用例模型的准则 105
7.2 顺序模型 106
7.2.1 场景 106
7.2.2 顺序图 106
7.2.3 顺序模型的准则 108
7.3 活动模型 109
7.3.1 活动 110
7.3.2 分支 110
7.3.3 初始和终止 111
7.3.4 并发活动 111
7.3.5 可执行活动图 111
7.3.6 活动模型的准则 111
7.4 小结 112
参考文献注释 112
参考文献 112
习题 113
第8章 高级交互建模 115
8.1 用例关系 115
8.1.1 包含关系 115
8.1.2 扩展关系 115
8.1.3 泛化 116
8.1.4 用例关系的组合 117
8.1.5 用例关系的准则 118
8.2 过程式顺序模型 118
8.2.1 带有被动对象的顺序图 118
8.2.2 带有临时对象的顺序图 119
8.2.3 过程化顺序模型的准则 120
8.3 活动模型的特殊结构 120
8.3.1 发送和接收信号 120
8.3.2 泳道 121
8.3.3 对象流 122
8.4 小结 122
参考文献 123
习题 123
第9章 概念小结 126
9.1 类模型 126
9.2 状态模型 126
9.3 交互模型 126
9.4 模型之间的关系 127
9.4.1 泛化 127
9.4.2 聚合 128
第二部分 分析和设计 130
第10章 过程概述 130
10.1 开发阶段 130
10.1.1 系统构思 130
10.1.2 分析 131
10.1.3 系统设计 131
10.1.4 类设计 132
10.1.5 实现 132
10.1.6 测试 132
10.1.7 培训 132
10.1.8 部署 132
10.1.9 维护 132
10.2 开发生命周期 133
10.2.1 瀑布式开发 133
10.2.2 迭代开发 133
10.3 小结 133
参考文献注释 134
习题 134
第11章 系统构思 135
11.1 形成系统概念 135
11.2 阐释概念 135
11.3 准备问题陈述 137
11.4 小结 139
习题 139
第12章 领域分析 141
12.1 分析概述 141
12.2 领域类模型 142
12.2.1 寻找类 143
12.2.2 保留正确的类 144
12.2.3 准备数据词典 145
12.2.4 寻找关联 145
12.2.5 保留正确的关联 146
12.2.6 寻找属性 150
12.2.7 保留正确的属性 150
12.2.8 使用继承来细化 151
12.2.9 测试访问路径 153
12.2.10 迭代类模型 154
12.2.11 变换抽象的层次 155
12.2.12 把类分组打包 156
12.3 领域状态模型 157
12.3.1 确定具有状态的类 157
12.3.2 寻找状态 158
12.3.3 寻找事件 158
12.3.4 构建状态图 158
12.3.5 评价状态图 159
12.4 领域交互模型 159
12.5 将分析迭代 159
12.5.1 细化分析模型 160
12.5.2 重述需求 160
12.5.3 分析和设计 161
12.6 小结 161
参考文献注释 161
参考文献 162
习题 162
第13章 应用分析 169
13.1 应用程序交互模型 169
13.1.1 确定系统边界 169
13.1.2 寻找参与者 170
13.1.3 寻找用例 170
13.1.4 寻找初始和终止事件 171
13.1.5 准备普通场景 171
13.1.6 增加变化和异常场景 172
13.1.7 寻找外部事件 172
13.1.8 编制复杂用例的活动图 175
13.1.9 组织参与者和用例 175
13.1.10 检查领域类模型 175
13.2 应用类模型 176
13.2.1 确定用户界面 176
13.2.2 定义边界类 177
13.2.3 确定控制器 177
13.2.4 检查交互模型 178
13.3 应用状态模型 178
13.3.1 使用状态来确定应用类 179
13.3.2 寻找事件 179
13.3.3 构建状态图 179
13.3.4 检查其他状态图 181
13.3.5 检查类模型 182
13.3.6 检查交互模型 182
13.4 增加操作 183
13.4.1 来自类模型的操作 183
13.4.2 来自用例的操作 183
13.4.3 购物清单操作 183
13.4.4 简化操作 183
13.5 小结 184
参考文献注释 185
参考文献 185
习题 185
第14章 系统设计 188
14.1 系统设计概述 188
14.2 估算性能 189
14.3 制订复用计划 189
14.3.1 库 189
14.3.2 框架 190
14.3.3 模式 190
14.4 将系统拆分成子系统 191
14.4.1 分层 192
14.4.2 分区 192
14.4.3 组合分层和分区 192
14.5 确定并发性 193
14.5.1 识别内部的并发性 193
14.5.2 定义并发任务 194
14.6 分配子系统 194
14.6.1 估算硬件资源需求 194
14.6.2 权衡硬件和软件 195
14.6.3 给处理器分配任务 195
14.6.4 确定物理连通性 196
14.7 管理数据存储 196
14.8 处理全局资源 197
14.9 选择软件控制策略 198
14.9.1 过程驱动型控制 198
14.9.2 事件驱动型控制 199
14.9.3 并发控制 199
14.9.4 内部控制 199
14.9.5 其他范型 199
14.10 处理边界条件 200
14.11 设定权衡优先级 200
14.12 常见的架构风格 201
14.12.1 批处理转换 201
14.12.2 连续型转换 202
14.12.3 交互式界面 203
14.12.4 动态仿真 203
14.12.5 实时系统 204
14.12.6 事务管理器 204
14.13 ATM系统的架构 204
14.14 小结 205
参考文献注释 206
参考文献 207
习题 207
第15章 类设计 212
15.1 类设计概述 212
15.2 填补空白区 213
15.3 实现用例 214
15.4 设计算法 215
15.4.1 选择算法 215
15.4.2 选择数据结构 216
15.4.3 定义内部类和操作 217
15.4.4 把操作分配给类 217
15.5 向下递归 219
15.5.1 功能分层 219
15.5.2 机制分层 219
15.6 重构 220
15.7 设计优化 220
15.7.1 为了高效访问而增加冗余的关联 221
15.7.2 为了效率而重新调整执行顺序 222
15.7.3 将派生值保存下来以避免重新计算 222
15.8 行为具体化 223
15.9 调整继承 224
15.9.1 重新调整类和操作 224
15.9.2 提取公共行为 224
15.9.3 使用委托来共享行为 225
15.10 组织类设计 227
15.10.1 信息隐藏 227
15.10.2 实体的内聚性 227
15.10.3 微调包 228
15.11 ATM示例 228
15.12 小结 229
参考文献注释 230
参考文献 230
习题 231
第16章 过程小结 235
16.1 系统构思 235
16.2 分析 236
16.2.1 领域分析 236
16.2.2 应用分析 236
16.3 设计 236
16.3.1 系统设计 236
16.3.2 类设计 236
第三部分 实现 238
第17章 实现建模 238
17.1 实现概述 238
17.2 微调类 238
17.3 微调泛化 240
17.4 实现关联 241
17.4.1 分析关联遍历 241
17.4.2 单向关联 242
17.4.3 双向关联 242
17.4.4 高级关联 243
17.4.5 ATM示例 243
17.5 测试 244
17.5.1 单元测试 244
17.5.2 系统测试 244
17.6 小结 245
参考文献注释 245
参考文献 245
习题 246
第18章 OO语言 247
18.1 简介 247
18.1.1 C++简介 247
18.1.2 Java简介 248
18.1.3 比较C++和Java 249
18.2 简化的ATM模型 250
18.3 实现结构 250
18.3.1 数据类型 251
18.3.2 类 253
18.3.3 访问控制 253
18.3.4 泛化 255
18.3.5 关联 258
18.4 实现功能 260
18.4.1 创建对象 261
18.4.2 对象的生存期 263
18.4.3 对象销毁 264
18.4.4 链接创建 265
18.4.5 链接销毁 267
18.4.6 派生属性 267
18.5 实践技巧 268
18.6 小结 269
参考文献注释 270
参考文献 270
习题 270
第19章 数据库 274
19.1 简介 274
19.1.1 数据库的概念 274
19.1.2 关系数据库的概念 275
19.1.3 范式 276
19.1.4 选择DBMS产品 276
19.2 简化的ATM模型 277
19.3 实现结构——基础 277
19.3.1 类 277
19.3.2 关联 278
19.3.3 泛化 280
19.3.4 标识 281
19.3.5 RDBMS实现的基本规则小结 282
19.4 实现结构——高级 283
19.4.1 外键 283
19.4.2 检查约束 284
19.4.3 索引 284
19.4.4 视图 284
19.4.5 小结RDBMS实现的高级规则 285
19.5 为ATM示例实现结构 285
19.6 实现功能 288
19.6.1 将程序设计语言耦合到数据库中 288
19.6.2 数据转换 290
19.6.3 封装与查询优化 290
19.6.4 使用SQL代码 291
19.7 面向对象数据库 291
19.8 实践技巧 292
19.9 小结 293
参考文献注释 293
参考文献 293
习题 294
第20章 程序设计风格 298
20.1 面向对象的风格 298
20.2 可复用性 298
20.2.1 可复用性的类别 298
20.2.2 可复用性的风格准则 299
20.2.3 使用继承 300
20.3 可扩展性 301
20.4 健壮性 302
20.5 大规模程序设计 303
20.6 小结 305
参考文献注释 306
参考文献 306
习题 306
第四部分 软件工程 310
第21章 迭代开发 310
21.1 迭代开发概述 310
21.2 迭代开发与瀑布式开发 310
21.3 迭代开发与快速原型法 311
21.4 迭代的适用范围 311
21.5 执行一次迭代 312
21.6 规划下一次迭代 313
21.7 建模和迭代开发 313
21.8 识别风险 314
21.9 小结 314
参考文献注释 315
参考文献 315
第22章 管理建模 316
22.1 管理建模概述 316
22.2 模型的类型 316
22.3 建模的缺陷 317
22.4 建模会话 318
22.4.1 密室建模 318
22.4.2 轮转建模 319
22.4.3 实况建模 319
22.5 组织人员 320
22.6 学习技术 321
22.7 教授技术 322
22.8 工具 322
22.8.1 建模工具 322
22.8.2 配置管理工具 323
22.8.3 代码生成器 323
22.8.4 模拟工具 323
22.8.5 库 324
22.9 估算建模工作量 324
22.10 小结 324
参考文献注释 325
参考文献 325
第23章 遗留系统 327
23.1 逆向工程 327
23.1.1 逆向工程与正向工程 327
23.1.2 逆向工程的输入 327
23.1.3 逆向工程的输出结果 328
23.2 构造类模型 328
23.2.1 实现复原 328
23.2.2 设计复原 329
23.2.3 分析复原 329
23.3 构造交互模型 329
23.4 构造状态模型 330
23.5 逆向工程的技巧 330
23.6 包装 330
23.7 维护 331
23.8 小结 332
参考文献注释 332
参考文献 332
附录A UML图形化表示法 334
附录B 术语表 335
部分习题答案 346
索引 368