第1章 入门 1
1.1 背景 1
1.2 编程简史 1
1.3 方法学 2
1.4 关于本书 2
1.4.1 内容概述 3
1.4.2 案例分析 3
1.4.3 导航 3
第Ⅰ部分 设置场景 7
第2章 对象的概念 7
2.1 引言 7
2.2 什么是对象 8
2.3 相同还是相等 10
2.4 描述对象 12
2.5 封装 13
2.6 关联和聚合 13
2.7 图和树 15
2.8 链接和可导航性 16
2.9 消息 17
2.10 启动操作 19
2.11 协作示例 19
2.12 面向对象程序的工作原理 21
2.13 垃圾收集 22
2.14 类 22
2.15 类定义的内容 24
2.16 共享数据和共享操作 26
2.17 类型 27
2.18 术语 27
2.19 重用代码 29
2.20 小结 32
2.21 课外阅读 32
2.22 复习题 32
2.23 练习1的答案 33
2.24 复习题答案 33
第3章 继承 34
3.1 引言 34
3.2 设计类层次结构 35
3.3 给类层次结构添加实现代码 36
3.4 抽象类 38
3.5 重定义方法 40
3.6 实现栈类 40
3.6.1 使用继承实现栈 41
3.6.2 使用复合实现栈 42
3.6.3 继承和复合 43
3.7 多重继承 44
3.8 使用继承的规则 47
3.9 小结 47
3.10 课外阅读 47
3.11 复习题 47
3.12 复习题答案 49
第4章 类型系统 50
4.1 引言 50
4.2 动态和静态类型系统 50
4.3 多态性 51
4.3.1 多态变量 52
4.3.2 多态消息 53
4.4 动态绑定 54
4.5 多态性规则 56
4.6 类型转换 56
4.7 显式类型转换 57
4.8 使用模板进行泛化 59
4.9 小结 60
4.10 课外阅读 60
4.11 复习题 60
4.12 练习2的答案 62
4.13 练习3的答案 62
4.14 复习题答案 62
第5章 软件开发的方法学 64
5.1 引言 64
5.2 软件开发中的经典阶段 65
5.2.1 需求 65
5.2.2 分析 66
5.2.3 设计 66
5.2.4 规范 66
5.2.5 实现 66
5.2.6 测试 66
5.2.7 部署 67
5.2.8 维护 67
5.2.9 关键问题 67
5.3 软件工程和瀑布方法学 68
5.4 新方法学 71
5.4.1 螺旋式方法学 71
5.4.2 迭代式方法学 72
5.4.3 递增式方法学 72
5.4.4 合并方法学 73
5.5 面向对象的方法学 74
5.5.1 UML、RUP和XP 74
5.5.2 开发工具的需求 75
5.6 Ripple概述 76
5.6.1 用例图 78
5.6.2 类图(分析级别) 79
5.6.3 通信图 79
5.6.4 部署图 80
5.6.5 类图(设计级别) 81
5.6.6 顺序图 81
5.7 小结 82
5.8 课外阅读 82
5.9 复习题 82
5.10 复习题答案 83
第Ⅱ部分 理解问题 87
第6章 收集需求 87
6.1 引言 87
6.2 系统的诞生 88
6.3 用例 89
6.4 业务说明 90
6.4.1 标识业务参与者 90
6.4.2 编写项目术语表 91
6.4.3 标识业务用例 92
6.4.4 在通信图中演示用例 93
6.4.5 在活动图中演示用例 94
6.5 开发人员的说明 95
6.5.1 使参与者特殊化 98
6.5.2 用例的关系 99
6.5.3 系统用例的细节 102
6.5.4 前提条件、后置条件和继承 104
6.5.5 辅助需求 104
6.5.6 用户界面草案 104
6.5.7 系统用例的优先级 105
6.6 小结 107
6.7 课外阅读 107
6.8 复习题 107
6.9 复习题答案 109
第7章 分析问题 110
7.1 引言 110
7.2 为什么要进行分析 110
7.3 分析过程概述 111
7.4 静态分析 112
7.4.1 确定类 112
7.4.2 标识类的关系 112
7.4.3 绘制类图和对象图 112
7.4.4 绘制关系 114
7.4.5 属性 117
7.4.6 关联类 120
7.4.7 有形对象和无形对象 120
7.4.8 好的对象 124
7.5 动态分析 124
7.5.1 绘制用例的实现过程 124
7.5.2 边界、控制器和实体 126
7.5.3 通信图中的元素 127
7.5.4 给类添加操作 128
7.5.5 职责 129
7.5.6 状态建模 129
7.6 小结 130
7.7 课外阅读 130
7.8 复习题 131
7.9 练习4的答案 133
7.10 复习题答案 133
第Ⅲ部分 设计解决方案 137
第8章 设计系统体系结构 137
8.1 引言 137
8.2 设计优先级 138
8.3 系统设计中的步骤 138
8.4 选择联网的系统拓扑 139
8.4.1 网络体系结构的简史 139
8.4.2 三层体系结构 140
8.4.3 个人计算机 142
8.4.4 网络计算机 142
8.4.5 互联网和万维网 143
8.4.6 内联网 143
8.4.7 外联网和虚拟私人网络 144
8.4.8 客户机—服务器与分布式体系结构 144
8.4.9 用UML描述网络拓扑 146
8.5 并发设计 147
8.6 安全设计 148
8.6.1 数字加密和解密 148
8.6.2 一般安全规则 149
8.7 分解软件 150
8.7.1 系统和子系统 150
8.7.2 层 151
8.7.3 Java层:应用小程序和RMI 153
8.7.4 层中的消息流 155
8.8 小结 158
8.9 课外阅读 158
8.10 复习题 158
8.11 复习题答案 159
第9章 选择技术 160
9.1 引言 160
9.2 客户层技术 160
9.3 客户层到中间层的协议 162
9.4 中间层技术 163
9.5 中间层到数据层的技术 164
9.6 其他技术 165
9.7 一般前端配置 166
9.7.1 HTML/CGI和脚本 166
9.7.2 HTML/CGI和服务小程序 167
9.7.3 RMI 168
9.7.4 CORBA 169
9.7.5 EJB 170
9.8 后端配置 171
9.9 Java电子商务配置 171
9.10 UML包 174
9.11 小结 177
9.12 课外阅读 177
9.13 复习题 178
9.14 复习题答案 178
第10章 设计子系统 179
10.1 引言 179
10.2 把分析的类模型映射为设计的类模型 180
10.2.1 映射操作 180
10.2.2 变量类型 180
10.2.3 字段的可见性 180
10.2.4 访问器 181
10.2.5 映射类、属性和复合 181
10.2.6 映射其他类型的关联 182
10.2.7 通用标识符 186
10.3 使用关系数据库实现存储 187
10.3.1 数据库管理系统 187
10.3.2 关系模型 188
10.3.3 映射实体类 190
10.3.4 映射关联 190
10.3.5 映射对象状态 193
10.4 最终确定用户界面 196
10.5 设计业务服务 200
10.5.1 使用代理和副本 201
10.5.2 给业务服务分类 203
10.5.3 会话标识符 204
10.5.4 业务服务的实现 204
10.6 使用模式、框架和库 206
10.7 事务 206
10.7.1 保守并发和开放并发 207
10.7.2 使用事务和对象的一般规则 207
10.7.3 上层中的事务 207
10.8 处理多个活动 208
10.8.1 控制多个任务 208
10.8.2 控制多个线程 208
10.8.3 线程安全 209
10.9 小结 212
10.10 课外阅读 212
10.11 复习题 212
10.12 复习题答案 213
第11章 可重用的设计模式 214
11.1 引言 214
11.1.1 模式简史 214
11.1.2 目前的软件模式 215
11.2 模式模板 215
11.3 常见的设计模式 216
11.3.1 观察器模式 216
11.3.2 单一模式 220
11.3.3 多重模式 223
11.3.4 迭代器模式 224
11.3.5 工厂方法和抽象工厂 226
11.3.6 状态模式 227
11.3.7 门面模式 231
11.3.8 适配器模式 231
11.3.9 策略模式和模板方法 233
11.3.10 次轻量级模式 235
11.3.11 复合模式 236
11.3.12 代理模式 239
11.4 使用模式 240
11.5 发现、合并和调整模式 241
11.6 小结 243
11.7 课外阅读 243
第12章 指定类的接口 244
12.1 引言 244
12.2 规范的定义 245
12.3 正式规范 245
12.4 非正式规范 247
12.5 动态检查 248
12.6 面向对象的规范 250
12.6.1 OCL中的正式规范 250
12.6.2 Eiffel中的非正式规范 251
12.7 按合同设计 252
12.7.1 合同和继承 255
12.7.2 减少错误检查代码 256
12.7.3 履行合同 258
12.7.4 应用程序防火墙 259
12.8 Java中的非正式规范 259
12.8.1 使用注释编写合同文档 259
12.8.2 动态检查条件 260
12.8.3 使用RuntimeException发出违反合同的信号 260
12.8.4 外部系统 261
12.8.5 启用和禁用动态检查 263
12.9 小结 264
12.10 课外阅读 264
12.11 复习题 265
12.12 复习题答案 265
第13章 不间断的测试 266
13.1 引言 266
13.2 测试术语 266
13.2.1 黑盒子测试 267
13.2.2 白盒子测试 268
13.3 测试的类型 268
13.3.1 单元测试 269
13.3.2 完整性测试 269
13.3.3 Alpha测试 269
13.3.4 beta测试 270
13.3.5 用例测试 270
13.3.6 组件测试 270
13.3.7 构建测试 271
13.3.8 负载测试 272
13.3.9 安装测试 273
13.3.10 接受测试 273
13.3.11 衰退测试 273
13.3.12 说明文档测试 274
13.3.13 安全测试 274
13.3.14 衡量标准 274
13.4 测试的自动化 275
13.5 准备测试 276
13.6 测试策略 277
13.6.1 开发过程中的测试 277
13.6.2 测试阶段中的测试 278
13.6.3 发布后的测试 278
13.7 测试的内容 278
13.8 测试驱动的开发 281
13.9 使用JUnit进行测试驱动的开发示例 282
13.9.1 测试Car类 283
13.9.2 实现Car类 284
13.9.3 重新安排测试 286
13.9.4 为衰退测试创建测试套件 288
13.9.5 测试Across方法 290
13.9.6 完成Store类 290
13.10 小结 292
13.11 课外阅读 293
附录A Ripple小结 294
附录B iCoot案例分析 297
B.1 业务需求 297
B.1.1 顾客的任务陈述 297
B.1.2 参与者列表 297
B.1.3 用例列表 298
B.1.4 用例的通信图 298
B.1.5 用例的活动图 298
B.1.6 用例的细节 299
B.2 系统需求 302
B.2.1 用户界面草图 302
B.2.2 参与者列表 303
B.2.3 用例列表 303
B.2.4 用例图 304
B.2.5 用例调查 304
B.2.6 用例细节 305
B.2.7 辅助需求 308
B.2.8 用例的优先级 308
B.3 分析 308
B.3.1 类图 308
B.3.2 属性 309
B.3.3 操作列表 309
B.3.4 预约的状态机 311
B.3.5 用例的实现 311
B.4 系统设计 316
B.4.1 选择技术 316
B.4.2 层图 317
B.4.3 层交互策略 318
B.4.4 包 318
B.4.5 部署图 319
B.4.6 安全策略 320
B.4.7 并发策略 320
B.5 子系统设计 320
B.5.1 业务服务 321
B.5.2 ServletsLayer类图 321
B.5.3 ServletsLayer的字段列表 321
B.5.4 ServletsLayer的消息列表 322
B.5.5 ServerLayer类图 322
B.5.6 ServerLayer的字段列表 323
B.5.7 ServerLayer的消息列表 323
B.5.8 BusinessLayer类图 324
B.5.9 BusinessLayer的字段列表 325
B.5.10 协议对象的类图 328
B.5.11 数据库模式 329
B.5.12 用户界面设计 330
B.5.13 业务服务的实现 330
B.6 类的规范 342
B.6.1 服务器类的规范 342
B.6.2 业务逻辑类的规范 344
B.7 测试计划概述 346
B.7.1 引言 346
B.7.2 螺旋式递增方式的作用 346
B.7.3 非代码制品的测试 347
B.7.4 代码的评估 347
B.7.5 测试驱动的开发 347
B.7.6 断言 347
B.7.7 测试阶段 347
B.7.8 说明文档的测试 348
B.7.9 构建测试 348
B.7.10 测试建档和记录日志 348
B.7.11 分阶段的测试活动 348
B.8 术语表 350
附录C UML表示法小结 356