第一章 软件危机与软件工程 1
1.1 软件危机 1
1.1.1 什么是软件危机 1
1.1.2 产生软件危机的原因 2
1.1.3 解决软件危机的途径 5
1.2 软件工程 5
1.2.1 软件工程的基本原理 5
1.2.2 软件工程的传统途径 7
1.2.3 生命周期各阶段的基本任务 8
1.2.4 瀑布模型 12
1.3 技术审查和管理复审 13
1.3.1 进行审查和复审的必要性 13
1.3.2 技术审查的标准和方法 14
1.4 小结 15
习题一 16
第二章 可行性研究 18
2.1 可行性研究的任务 18
2.2 可行性研究的步骤 18
2.2.1 复查系统规模和目标 19
2.2.2 研究目前正在使用的系统 19
2.2.3 导出新系统的高层逻辑模型 19
2.2.4 重新定义问题 20
2.2.5 导出和评价供选择的解法 20
2.2.6 推荐行动方针 20
2.2.7 草拟开发计划 21
2.2.8 书写文档提交审查 21
2.3 系统流程图 21
2.3.1 符号 21
2.3.2 例子 22
2.3.3 分层 23
2.4 数据流图 23
2.4.1 符号 23
2.4.2 例子 25
2.4.3 命名 27
2.4.4 用途 28
2.5 数据字典 29
2.5.1 数据字典的内容 30
2.5.2 定义数据的方法 30
2.5.3 数据字典的用途 31
2.5.4 数据字典的实现 31
2.6 成本/效益分析 32
2.6.1成本估计 33
2.6.2 成本/效益分析的方法 34
2.7 小结 36
习题二 36
第三章 需求分析 38
3.1 需求分析的任务 38
3.1.1 确定对系统的综合要求 38
3.1.2 分析系统的数据要求 39
3.1.3 导出系统的逻辑模型 39
3.1.4 修正系统开发计划 39
3.1.5 开发原型系统 39
3.2 分析过程 40
3.2.1 沿数据流图回溯 40
3.2.2 用户复查 41
3.2.3 细化数据流图 41
3.2.4 修正开发计划 42
3.2.5 书写文档 42
3.2.6 审查和复审 43
3.3 概念模型和规范化 43
3.3.1 ER模型 43
3.3.2 范式 45
3.4 图形工具 45
3.4.1 层次方框图 45
3.4.2 Warnier图 46
3.4.3 IPO图 47
3.5 验证软件需求 48
3.5.1 从哪些方面验证软件需求的正确性 48
3.5.2 验证软件需求的方法 48
3.5.3 用于需求分析的软件工具 49
3.5.4 超高级语言和第四代语言 50
3.6 小结 51
习题三 52
第四章 总体设计 54
4.1 总体设计的过程 54
4.1.1 设想供选择的方案 54
4.1.2 选取合理的方案 55
4.1.3 推荐最佳方案 55
4.1.4 功能分解 55
4.1.5 设计软件结构 55
4.1.6 数据库设计 56
4.1.7 制定测试计划 56
4.1.8 书写文档 56
4.1.9 审查和复审 57
4.2 软件设计的概念和原理 57
4.2.1 模块化 57
4.2.2 抽象 58
4.2.3 信息隐蔽和局部化 59
4.2.4 模块独立 59
4.3 启发式规则 62
4.3.1 改进软件结构提高模块独立性 62
4.3.2 模块规模应该适中 62
4.3.3 深度、宽度、扇出和扇入都应适当 62
4.3.4 模块的作用域应该在控制域之内 63
4.3.5 力争降低模块接口的复杂程度 63
4.3.6 设计单入口单出口的模块 64
4.3.7 模块功能应该可以预测 64
4.4 图形工具 64
4.4.1 层次图和HIPO图 64
4.4.2 结构图 65
4.5 面向数据流的设计方法 66
4.5.1 概念 67
4.5.2 变换分析 68
4.5.3 事务分析 74
4.5.4 设计优化 75
4.6 小结 75
习题四 76
第五章 详细设计 80
5.1 结构程序设计 80
5.2 详细设计的工具 83
5.2.1 程序流程图 83
5.2.2 盒图(N_S图) 84
5.2.3 PAD图 84
5.2.4 判定表 86
5.2.5 判定树 87
5.2.6 过程设计语言(PDL) 87
5.2.7 模块开发文件夹 88
5.3 Jackson程序设计方法 88
5.3.1 Jackson图 89
5.3.2 改进的Jackson图 90
5.3.3 Jackson方法 90
5.4 Warnier程序设计方法 95
5.4.1 Warnier方法 95
5.4.2 Warnier方法的辅助技术 100
5.5 程序复杂程度的定量度量 104
5.5.1 McCabe方法 104
5.5.2 Halstead方法 106
5.6 小结 107
习题五 107
第六章 编码 113
6.1 程序设计语言 113
6.1.1 程序设计语言分类 113
6.1.2 程序设计语言的特点 114
6.1.3 选择一种语言 117
6.2 程序设计途径 118
6.2.1 写程序的风格 119
6.2.2 程序设计方法论 121
6.2.3 程序设计自动化 121
6.2.4 程序设计工具 122
6.3 小结 124
习题六 124
第七章 测试 126
7.1 基本概念 126
7.1.1 软件测试的目标 127
7.1.2 黑盒测试和白盒测试 127
7.1.3 软件测试的步骤 128
7.1.4 测试阶段的信息流 129
7.2 单元测试 130
7.2.1 单元测试考虑 130
7.2.2 单元测试过程 132
7.3 集成测试 134
7.3.1 自顶向下结合 135
7.3.2 自底向上结合 137
7.3.3 不同集成测试策略的比较 137
7.4 验收测试 138
7.4.1 验收测试的范围 138
7.4.2 软件配置复查 139
7.5 设计测试方案 139
7.5.1 逻辑覆盖 139
7.5.2 等价划分 143
7.5.3 边界值分析 146
7.5.4 错误推测 147
7.5.5 实用测试策略 148
7.6 调试 151
7.6.1 调试技术 151
7.6.1 调试策略 152
7.7 软件可靠性 154
7.7.1 基本概念 154
7.7.2 估算平均无故障时间的方法 155
7.7.3 程序正确性证明 157
7.8 日立预测法 158
7.8.1 测试完成率模型 158
7.8.2 错误发现率模型 159
7.8.3 使用日立预测法的步骤 159
7.9 自动测试工具 159
7.9.1 测试数据生成程序 160
7.9.2 动态分析程序 160
7.9.3 静态分析程序 160
7.9.4 文件比较程序 161
7.10 小结 161
习题七 162
第八章 维护 166
8.1 软件维护的定义 166
8.2 维护的特点 167
8.2.1 结构化维护与非结构化维护的对比 167
8.2.2 维护的代价 168
8.2.3 维护的问题 168
8.3 维护过程 169
8.3.1 维护组织 169
8.3.2 维护报告 169
8.3.3 维护的事件流 170
8.3.4 保存维护记录 171
8.3.5 评价维护活动 171
8.4 可维护性 172
8.4.1 决定软件可维护性的因素 172
8.4.2 文档 173
8.4.3 可维护性复审 174
8.5 小结 174
习题八 175
第九章 面向对象方法学引论 176
9.1 传统方法学的缺点 176
9.1.1 存在的问题 176
9.1.2 出现问题的原因 178
9.2 软件工程的新途径 180
9.2.1 快速原型法 180
9.2.2 面向对象方法学 182
9.2.3 两种新途径的结合 187
9.3 基本概念 188
9.3.1 对象 188
9.3.2 其他概念 191
9.4 面向对象建模 194
9.5 对象模型 196
9.5.1 表示类—&—对象的图形符号 196
9.5.2 表示结构的图形符号 197
9.5.3 例子 200
9.6 动态模型 201
9.6.1 术语 201
9.6.2 表示方法 202
9.6.3 例子 202
9.7 功能模型 203
9.7.1 表示方法 203
9.7.2 与其他两种模型的关系 203
9.8 小结 204
习题九 205
第十章 面向对象分析 206
10.1 面向对象分析的基本过程 206
10.1.1 概述 206
10.1.2 三个子模型与五个层次 207
10.2 需求陈述 208
1.2.1 书写要点 208
10.2.2 例子 209
10.3 建立对象模型 210
10.3.1 确定类—&—对象 210
10.3.2 确定关联 212
10.3.3 划分主题 216
10.3.4 确定属性 216
10.3.5 识别继承关系 219
10.3.6 反复修改 220
10.4 建立动态模型 221
10.4.1 编写脚本 222
10.4.2 设想用户界面 223
10.4.3 画事件跟踪图 224
10.4.4 画状态图 224
10.4.5 审查动态模型 227
10.5 建立功能模型 227
10.5.1 画出基本系统模型图 227
10.5.2 画出功能级数据流图 228
10.5.3 描述处理框功能 228
10.6 定义服务 229
10.6.1 常规行为 229
10.6.2 从事件导出的操作 229
10.6.3 与数据流图中处理框对应的操作 230
10.6.4 利用继承减少冗余操作 230
10.7 小结 230
习题十 230
第十一章 面向对象设计 232
11.1 面向对象设计的准则 232
11.1.1 模块化 233
11.1.2 抽象 233
11.1.3 信息隐藏 233
11.1.4 弱耦合 233
11.1.5 强内聚 234
11.1.6 可重用 234
11.2 启发规则 235
11.2.1 设计结果应该清晰易懂 235
11.2.2 一般一特殊结构的深度应适当 235
11.2.3 设计简单的类 235
11.2.4 使用简单的协议 236
11.2.5 使用简单的服务 236
11.2.6 把设计变动减至最小 236
11.3 软件重用 237
11.3.1 概念 237
11.3.2 软件重用的效果 237
11.3.3 软件重用技术 239
11.3.4 类构件 239
11.4 系统分解 241
11.4.1 子系统之间的两种交互方式 242
11.4.2 组织系统的两种方案 242
11.4.3 设计系统的拓扑结构 243
11.5 设计问题域子系统 243
11.5.1 调整需求 244
11.5.2 重用已有的类 244
11.5.3 把问题域类组合在一起 244
11.5.4 增添一般化类以建立协议 244
11.5.5 调整继承层次 245
11.5.6 ATM系统之例 247
11.6 设计人-机交互子系统 247
11.6.1 设计人-机交互界面的准则 247
11.6.2 设计人-机交互子系统的策略 248
11.7 设计任务管理子系统 250
11.7.1 分析并发性 250
11.7.2 设计任务管理子系统 250
11.8 设计数据管理子系统 252
11.8.1 选择数据存储管理模式 252
11.8.2 设计数据管理子系统 253
11.8.3 例子 255
11.9 设计类中的服务 255
11.9.1 确定类中应有的服务 255
11.9.2 设计实现服务的方法 256
11.10 设计关联 257
11.10.1 关联的遍历 257
11.10.2 实现单向关联 257
11.10.3 实现双向关联 257
11.10.4 链属性的实现 258
11.11 设计优化 258
11.11.1 确定优先级 258
11.11.2 提高效率的几项技术 259
11.11.3 调整继承关系 260
11.12 小结 262
习题十一 263
第十二章 面向对象实现 264
12.1 程序设计语言 264
12.1.1 面向对象的语言与非面向对象的语言 264
12.1.2 面向对象语言的技术特点 265
12.1.3 选择面向对象语言 268
12.2 程序设计风格 269
12.2.1 提高可重用性 269
12.2.2 提高可扩充性 272
12.2.3 提高健壮性 272
12.3 面向对象测试 273
12.4 小结 274
习题十二 275
第十三章 管理技术 276
13.1 成本估计 276
13.1.1 参数方程 276
13.1.2 标准值法 277
13.1.3 COCOMO模型 279
13.2 进度计划 282
13.2.1 Gantt图(横道图) 282
13.2.2 工程网络 283
13.2.3 估算进度 285
13.2.4 关键路径 286
13.2.5 机动时间 286
13.3 人员组织 288
13.3.1 程序设计小组的组织 289
13.3.2 主程序员组 289
13.4 质量保证 290
13.4.1 软件质量 290
13.4.2 质量保证 292
13.5 项目计划 293
13.5.1 项目计划的内容 293
13.5.2 项目报告 293
13.5.3变动控制 294
13.6 软件管理工具 295
13.7 小结 295
习题十三 295
附录A C++类库管理系统的分析与设计 297
A.1 面向对象分析 297
A.1.1 需求 297
A.1.2 建立对象模型 298
A.2 面向对象设计 299
A.2.1 设计类库结构 299
A.2.2 设计问题域子系统 300
A.2.3 设计人-机交互子系统 301
A.2.4 设计其他类 303
附录B 一个汉字行编辑程序的设计 305
B.1 设计规格说明 305
B.1.1 外部编辑命令 305
B.1.2 编辑命令 306
B.1.3 输出信息 306
B.2 概要设计 308
B.2.1 正文文件 308
B.2.2 两个工作模式 309
B.2.3 数据元素 310
B.2.4 过程 310
B.3 概要设计结果 311
B.4 详细设计 314
B.4.1 数据元素 314
B.4.2 控制数据元素 316
B.4.3 编辑过程 316
B.4.4 输入模式的过程 317
B.4.5 编辑模式的过程 318
B.5 详细设计结果 322
B.5.1 编辑程序的详细结构 322
B.5.2 为PASCAL伪码 323
B.5.3 实现编辑程序的算法 325
参考文献 352