第1章 软件开发概述 1
1.1 程序与软件 1
1.1.1 从程序到软件 1
1.1.2 软件类型 2
1.1.3 程序设计与软件开发 2
1.2 软件生存周期 4
1.2.1 使用角度的软件生存周期 4
1.2.2 开发角度的软件生存周期 4
1.3 软件开发过程 6
1.3.1 瀑布式开发过程 7
1.3.2 增量开发模型 7
1.3.3 个体软件过程 8
1.4 敏捷开发 9
1.4.1 概述 10
1.4.2 Scrum方法 12
1.5 软件构造 13
1.5.1 有关概念 13
1.5.2 构造与开发过程 14
1.5.3 主要内容 15
1.5.4 软件构造的重要性 15
1.6 为什么不直接编写软件? 16
1.6.1 软件开发语言 16
1.6.2 编程工具与集成化开发环境 18
1.6.3 软件运行环境 19
1.6.4 软件开发的最佳实践 20
1.6.5 开发过程与管理 22
1.7 案例导读 23
1.8 思考与练习题 24
第2章 模块化软件构造 25
2.1 分解与模块化 26
2.1.1 分解的含义 26
2.1.2 模块化与结构化 28
2.2 数据结构与算法 29
2.2.1 数据结构与算法的关系 29
2.2.2 选择与设计数据结构 30
2.2.3 选择与设计算法 33
2.3 模块化设计理论初步 35
2.3.1 模块化原则 35
2.3.2 模块的内聚性 35
2.3.3 模块间的耦合性 36
2.4 测试程序 38
2.4.1 测试需求 39
2.4.2 测试设计与测试用例 40
2.5 调试程序 41
2.5.1 缺陷的相关术语 42
2.5.2 调试基础 42
2.6 案例分析与实践 43
2.6.1 案例程序的初始构造 43
2.6.2 无相同算式的基础构造 45
2.6.3 编程实现测试 47
2.7 讨论与提高 51
2.7.1 软件质量 51
2.7.2 软件测试的其他观点 52
2.7.3 测试设计 52
2.7.4 编程风格 57
2.8 思考与练习题 58
第3章 面向对象的软件构造 60
3.1 抽象与封装 60
3.1.1 模块产生与合成 60
3.1.2 抽象与封装 62
3.1.3 抽象数据类型 63
3.2 认识面向对象 64
3.2.1 设计类 64
3.2.2 设计操作 65
3.2.3 分类 66
3.3 面向对象的设计 67
3.3.1 面向对象的设计符号 68
3.3.2 案例设计一 69
3.3.3 案例设计二 72
3.4 调试的基本技术 79
3.4.1 单步调试源程序 80
3.4.2 检查/更改变量的值 81
3.4.3 设置监视点观察变量 81
3.4.4 上下移动调用栈 82
3.5 软件自动化测试 82
3.5.1 初识JUnit 82
3.5.2 编写JUnit测试代码 84
3.6 案例分析与实践 86
3.6.1 分析 86
3.6.2 构造 87
3.7 讨论与提高 89
3.7.1 对调试的进一步认识 89
3.7.2 设计原则与设计模式 90
3.7.3 面向对象的设计原则 92
3.8 思考与练习题 95
第4章 数据处理的软件构造 98
4.1 数据及其持久性 99
4.2 文件与输入/输出流 100
4.2.1 文件 100
4.2.2 输入/输出流 101
4.2.3 数据序列化 102
4.2.4 CSV格式的文本文件 103
4.3 编写健壮的程序 103
4.3.1 防御性编程 104
4.3.2 使用断言 107
4.4 字符串处理与正则表达式 108
4.5 程序中数据集的使用 111
4.5.1 算式基 111
4.5.2 表驱动编程 112
4.6 基于程序结构的测试 114
4.6.1 语句覆盖测试 115
4.6.2 程序控制流图 115
4.6.3 逻辑覆盖测试 116
4.6.4 路径覆盖测试 117
4.7 运用JUnit 119
4.7.1 异常测试 119
4.7.2 参数化测试 120
4.7.3 测试套件 121
4.7.4 JUnit的断言 122
4.7.5 JUnit使用指南 122
4.8 案例分析与实践 122
4.8.1 批量生成100以内算式的习题 124
4.8.2 批改练习并存储 125
4.8.3 算式基的构造与应用 127
4.9 讨论与提高 129
4.9.1 应用表驱动编程 129
4.9.2 使用文件还是数据库 131
4.9.3 契约式编程 131
4.10 思考与练习题 132
第5章 用户交互的软件构造 135
5.1 程序及其功能的使用 136
5.1.1 程序的两个观察视角 136
5.1.2 多个功能程序的整合 136
5.1.3 多个功能的组织与呈现 137
5.1.4 基于菜单式功能选择的用户交互 138
5.2 用户交互概述 143
5.2.1 基本概念 143
5.2.2 交互设备 143
5.2.3 交互风格 143
5.2.4 交互界面 144
5.2.5 交互设计的原则 145
5.3 用户交互的开发 146
5.3.1 交互设计基本过程 146
5.3.2 快速原型法 147
5.4 静态测试 148
5.4.1 程序的可用性与静态测试 148
5.4.2 桌面检查 148
5.4.3 代码走查 149
5.4.4 正式审查 149
5.4.5 同行评审 149
5.4.6 检查表 150
5.4.7 静态程序分析 150
5.5 软件集成与测试 151
5.5.1 驱动模块和桩模块 152
5.5.2 集成策略 153
5.5.3 回归测试 154
5.5.4 集成测试与策略 154
5.6 案例分析与实践 156
5.6.1 分析与设计 156
5.6.2 案例程序的菜单式用户交互的构造 157
5.6.3 循环语句的路径测试 163
5.7 讨论与提高 164
5.7.1 软件建模 164
5.7.2 基于模型的测试 165
5.7.3 执行函数名符号串的表驱动编程 167
5.7.4 持续集成 168
5.8 思考与练习题 169
第6章 软件重构与交付 171
6.1 代码重构 171
6.1.1 代码重构的案例研究 171
6.1.2 代码重构概述 182
6.2 软件交付 183
6.2.1 构建与打包 183
6.2.2 实现构建自动化的工具 184
6.2.3 Java程序的打包与交付 187
6.3 案例分析与实践 189
6.3.1 代码重构的案例分析 189
6.3.2 代码重构实践 190
6.3.3 提交案例程序 191
6.4 讨论与提高 192
6.4.1 测试层次 192
6.4.2 测试驱动开发 193
6.4.3 软件交付及其发展 200
6.5 思考与练习题 200
第7章 GUI软件构造 202
7.1 GUI简介 202
7.1.1 GUI发展轨迹 202
7.1.2 Java GUI的构造工具 202
7.2 GUI的基本元素与设计规范 203
7.2.1 GUI的基本元素 204
7.2.2 GUI基本设计规范 207
7.3 Java GUI设计模式 207
7.3.1 观察者模式 208
7.3.2 MVC模式 210
7.4 事件驱动编程 210
7.4.1 事件捕捉与处理 210
7.4.2 焦点事件和Tab顺序 212
7.4.3 实例讲解 212
7.5 案例分析与实践 215
7.5.1 探路的GUI构造任务 215
7.5.2 重构GUI构造任务 219
7.6 讨论与提高 226
7.6.1 GUI的设计原则 226
7.6.2 GUI的测试 228
7.7 思考与练习题 229
第8章 应用数据库 230
8.1 数据库概述 230
8.1.1 关系数据库 230
8.1.2 关系数据库的数据模型 234
8.2 结构化查询语言SQL 234
8.2.1 SQL概述 234
8.2.2 创建基本表的CREATE语句 235
8.2.3 插入元组的INSERT语句 237
8.2.4 删除元组的 DELETE语句 237
8.2.5 更新元组的UPDATE语句 238
8.2.6 选择元组的SELECT语句 238
8.3 数据库的开发过程 242
8.4 编程操作数据库 246
8.4.1 连接数据库 246
8.4.2 查询数据库 248
8.5 案例分析与实践 250
8.5.1 分析与设计 250
8.5.2 设计数据库 250
8.5.3 开发数据库应用程序 251
8.6 讨论与提高 255
8.6.1 事务与并发 255
8.6.2 使用存储过程 257
8.6.3 查询优化——消除不必要的循环 259
8.6.4 测试数据库 260
8.7 思考与练习题 261
第9章 基于复用的软件构造 263
9.1 软件复用 263
9.1.1 软件产品复用 264
9.1.2 基于复用的软件开发 265
9.1.3 程序库 266
9.2 设计模式 267
9.2.1 基本概念 267
9.2.2 基本设计模式目录 267
9.2.3 设计模式举例 267
9.3 框架 274
9.3.1 基本概念 274
9.3.2 框架和设计模式 276
9.3.3 框架开发 276
9.3.4 软件测试框架JUnit 277
9.4 案例分析与实践 277
9.4.1 生成Word格式的习题 277
9.4.2 口算习题练习得分的可视化展示 283
9.4.3 完整案例的软件构造 287
9.5 讨论与提高 287
9.5.1 案例的Web应用程序 287
9.5.2 Android应用框架 288
9.6 思考与练习题 288
参考文献 290