第1部分 引言与系统工程 3
第1章 引言 3
1.1 什么是软件工程 3
1.2 为什么要用软件工程 4
1.3 软件生命周期行为 5
1.3.1 软件开发过程 5
1.3.2 软件质量保证 8
1.3.3 软件项目管理 9
1.4 面向对象的软件工程 10
1.4.1 面向对象的建模和设计语言 10
1.4.2 面向对象的开发过程 10
1.4.3 面向对象的开发方法 11
1.4.4 OO会取代传统的方法吗 11
1.5 软件工程和计算机科学 11
小结 12
深入阅读 12
章节复习问题 13
练习 13
第2章 软件过程和方法 14
2.1 系统开发的挑战 14
2.2 软件过程 15
2.3 瀑布模型的优势和问题 16
2.4 软件开发是一个险恶问题 16
2.5 软件过程模型 17
2.5.1 原型过程 18
2.5.2 演化过程 18
2.5.3 螺旋模型 18
2.5.4 统一过程 19
2.5.5 个人软件过程 20
2.5.6 团队软件过程 24
2.5.7 敏捷过程 26
2.6 软件开发方法 30
2.6.1 过程和方法的区别 30
2.6.2 方法的好处 31
2.6.3 结构化方法 32
2.6.4 经典的面向对象方法 32
2.7 敏捷方法 32
2.7.1 动态系统开发方法(DSDM) 34
2.7.2 Scrum 35
2.7.3 特征驱动的开发 35
2.7.4 极限编程 36
2.7.5 敏捷还是计划驱动 36
2.8 本书中的过程和方法一览 37
小结 41
深入阅读 41
章节复习问题 42
练习 42
第3章 系统工程 43
3.1 什么是系统 43
3.2 什么是系统工程 44
3.3 系统需求定义 47
3.3.1 识别业务需求 47
3.3.2 定义系统需求 48
3.4 系统结构设计 48
3.4.1 系统分解 49
3.4.2 需求分配 51
3.4.3 结构设计图 52
3.4.4 子系统功能和接口规格说明 55
3.5 子系统开发 56
3.5.1 面向对象的上下文图 56
3.5.2 面向对象的上下文图的用途 57
3.5.3 工程团队的协作 58
3.6 系统集成、测试和部署 58
3.7 系统配置管理 58
小结 60
深入阅读 60
章节复习问题 60
练习 60
第2部分 分析和体系结构设计 65
第4章 获取软件需求 65
4.1 什么是需求获取 65
4.2 获取需求的重要性 67
4.3 获取需求的挑战 67
4.4 需求的类型 68
4.5 获取需求的步骤 69
4.5.1 收集信息 70
4.5.2 构建分析模型 73
4.5.3 获取需求和约束 74
4.5.4 需求规格标准 77
4.5.5 进行可行性研究 77
4.5.6 审查需求规格说明书 77
4.6 应用敏捷原则 79
4.7 需求管理和工具 80
小结 81
深入阅读 81
章节复习问题 81
练习 82
第5章 领域建模 84
5.1 什么是领域建模 84
5.2 为什么要进行领域建模 85
5.3 面向对象和类图 85
5.3.1 外延定义和意向定义 85
5.3.2 类和对象 86
5.3.3 对象和属性 87
5.3.4 关联 88
5.3.5 多重性和角色 89
5.3.6 聚合 90
5.3.7 继承 90
5.3.8 继承和多态 91
5.3.9 关联类 91
5.4 领域建模的步骤 93
5.4.1 收集应用领域信息 94
5.4.2 头脑风暴 94
5.4.3 对头脑风暴结果分类 95
5.4.4 领域模型可视化 98
5.4.5 领域建模审查清单 102
5.5 综合 103
5.6 领域建模的方针 105
5.7 应用敏捷原则 106
5.8 领域建模的工具支持 107
小结 108
深入阅读 109
章节复习问题 109
练习 109
第6章 架构设计 111
6.1 什么是架构设计 111
6.2 架构设计的重要性 112
6.3 架构设计过程 112
6.3.1 确定架构设计目标 113
6.3.2 确定系统类型 114
6.3.3 应用架构样式 117
6.3.4 进行定制的架构设计 124
6.3.5 明确子系统功能和接口 124
6.3.6 审查架构设计 125
6.4 架构样式和包图 125
6.5 应用软件设计准则 126
6.5.1 什么是软件设计准则 127
6.5.2 为改变而设计 127
6.5.3 关注点分离 128
6.5.4 信息隐藏 129
6.5.5 高内聚 129
6.5.6 低耦合 129
6.5.7 保持简单和直接 130
6.6 架构设计的方针 131
6.7 架构设计和设计模式 131
6.8 应用敏捷原则 132
小结 132
深入阅读 132
章节复习问题 133
练习 133
第3部分 交互式系统的建模和设计 137
第7章 从需求获取用例 137
7.1 什么是参与者 137
7.2 什么是用例 138
7.3 业务过程、操作和活动 138
7.4 从需求获取用例的步骤 140
7.4.1 识别用例 140
7.4.2 明确用例范围 146
7.4.3 用例上下文可视化 147
7.4.4 检查用例规约 151
7.4.5 将用例分配给迭代 152
7.5 导出用例的方针 153
7.6 应用敏捷原则 155
7.7 用例建模的工具支持 155
小结 157
深入阅读 157
章节复习问题 157
练习 158
第8章 参与者-系统交互建模 159
8.1 什么是参与者-系统交互建模 159
8.2 参与者-系统交互建模的重要性 160
8.3 参与者-系统交互建模的步骤 160
8.3.1 初始化一个两列的表 161
8.3.2 明确参与者-系统交互的步骤 161
8.3.3 检查参与者-系统交互规约 161
8.4 明确可替换的流 162
8.5 使用用户界面原型 163
8.6 不要显示异常处理 166
8.7 用例的先决条件和后置条件 166
8.8 包含其他用例 167
8.9 用其他用例继续 167
8.10 常见问题 168
8.11 应用敏捷原则 170
小结 170
深入阅读 171
章节复习问题 171
练习 171
第9章 对象交互建模 172
9.1 什么是对象交互建模 172
9.2 UML顺序图 173
9.2.1 概念和表示法 173
9.2.2 展示类的实例 173
9.2.3 顺序图说明 174
9.2.4 顺序图用于分析和设计 176
9.2.5 正确使用表示方法 178
9.3 对象交互建模的步骤 179
9.3.1 收集业务过程的信息 180
9.3.2 识别非普通步骤 180
9.3.3 为非普通步骤书写场景 181
9.3.4 构建场景表 183
9.3.5 怎么写场景 183
9.3.6 从场景表得到顺序图 188
9.3.7 对象交互建模检查清单 194
9.4 应用敏捷原则 195
9.5 对象交互建模的工具支持 197
小结 197
深入阅读 197
章节复习问题 197
练习 198
第10章 应用职责分配模式 199
10.1 什么是设计模式 199
10.2 为什么要用设计模式 200
10.3 情景特定模式和职责分配模式 200
10.4 模式规约 201
10.5 控制器模式 202
10.5.1 激励示例 202
10.5.2 什么是控制器 204
10.5.3 应用控制器模式 204
10.5.4 控制器的类型 206
10.5.5 跟踪记录用例状态 206
10.5.6 臃肿的控制器 207
10.5.7 比较不同的设计 208
10.5.8 何时应用控制器模式 209
10.5.9 使用控制器的方针 210
10.6 专家模式 210
10.6.1 信息专家 210
10.6.2 应用专家模式 211
10.6.3 包含不止一个对象的专家模式 212
10.6.4 何时应用专家模式 213
10.6.5 使用专家模式的方针 213
10.7 创建者模式 213
10.7.1 什么是创建者 213
10.7.2 应用创建者模式 214
10.7.3 创建者模式的优势 215
10.7.4 何时应用创建者模式 215
小结 216
深入阅读 216
章节复习问题 216
练习 217
第11章 获取设计类图 219
11.1 什么是设计类图 220
11.2 设计类图的用途 220
11.3 获取设计类图的步骤 221
11.3.1 识别类 221
11.3.2 识别方法 222
11.3.3 识别属性 224
11.3.4 类之间的关系 226
11.3.5 识别关系 226
11.3.6 设计类图检查清单 228
11.4 用包图组织类 228
11.5 应用敏捷原则 230
11.6 设计类图的工具支持 231
小结 231
深入阅读 231
章节复习问题 231
练习 231
第12章 用户接口设计 232
12.1 什么是用户接口设计 232
12.2 用户接口设计为什么重要 233
12.3 图形用户接口组件 234
12.3.1 容器组件 235
12.3.2 输入、输出和信息展示组件 235
12.3.3 使用GUI组件的方针 237
12.4 用户接口设计过程 237
12.4.1 案例研究:为状态图编辑器设计用户接口 238
12.4.2 识别系统主要显示方式 238
12.4.3 生成布局设计草图 240
12.4.4 明确交互行为 242
12.4.5 构建原型 242
12.4.6 用户评估用户接口设计 243
12.4.7 用户接口设计检查清单 244
12.5 设计用户支持功能 245
12.6 用户接口设计的方针 245
12.7 应用敏捷原则 247
12.8 用户接口设计的工具支持 247
小结 248
深入阅读 248
章节复习问题 248
练习 249
第4部分 其他类型系统的建模和设计 253
第13章 事件驱动系统的对象状态建模 253
13.1 什么是对象状态建模 253
13.2 为什么要进行对象状态建模 254
13.3 基本定义 254
13.4 对象状态建模的步骤 255
13.4.1 收集和分类状态行为信息 256
13.4.2 构建领域模型来展示上下文 258
13.4.3 构建状态迁移表 260
13.4.4 状态迁移表的用途 261
13.4.5 将状态迁移表转换为分析状态图 262
13.4.6 将分析状态图转换为设计状态图 264
13.4.7 状态建模检查清单 265
13.5 状态模式 265
13.5.1 约定的方法 265
13.5.2 什么是状态模式 266
13.5.3 应用状态模式 266
13.6 实时系统的建模与设计 269
13.6.1 转换图式 270
13.6.2 定时状态机 271
13.6.3 中断处理 272
13.7 应用敏捷原则 273
13.8 对象状态建模的工具支持 274
小结 274
深入阅读 275
章节复习问题 275
练习 275
第14章 转换型系统的活动建模 278
14.1 什么是活动建模 278
14.2 为什么使用活动建模 279
14.3 活动建模:技术背景 279
14.3.1 流程图 280
14.3.2 佩特里网 280
14.3.3 数据流图 281
14.4 UML活动图 282
14.5 活动建模的步骤 283
14.5.1 识别活动和工作流 284
14.5.2 产生一个初步活动图 286
14.5.3 引入条件分支、分叉和连接 287
14.5.4 精炼复杂的活动 287
14.5.5 活动建模审核检查表 288
14.6 与其他图之间的关系 288
14.7 应用敏捷原则 289
14.8 活动建模的工具支持 289
小结 289
深入阅读 290
章节复习问题 290
练习 290
第15章 基于规则的系统的建模与设计 291
15.1 什么是决策表 292
15.2 决策表的用处 293
15.3 系统化的决策表构造 293
15.4 渐进式决策表构造 294
15.5 检查所需的属性 295
15.6 决策表合并 296
15.7 根据决策表生成代码 296
15.8 应用解释器模式 297
15.8.1 定义业务规则语法 297
15.8.2 在类图中表示规则 298
15.8.3 构建解析器和变量查找上下文 299
15.8.4 解释业务规则 299
15.8.5 动态更新规则 300
15.8.6 解释方法的优点 300
15.9 在测试驱动开发中使用决策表 300
15.10 决策树 301
15.11 应用敏捷原则 301
小结 302
深入阅读 302
章节复习问题 302
练习 303
第5部分 应用情景特定模式 307
第16章 应用模式来设计状态图编辑器 307
16.1 应用模型的过程 308
16.2 案例研究:状态图编辑器 310
16.3 处理复杂的结构 311
16.3.1 表示递归的整体-部分结构 311
16.3.2 使用策略提供布局选择 315
16.3.3 用迭代器访问复杂的结构 316
16.3.4 通过访问者分析复杂的结构 317
16.3.5 通过备忘录存储和恢复对象状态 320
16.4 创建和构造复杂的对象 321
16.4.1 创建系列产品 321
16.4.2 构建大型的复杂对象 324
16.4.3 通过享元重用对象 326
16.5 图形用户界面的设计和显示 327
16.5.1 跟踪编辑状态 327
16.5.2 响应编辑事件 328
16.5.3 转换接口 330
16.5.4 提供上下文相关的帮助 333
16.5.5 使用装饰增强显示能力 335
16.6 应用敏捷原则 338
小结 338
深入阅读 338
章节复习问题 339
练习 339
第17章 应用模式来设计持久性框架 340
17.1 直接访问数据库会出现的问题 340
17.2 通过桥隐藏持久存储 341
17.3 将数据库请求封装为命令 344
17.4 用远程代理隐藏网络访问 348
17.5 用模板方法共享通用代码 351
17.6 通过工厂方法检索不同的对象 353
17.7 用原型减少类的数量 355
17.8 应用敏捷原则 358
小结 358
深入阅读 358
章节复习问题 358
练习 358
第6部分 实现和质量保证 363
第18章 实现方面的考虑 363
18.1 编码标准 363
18.1.1 什么是编码标准 363
18.1.2 为什么要建立编码标准 367
18.1.3 代码审查清单 367
18.1.4 编码标准实施准则 367
18.2 组织实现部件 369
18.3 根据设计生成代码 370
18.3.1 实现类和接口 370
18.3.2 从顺序图到方法代码骨架 370
18.3.3 实现关联关系 371
18.4 给团队成员分配任务 372
18.5 结对编程 372
18.6 测试驱动开发 373
18.6.1 测试驱动开发的工作流程 373
18.6.2 测试驱动开发的优点 375
18.6.3 潜在问题 375
18.7 应用敏捷原则 376
18.8 对实现的工具支持 376
小结 376
深入阅读 377
章节复习问题 377
练习 377
第19章 软件质量保证 379
19.1 软件质量保证的益处 379
19.2 软件质量属性 379
19.3 质量测量和度量 381
19.3.1 质量测量和度量的实用性 382
19.3.2 常规质量度量 382
19.3.3 对面向对象软件重用传统度量 387
19.3.4 面向对象质量度量 387
19.4 软件验证与确认技术 389
19.4.1 审查 389
19.4.2 走查 390
19.4.3 同行审查 391
19.5 生命周期中的验证和确认 392
19.6 软件质量保证功能 393
19.6.1 过程和标准的定义 394
19.6.2 质量管理 396
19.6.3 过程改进 397
19.7 应用敏捷原则 398
19.8 SQA的工具支持 399
小结 399
深入阅读 400
章节复习问题 400
练习 400
第20章 软件测试 401
20.1 什么是软件测试 402
20.2 为什么进行软件测试 402
20.3 传统的黑盒测试 403
20.3.1 功能性测试:一个例子 403
20.3.2 等价类划分 404
20.3.3 边界值分析 405
20.3.4 因果分析 407
20.4 传统的白盒测试 407
20.4.1 基路径测试 408
20.4.2 圈复杂度 409
20.4.3 流图测试覆盖准则 409
20.4.4 测试循环 410
20.4.5 数据流测试 411
20.4.6 数据流测试的覆盖准则 412
20.4.7 过程间数据流测试 412
20.5 测试覆盖率 413
20.6 一个通用的软件测试过程 413
20.7 面向对象的软件测试 415
20.7.1 基于用例的测试 415
20.7.2 用ClassBench进行对象状态测试 416
20.7.3 测试类的层次结构 418
20.7.4 测试异常处理能力 419
20.8 测试Web应用程序 420
20.8.1 Web应用程序测试的面向对象模型 420
20.8.2 使用面向对象模型进行静态分析 421
20.8.3 使用面向对象模型生成测试用例 421
20.8.4 用httpUnit进行Web应用程序测试 422
20.9 非功能性需求的测试 422
20.9.1 性能和压力测试 422
20.9.2 安全测试 423
20.9.3 测试用户界面 423
20.10 生命周期中的软件测试 424
20.11 回归测试 426
20.12 什么时候停止测试 426
20.13 应用敏捷原则 427
20.14 测试的工具支持 427
小结 427
深入阅读 428
章节复习问题 428
练习 428
第7部分 维护和配置管理 433
第21章 软件维护 433
21.1 什么是软件维护 433
21.2 软件变化的因素 434
21.3 系统演化的雷曼定律 434
21.4 软件维护的类型 435
21.5 软件维护过程和活动 435
21.5.1 维护过程模型 436
21.5.2 理解程序 437
21.5.3 变更识别和分析 437
21.5.4 配置变更控制 439
21.5.5 变更实施、测试和交付 440
21.6 逆向工程 440
21.6.1 逆向工程工作流 440
21.6.2 逆向工程的用途 440
21.6.3 逆向工程:案例研究 441
21.7 软件再工程 441
21.7.1 再工程的目标 441
21.7.2 软件再工程的过程 442
21.7.3 软件再工程:案例研究 443
21.8 软件维护的模式 444
21.8.1 用外观模式简化客户端接口 444
21.8.2 用中介者模式简化组件交互 445
21.8.3 软件维护的模式 445
21.9 应用敏捷原则 449
21.10 软件维护的工具支持 449
小结 450
深入阅读 450
章节复习问题 450
练习 450
第22章 软件配置管理 452
22.1 软件生命周期的基准 452
22.2 什么是软件配置管理 453
22.3 为什么需要软件配置管理 454
22.4 软件配置管理的功能 454
22.4.1 软件配置识别 455
22.4.2 软件配置变更控制 456
22.4.3 软件配置审核 457
22.4.4 软件配置状态的审计 458
22.5 敏捷项目中的配置管理 458
22.6 软件配置管理工具 458
小结 460
深入阅读 460
章节复习问题 460
练习 461
第8部分 项目管理和软件安全 465
第23章 软件项目管理 465
23.1 项目组织 466
23.1.1 项目形式 466
23.1.2 团队结构 467
23.2 工作量评估方法 468
23.2.1 功能点方法 468
23.2.2 COCOMOⅡ模型 469
23.2.3 Delphi评估方法 474
23.2.4 敏捷评估 474
23.3 项目计划和调度 476
23.3.1 PERT图 476
23.3.2 Gantt图和人员分配 477
23.3.3 敏捷规划 478
23.4 风险管理 479
23.4.1 风险识别 479
23.4.2 风险分析和优先级划分 480
23.4.3 风险管理规划 482
23.4.4 风险解决和监控 482
23.5 过程改进 482
23.6 应用敏捷原则 484
23.7 项目管理的工具支持 484
小结 485
深入阅读 485
章节复习问题 486
练习 486
第24章 软件安全 488
24.1 什么是软件安全 489
24.2 安全要求 489
24.3 安全软件设计原则 490
24.4 安全软件设计模式 491
24.5 软件安全的7个最佳实践 493
24.6 通过攻击树进行风险分析 494
24.7 生命周期中的软件安全性 494
24.7.1 规划阶段的安全 495
24.7.2 迭代阶段的安全 501
24.8 应用敏捷原则 503
24.9 软件安全的工具支持 504
小结 504
深入阅读 505
章节复习问题 505
练习 506
附录A 个人软件过程:估计、规划和质量保证 507
A.1 PSP中的工作量估计 507
A.2 PSP中的软件质量保证 508
A.3 设计和质量 508
附录B Java技术 510
B.1 使用数据库连接 510
B.1.1 什么是数据库连接 510
B.1.2 设置数据源 510
B.1.3 从程序中访问数据库 511
B.2 使用Swing 512
B.2.1 用JFrame创建主窗口 512
B.2.2 利用布局管理器来布局组件 513
B.2.3 使用动作监听器处理按钮事件 515
B.2.4 实现绘图功能 515
B.3 使用JSP 517
B.3.1 什么是JSP 517
B.3.2 JSP工作流 517
B.3.3 用JSP容器安装Web服务器 518
B.3.4 使用JSP 518
附录C 软件工具 521
C.1 NetBeans 521
C.2 使用JUnit 522
C.3 在NetBeans中运行JUnit 525
C.4 Emma覆盖工具 525
C.5 Cobertura覆盖工具 526
C.6 使用HttpUnit测试Web应用程序 527
C.6.1 配置IDE 以使用HttpUnit 527
C.6.2 在HttpUnit中实现测试用例 528
C.7 在NetBeans中使用cvs和Subversion 529
C.7.1 创建CVS远程存储库 529
C.7.2 在NetBeans中安装Subversion 530
C.7.3 从存储库检出文件 531
C.7.4 编辑源和查看变更 533
C.7.5 查看文件状态 533
C.7.6 比较文件版本 534
C.7.7 合并存储库中的更改 534
C.7.8 解决冲突 534
C.7.9 更新本地副本 534
C.7.10 提交本地文件到存储库 535
C.7.11 导入文件到存储库 535
附录D 项目概要 536
D.1 汽车租赁系统 536
D.2 国家贸易展览服务系统 536
D.3 海外留学管理系统 537
D.4 UML类图编辑器 539
D.5 无线电通信模拟器 540
D.6 对象状态测试环境 541
参考文献 543