图书简介:
目 录
第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
展开
随着计算机与互联网在经济与日常生活中的渗透,各种形态的软件层出不穷,如传统的桌面软件、浏览器-服务器结构的Web应用、软件和服务SaaS及移动应用程序APP等,国家和社会对各类软件的需求不断增加。特别是移动APP的出现,再次凸显了小型软件开发的重要性。
传统计算机学科的课程体系涵盖了大量软件开发的知识,如高级语言程序设计、数据结构与算法、数据库、计算机网络、操作系统、编译原理、软件工程等,传授方式理论化、知识碎片化。设置和讲授这些课程的主要目的,甚至有些课程的唯一目的不是提升编程解决问题的能力,而是理解和研制计算机及系统软件。软件工程课程的核心作用是培养软件开发的需求分析、软件建模及团队协作、项目管理等实际工作需要的综合能力,但其基本前提是要求学生具备软件构造能力,即通过设计、编码、单元测试、集成测试和调试的组合,创建有用的软件。现代软件开发方法包括极限编程、测试驱动开发等敏捷方法,突出特点是每个程序员都具有高超的软件开发能力。他们不仅熟练掌握多种类型的编程语言、框架与中间件、设计模式、软件设计和测试技术及数据处理、用户交互等方面的知识,还要熟悉开发流程,具备把实际问题转换成软件的分析、设计和构造能力。
本书旨在以案例为引导,通过集成化解决软件知识的碎片化,提升个人的软件构造能力,加快从程序编写到软件开发的转变,在孤立的基础课程与软件工程课程之间搭建桥梁。目标是把学生培养成能独立地综合运用技术、开发可用产品的高级程序员,再通过后续课程(如软件工程、综合课程设计和实习实训)培养成软件工程师。
主要内容与结构
本书内容涵盖IEEE计算机学会最新颁布的“软件工程知识体系”中“软件构造”知识域的95%以上,以及软件设计、软件测试和敏捷开发的最佳实践,主要包括:
? 软件构造的一般原理:模块化,信息隐藏,逐步求精,面向对象原则,增量迭代,软件复用,软件质量。
? 软件构造的常用技巧:表驱动编程,防御式编程,按意图编程,事件驱动编程,代码重构,框架与程序包,测试驱动开发。
? 软件设计:软件建模及其语言UML,E-R图,控制流图,状态图,设计原则,设计模式,契约式设计,面向对象,用户交互,数据库的设计与实现。
? 软件知识:软件过程,敏捷开发,最佳实践,面向对象编程,数据结构与算法的实现,数据库编程,软件复用。
? 软件构造的工作要素:编码及其规范,构造工具如IDE、Ant、JUnit。
? 软件构造的活动:设计,编码,调试,集成,测试(单元测试、回归测试、集成测试、静态测试)。
不同于传统软件教材按照开发活动或知识域的编写方式,本书以一个案例的演变,模拟不断变化的用户需求,以增量迭代的开发模式,编排这些教学内容。每章完成之后都有可用的、实现了用户要求功能或特性的程序。每章以案例故事引出构造问题,通过例子及设计和代码,讨论解决问题的基本原理、方法、技术等最佳实践,给出一个可操作的构造方案,问题的可选设计、扩展则作为提升或留作练习。
全书共9章。第1章概述软件与软件开发的基本概念,说明软件构造的含义及其在整个软件开发过程中的地位和作用,引入本书案例。第2~9章以增量迭代方式,将功能开发、用户交互及数据处理等知识,与软件开发的原理、技术和工具融合到设计、编码、调试及测试的构造过程。第2章说明模块化概念及其软件的构造技术。第3章描述面向对象的设计原则及其软件的构造技术。第4章学习容器类数据结构与文件的使用和构造。第5章学习用户界面与软件集成的基础,说明非图形菜单式用户交互的设计与实现。第6章学习重构技术、自动化的软件打包与交付。第7章深入学习图形用户界面软件的构造。第8章学习数据库的设计并在应用程序中使用数据库。第9章学习软件复用,使用框架和程序包构造软件。
作者借鉴了国内外计算机科学与软件工程领域的研究与教学成果。首先是主编在德国斯图加特大学计算机系进修期间,其导师路德维希教授于20世纪末在德国大学开创性地设立了“软件工程”示范专业。其次是最近10多年我国软件工程领域教育先行者的大胆探索和实践。最后,在学科和专业技术方面对本书产生巨大影响的是“个体软件过程PSP”、软件复用、敏捷开发方法及软件测试。在此对这些研究者和教育者表示崇高敬意和衷心感谢!
李劲华设计了本书的结构、内容及风格,编写了第1~6章、第9章内容及程序,审阅、校对了全书。周强编写了第7章内容及程序,陈宇编写了第8章内容及程序。
本书在编写过程中得到了学校、学院和电子工业出版社的大力支持,在此表示感谢!
本书谨代表作者们对软件构造的理解与探索。由于认识有限,加之时间仓促,难免存在疏漏和谬误,欢迎读者批评指正。可反馈给出版社(wangxq@phei.com.cn)或作者(E-mail:qduli@126.com,QQ:1487220149)。
使用建议
本书试图将软件构造的原理、原则、方法、技术、流程和技能整合,通过案例的展开由浅及深地学习。对知识的引入遵循足够、按需和渐进的原则。很多方面的知识(如调试、测试、设计、复用)分布在若干章节。读者最好把书中的知识通过案例串连起来,根据需要,可以跳过某个章节、提前看某个章节、需要时回过头来再看前面章节的内容或者查阅相关资料。建议读者一边思考案例问题,一边学习,一边动手实践。
就作者所知,目前国内外的课程体系中缺乏《软件构造》及相应的教材。本书可作为“软件构造”、“Java面向对象课程设计”的教材,也可以选作部分专业面向实用的“软件工程”的参考书。用于“软件工程课程设计”、“软件工程综合实训”等课程时,需补充软件建模、项目管理、团队合作、应用领域等方面的知识。
受篇幅限制,书中对介绍的最佳实践仅给出了关键的实现代码,建议授课教师根据课时选择性采纳或改写。本书提供配套电子课件、案例源程序、例子代码、教学参考方案等,请登录华信教育资源网(http: //www.hxedu.com.cn)注册下载或联系本书编辑(wangxq@phei.com.cn)索取。
本书面向计算机学科的本科学生,也适合学习软件开发的其他学生及爱好者。建议在第4~6学期使用。要求读者具备程序设计和面向对象编程基础。有些内容可在需要时适当补充。对软件工程专业,后续课程可以是:软件工程、软件设计、软件测试、软件项目管理等。对计算机及其他应用程序设计技术的专业,建议选修“软件工程”或概论/导论,学习团队开发大型软件的技术和方法。
关于案例
案例的目的是模仿实际工作,传授软件构造的基本知识、主要活动、技术与工具的综合运用能力。案例不宜太难,需求简单明了,使没有多少经验的学生容易理解,把重点放在软件的设计与构造,在一个学期就完成一个可运行的、有意义的程序。设计的案例产生3000行左右的代码,计划持续3个月、60人时的工作量。案例开发不指定某种具体编辑语言和软件过程。
案例是开发一个“50道100以内的加减法口算习题”的程序。具体要求模拟现实生活,在用户使用程序的过程中,不断提出新的要求和功能。
案例看似简单,却可以有多种理解方式及扩展。例如,100以内的运算数可包含100或0;可将运算数值扩大到500、1000;算式可以是至多包含两个运算符的加减法算术运算,还可以是至多包含4个运算符的四则算术运算。每章的提升与课后练习对案例提出了一些变化、延伸及构造,满足不同层次的教学要求。
本书程序主要采用Java语言。除个别情况外,书中不提供完整代码,意在培养学生独立解决问题的能力,构造不同的、可运行的软件。
教学方案
本书面向普通高校本科学生,提供3种教学参考方案,任课教师可更根据需要调整。例如,如果面向对象程序设计的基础较弱,可减少第2章学时;如果仅用GUI界面的用户交互,可减少第5章学时;如果学生程序设计能力较强,可减少第5章之前的实验,增加第9章学时。
(1)基本教学方案(方案1),72学时(18学时×5周),讲课38学时,实验34学时。
章 节 基 本 内 容 讲课 实验内容 实验
1 掌握1.3节、1.5节和1.6节,理解1.1节、1.2节和1.4节,阅读案例1.7节 掌握程序与软件的异同、影响软件开发的因素、典型的软件开发过程、软件构造,理解软件的相关概念、软件生存周期和敏捷开发,阅读案例 3
2 掌握2.2~2.4节、2.7.3节、2.7.4节,理解2.1节、2.5节、2.7.1节,阅读与实践2.6节,其余了解 掌握模块化设计、数据结构与算法的选择、测试设计、编码风格,理解模块化概念、测试概念、调试概念,阅读案例,其余了解 4 构造1、2 4
3 掌握3.2~3.5节,理解3.1节、3.7.2节、3.7.3节,阅读与实践3.6节,其余了解 掌握基本的面向对象设计技术、调试技术、测试框架,理解抽象、封装、ADT、面向对象的概念、设计模式、设计原则,阅读案例,其余了解 5 构造3 4
4 掌握4.2~4.4节、4.5.2节、4.6节、4.7.1~4.7.3节,理解4.1节、4.5.1节、4.7.4节,阅读与实践4.8节,其余了解 掌握文件/输入/输出流的编程、防御性编程、正则表达式、表驱动编程、白盒测试设计、JUnit其他测试,理解数据持久性、算式基及测试断言,阅读案例,其余了解 5 构造4、5、6 6
5 掌握5.1.4节、5.3节、5.4.3节、5.5节、5.7.1节、5.7.2节,理解5.1节其他、5.2节、5.4节,阅读与实践5.6节,其他了解 掌握菜单式用户交互的设计与编程、原型法、代码走查、静态分析工具、软件集成与测试、基于状态图的测试,理解用户交互的原则和开发过程、回归测试、静态测试,阅读案例,其余了解 5 构造7 4
6 掌握6.1.1节、6.2.2节、6.2.3节,理解6.1.2节、6.2.1节,阅读与实践6.3节、6.4.2节,其余了解 掌握基本的重构技术和过程、Java程序打包/交付,理解代码重构、软件交付,阅读案例和TDD,其余了解 4 构造8 4
7 理解7.1节、7.3节,掌握7.2节和7.4节,阅读与实践7.5节,了解7.6节 理解GUI的基本知识,掌握GUI的基本元素、设计规范及本书使用的Java GUI设计工具,掌握事件驱动编程方式,阅读案例,其余了解 4 构造9 4
8 理解8.1节、8.3节,掌握8.2节、8.4节、8.6.1~8.6.3节,阅读与实践8.5节,了解8.6.4节 理解数据库系统的结构,了解数据库的设计知识,掌握SQL的5种操作语句及数据库查询操作,掌握应用程序与数据库的连接和编程,阅读案例,其余了解 5 构造10 3
9 掌握9.3节,理解9.1节、9.2节、9.4节,阅读与实践9.5节,其余了解 掌握设计模式的编码实现、可视化显示、基于模板的文档产生,理解软件复用的概念、方式,阅读案例,其余了解 3 构造11、12、13 5
合计 38 34
(2)面向对象技术的教学方案(方案2),54学时(18学时×3周),讲课30学时,实验24学时。
面向对象技术的教学方案
(3)Java面向对象课程设计(方案3),36学时(18学时×2周),讲课18学时,实验18学时。
Java面向对象课程设计
展开