第一部分 基础理论 3
第1章 绪论 3
1.1 软件概述 3
1.1.1 什么是计算机软件 4
1.1.2 软件的特点 4
1.1.3 软件的分类 5
1.1.4 软件的发展 7
1.1.5 软件危机 8
1.2 软件工程 10
1.2.1 软件工程与方法学 10
1.2.2 软件工程的基本原理 12
1.2.3 软件工程的目标 13
1.2.4 软件工程的内容 15
1.2.5 软件工程原则 16
1.2.6 软件工程面临的问题 17
小结 18
综合练习一 18
第2章 基本理论 20
2.1 软件工程过程 20
2.2 软件生命周期 21
2.2.1 软件分析时期 22
2.2.2 软件设计时期 23
2.2.3 编码与测试时期 24
2.2.4 运行与维护时期 24
2.3 软件生命周期模型 25
2.3.1 软件生命周期模型的概念 25
2.3.2 瀑布模型 25
2.3.3 原型模型 27
2.3.4 增量模型 28
2.3.5 螺旋模型 30
2.3.6 喷泉模型 31
2.3.7 基于知识的模型 32
2.3.8 变换模型 33
2.4 软件开发方法 33
2.4.1 结构化方法 33
2.4.2 Jackson方法 34
2.4.3 维也纳开发方法 34
2.4.4 面向对象的开发方法 35
2.5 软件工具与开发 35
2.5.1 软件工具箱 36
2.5.2 软件开发环境 36
2.5.3 计算机辅助软件工程 36
小结 37
综合练习二 37
第3章 可行性研究 39
3.1 可行性研究任务与步骤 39
3.1.1 研究任务 40
3.1.2 研究步骤 43
3.2 系统分析 44
3.2.1 系统分析员 44
3.2.2 面临的问题域 45
3.2.3 通信技术 46
3.3 分析原理 47
3.3.1 信息域 48
3.3.2 建立模型 49
3.3.3 分解 49
3.4 系统模型与模拟 50
3.4.1 系统模型 50
3.4.2 系统建模和模拟 51
3.5 成本-效益分析 52
3.6 可行性研究的文档 54
3.7 项目开发计划 55
3.7.1 方案选择 55
3.7.2 制定项目开发计划 56
小结 57
综合练习三 57
第二部分 结构化方法第4章 软件需求分析 61
4.1 需求分析 61
4.1.1 需求分析的特点 61
4.1.2 需求分析的原则 62
4.1.3 需求分析的任务 62
4.1.4 需求分析的方法 64
4.2 结构化分析 65
4.2.1 自顶向下逐层分解 66
4.2.2 结构化分析步骤 67
4.3 系统流程图 67
4.4 数据流图 69
4.4.1 基本图形符号 70
4.4.2 画数据流图 71
4.4.3 结构化分析方法的应用 74
4.5 数据字典 78
4.5.1 内容及格式 78
4.5.2 数据字典的实现 81
4.6 关系数据理论 81
4.6.1 数据依赖 81
4.6.2 关系模式的操作异常 82
4.6.3 范式 83
4.6.4 EAR方法 87
小结 90
综合练习四 90
第5章 总体设计 91
5.1 软件设计的重要性 91
5.2 设计过程 92
5.3 软件总体设计 93
5.4 设计基本原理 95
5.4.1 抽象 95
5.4.2 细化 95
5.4.3 模块化 96
5.4.4 软件体系结构 97
5.4.5 程序结构 98
5.4.6 数据结构 99
5.4.7 软件过程 100
5.5 体系结构设计 101
5.5.1 软件结构图 102
5.5.2 模块的大小 103
5.5.3 扇出和扇入与深度和宽度 104
5.5.4 模块的耦合 105
5.5.5 模块的内聚 107
5.5.6 结构设计的一般准则 109
5.5.7 模块的作用域与控制域 110
5.6 结构化设计 111
5.6.1 数据流的类型 111
5.6.2 过程步骤 113
5.6.3 变换分析设计 113
5.6.4 事务分析设计 115
5.6.5 混合流设计 116
5.6.6 结构化设计方法应用示例 118
5.6.7 设计的后期处理 119
5.7 软件结构优化 119
5.7.1 软件结构设计优化准则 120
5.7.2 软件结构的HIPO图 121
小结 121
综合练习五 122
第6章 软件详细设计 123
6.1 细节设计的任务与方法 123
6.1.1 细节设计的基本任务 123
6.1.2 细节设计方法 124
6.2 设计表示法 125
6.2.1 结构化语言 125
6.2.2 判定表 126
6.2.3 判定树 127
6.3 结构化程序设计 127
6.3.1 程序流程图 128
6.3.2 三种基本控制结构 128
6.3.3 常用符号 130
6.4 结构化定理 131
6.4.1 程序函数 131
6.4.2 基本定理 132
6.4.3 常见错误 133
6.4.4 过程设计语言 135
6.5 面向数据结构的设计 138
6.5.1 Jackson图 139
6.5.2 纲要逻辑 140
6.5.3 Jackson方法 141
6.5.4 JSP应用 141
6.5.5 JSD方法 144
小结 149
综合练习六 149
第三部分 面向对象方法与实现第7章 面向对象方法概论 153
7.1 面向对象简介 153
7.1.1 什么是面向对象 154
7.1.2 面向对象方法的历史及现状 155
7.2 面向对象的相关概念 155
7.2.1 对象 156
7.2.2 类 157
7.2.3 对象图 158
7.2.4 属性 158
7.2.5 服务(操作或方法) 159
7.2.6 封装 160
7.2.7 继承 160
7.2.8 多重继承 163
7.2.9 消息 166
7.2.10 结构与连接 166
7.2.11 多态性 168
7.2.12 永久对象 171
7.2.13 主动对象 171
7.2.14 对象类的表示方法 172
7.3 链接与关联 172
7.3.1 一般概念 172
7.3.2 重数 173
7.3.3 关联的重要性 174
7.3.4 三元关联 174
7.3.5 关联的候选关键字 174
7.3.6 异或关联 175
7.3.7 资格关联 175
7.3.8 链接属性 175
7.3.9 用关联模型化为类 175
7.3.10 角色名 176
7.3.11 排序 176
7.3.12 资格符 177
7.4 构造分组 177
7.4.1 模块 177
7.4.2 表 177
小结 178
综合练习七 178
第8章 模型 180
8.1 统一建模语言 180
8.1.1 模型的建立 182
8.1.2 UML的基本图标 182
8.1.3 UML语义 186
8.1.4 UML的基本元素 188
8.1.5 UML的词别 189
8.2 UML的评价 189
8.2.1 UML成功的因素 189
8.2.2 UML能够起到的积极作用 190
8.2.3 UML不能起到的作用 190
8.2.4 UML存在的缺点与问题 191
8.2.5 从U2P提案看UML的未来 196
8.3 对象模型 198
8.3.1 表示方法 198
8.3.2 表示结构 199
8.3.3 例子 201
8.4 动态模型 201
8.4.1 事件和状态 202
8.4.2 操作 206
8.4.3 嵌套状态图 207
8.4.4 实践技巧 210
8.5 功能模型 211
8.5.1 数据流图 211
8.5.2 指定的操作 212
8.5.3 约束 213
8.5.4 功能模型的实例 214
8.5.5 功能模型与对象模型和动态模型的关系 216
小结 217
综合练习八 218
第9章 对象分析 219
9.1 对象、主动对象以及它们的类 219
9.2 研究问题域和用户需求 221
9.2.1 研究用户需求,明确系统责任 221
9.2.2 研究问题域 222
9.2.3 确定系统边界 223
9.3 发现对象 224
9.3.1 正确地运用抽象原则 224
9.3.2 策略与启发 224
9.3.3 审查和筛选 226
9.3.4 识别主动对象 228
9.4 对象的发现和标识 228
9.4.1 动机 229
9.4.2 方法 229
9.4.3 三视图模型(3VM) 230
9.4.4 语言信息分析 231
9.5 对象分类,建立类图的对象层 233
9.5.1 异常情况的检查和调整 233
9.5.2 类的命名 234
9.5.3 建立类图的对象层 234
9.6 对象的属性和服务 234
9.7 定义属性 236
9.7.1 策略与启发 236
9.7.2 审查与筛选 237
9.7.3 推迟到OOD考虑的问题 239
9.7.4 属性的命名和定位 240
9.7.5 属性的详细说明 240
9.8 定义服务 240
9.8.1 对象的状态与状态转换图 241
9.8.2 行为分类 242
9.8.3 发现服务的策略与启发 243
9.8.4 审查与调整 244
9.8.5 认识对象的主动行为 244
9.8.6 服务的命名和定位 245
9.8.7 服务的详细说明 245
9.9 应用实例 246
9.9.1 功能需求 246
9.9.2 发现对象 247
9.9.3 对象层表示 247
9.9.4 电梯系统的属性描述 248
9.9.5 电梯系统的服务定义 249
9.9.6 电梯系统的特征层 255
小结 256
综合练习九 256
第10章 关系分析 257
10.1 整体-部分结构 257
10.1.1 整体-部分结构及其用途 257
10.1.2 表示法 260
10.1.3 如何发现整体-部分结构 260
10.1.4 审查与筛选 261
10.1.5 简化对象的定义 262
10.1.6 支持软件复用 262
10.1.7 整体-部分结构的进一步运用 263
10.1.8 调整对象层和属性层 264
10.2 一般-特殊结构 265
10.2.1 一般-特殊结构及其用途 265
10.2.2 表示法 266
10.2.3 如何发现一般-特殊结构 266
10.2.4 审查与调整 267
10.2.5 多继承及多态性问题 268
10.2.6 一般-特殊结构的简化 270
10.2.7 调整对象层和特征层 271
10.3 实例连接 271
10.3.1 简单的实例连接 271
10.3.2 复杂的实例连接及其表示 272
10.3.3 三元关联问题 274
10.3.4 如何建立实例连接 274
10.3.5 对象层、特征层的增补及实例连接说明 276
10.4 消息连接 276
10.4.1 消息的定义 276
10.4.2 顺序系统中的消息 276
10.4.3 并发系统中的消息 277
10.4.4 消息对OOA的意义 280
10.4.5 OOA对消息的表示——消息连接 280
10.5 如何建立消息连接 281
10.5.1 建立控制线程内部的消息连接 281
10.5.2 建立控制线程之间的消息连接 282
10.5.3 对象分布问题及其消息的影响 282
10.6 消息的详细说明 283
10.7 电梯例子 284
10.7.1 一般-特殊关系 284
10.7.2 整体-部分关系 284
10.7.3 连接 284
10.7.4 电梯控制系统的关系层 285
小结 286
综合练习十 286
第11章 面向对象设计原则 287
11.1 类型一致性与闭合行为 287
11.1.1 类与类型 287
11.1.2 类型一致性原则 288
11.1.3 闭合行为原则 289
11.2 封装与共生性 289
11.2.1 封装结构 289
11.2.2 共生性 291
11.2.3 面向对象系统中共生性的滥用 292
11.2.4 共生性的术语 293
11.3 领域、依附集和内聚 294
11.3.1 对象类的领域 294
11.3.2 依附集 296
11.3.3 类的内聚:一个类和它的特性 298
11.4 继承与多态性的危险性 299
11.4.1 继承的滥用 300
11.4.2 错误的聚集 300
11.4.3 倒置的层次结构 300
11.4.4 混淆类及其实例 300
11.4.5 误用 301
11.4.6 多态性的危险性 301
11.5 状态空间和行为 303
11.5.1 一个类的状态空间和行为 303
11.5.2 子类的状态空间 303
11.5.3 子类的行为 304
11.5.4 类的不变式 304
11.5.5 前置条件和后置条件 305
11.5.6 类接口中支持的状态 306
11.5.7 类接口中支持的行为 307
11.5.8 类接口中操作的聚合 308
小结 308
综合练习十一 308
第12章 对象设计 310
12.1 对象设计综述 310
12.1.1 从分析和系统结构着手 310
12.1.2 对象设计的步骤 311
12.1.3 对象模型工具 311
12.2 组合三种模型 312
12.3 设计算法 312
12.3.1 选择算法 313
12.3.2 选择数据结构 314
12.3.3 定义内部类和操作 315
12.3.4 指定操作的职责 315
12.4 设计优化 316
12.4.1 添加冗余关联获取有效访问 316
12.4.2 重新安排执行次序以获得效率 317
12.4.3 保存导出属性避免重复计算 318
12.5 控制实现 319
12.5.1 在程序内进行状态设置 319
12.5.2 状态机器引擎 319
12.5.3 控制作为并发任务 320
12.6 继承的调整 320
12.6.1 重新安排类和操作 320
12.6.2 抽象出公共的行为 321
12.6.3 使用授权共享实现 322
12.7 关联设计 323
12.7.1 分析关联遍历 323
12.7.2 单向关联 323
12.7.3 双向关联 323
12.7.4 链接属性 324
12.8 对象的表示 324
12.9 物理打包 325
12.9.1 信息隐藏 325
12.9.2 实体的相关性 326
12.9.3 构造模块 326
12.10 设计决策文档 327
12.11 控制驱动部分 327
12.12 相关技术问题 327
12.12.1 系统总体方案 328
12.12.2 软件体系结构 329
12.12.3 分布式系统的体系结构风格 329
12.12.4 系统的并发性 332
12.13 如何设计控制驱动部分 335
12.13.1 选择软件体系结构风格 335
12.13.2 确定系统分布方案 336
12.13.3 识别控制流 339
12.13.4 用主动对象表示控制流 342
12.13.5 把控制驱动部分看作一个主题 343
小结 343
综合练习十二 344
第13章 接口设计 346
13.1 人的因素 347
13.1.1 分析活动者 347
13.1.2 从Use Case分析人机交互 348
13.1.3 分析处理异常事件的人机交互 350
13.1.4 命令的组织 351
13.1.5 输出信息的组织结构 354
13.2 界面设计风格 355
13.2.1 菜单的选择 355
13.2.2 对话框 357
13.2.3 窗口 357
13.3 人机界面的设计准则 358
13.4 人机界面设计过程 359
13.4.1 用户界面模型 360
13.4.2 界面支持系统 361
13.4.3 界面元素 362
13.4.4 设计的形式 362
13.5 描述方法与技术 364
13.5.1 灵境技术 365
13.5.2 多通道人机交互技术 366
13.6 数据管理系统及其选择 367
13.7 技术整合 373
13.8 数据接口 375
13.9 对象存储方案和数据接口的设计策略 376
13.9.1 针对文件系统的设计 376
13.9.2 针对RDBMS的设计 380
13.9.3 使用OODBMS 389
小结 389
综合练习十三 390
第14章 形式化方法 392
14.1 基础知识 392
14.1.1 形式化方法概念 392
14.1.2 形式化规约语言 393
14.2 有限状态机(FSM) 395
14.3 Petri网基本原理 396
14.3.1 静态结构 397
14.3.2 动态特征 397
14.3.3 转移启动规则 398
14.3.4 行为特性 400
14.3.5 行为特性分析方法 402
14.3.6 结构特性分析方法 408
14.3.7 Petri网到程序结构的转换 411
小结 414
综合练习十四 414
第15章 软件实现 416
15.1 程序设计语言的特性及选择 416
15.1.1 程序设计语言特性 416
15.1.2 程序设计语言的选择 418
15.2 程序设计风格 420
15.3 程序设计效率 422
15.3.1 代码效率 422
15.3.2 内存效率 423
15.3.3 I/O效率 423
15.4 冗余编程 424
15.5 软件容错技术 424
15.5.1 容错软件 425
15.5.2 容错的一般方法 426
15.5.3 容错软件的设计过程 428
15.5.4 软件的容错系统结构 429
小结 431
综合练习十五 432
第四部分 质量与工程管理第16章 软件质量 435
16.1 软件质量概述 435
16.1.1 软件质量的定义 435
16.1.2 软件质量特性 435
16.1.3 软件质量特性之间的竞争 439
16.2 软件质量的度量和评价 441
16.2.1 软件质量的度量 441
16.2.2 软件质量度量的分类 441
16.2.3 软件质量评价 442
16.3 软件质量保证 444
16.3.1 软件质量保证的概述 444
16.3.2 软件质量保证原则 445
16.3.3 软件质量保证计划 445
16.3.4 软件质量保证的措施 446
16.3.5 软件质量管理小组 446
16.4 技术评审与审查 446
16.4.1 评审过程 447
16.4.2 选择参加评审的成员 447
16.4.3 评审的管理和组织 448
16.4.4 评审的方法 448
16.4.5 走查和审查 448
16.4.6 开发过程的评审 448
16.4.7 对评审的综合评价 450
16.5 软件的可靠性 450
小结 452
综合练习十六 452
第17章 软件测试 454
17.1 软件测试概述 454
17.1.1 软件测试的目的 454
17.1.2 软件测试的原则 455
17.2 测试方法 455
17.2.1 静态测试 455
17.2.2 动态测试 456
17.3 测试用例的设计 457
17.3.1 白盒技术 457
17.3.2 黑盒技术 461
17.4 测试过程 465
17.4.1 软件测试过程中的信息 465
17.4.2 软件测试的步骤与各开发阶段的关系 466
17.4.3 单元测试 466
17.4.4 集成测试 468
17.4.5 确认测试 470
17.5 调试 471
小结 472
综合练习十七 473
第18章 软件维护 474
18.1 软件维护概述 474
18.1.1 软件维护的定义 474
18.1.2 影响维护工作的因素 475
18.1.3 维护成本 475
18.2 软件可维护性 476
18.2.1 软件可维护性的定义 476
18.2.2 可维护性的度量 476
18.3 软件维护的特点 478
18.3.1 非结构化维护和结构化维护 478
18.3.2 维护的困难性 479
18.3.3 软件维护的费用 480
18.4 软件维护的实施 481
18.4.1 维护的组织 481
18.4.2 维护的流程 481
18.4.3 维护技术 483
18.4.4 维护的副作用 483
18.5 维护“老化代码” 484
18.6 逆向工程和再工程 485
18.6.1 预防性维护 485
18.6.2 逆向工程的元素 486
18.6.3 再工程中的重构技术 487
小结 490
综合练习十八 490
第19章 软件项目管理与计划 492
19.1 软件项目管理概述 492
19.1.1 软件管理的对象 492
19.1.2 软件开发中的资源 493
19.1.3 分解技术 494
19.2 项目管理过程 494
19.3 软件开发成本估算 495
19.3.1 软件开发成本估算方法 496
19.3.2 软件开发成本估算的经验模型 497
19.4 风险分析 499
19.4.1 风险识别 499
19.4.2 风险估算 500
19.4.3 风险评价 500
19.4.4 风险驾驭和监控 501
19.5 进度安排 503
19.5.1 软件开发小组人数与软件生产率 503
19.5.2 任务的确定与并行性 503
19.5.3 制定开发进度计划 504
19.5.4 进度安排的图形方法 505
19.5.5 项目的追踪和控制 506
19.6 软件项目的组织 507
19.6.1 软件项目管理的特点 507
19.6.2 软件项目组织的建立 508
19.6.3 人员配备 510
小结 512
综合练习十九 512
参考答案 514
参考文献 524