-
第一章软件开发概述
从不同方面深入理解程序及其开发。首先,认识程序和软件的区别,了解不同的软件分类。其次,理解小程序的编写与大型软件的开发。理解软件的工程特征:从编写正确的程序,到开发高质量的软件;从注重编程语言、算法设计、数据结构等独立知识,到综合应用软件开发的原则、方法、技术和工具;从工艺到工程——分离软件开发的关注点,把它分成若干可以控制、可以管理的阶段或相关活动,以及这些活动的不同组合方式。最后,深入理解软件构造,从编辑-编译-运行的程序编写,到设计-实现-测试的软件构造。
-
●1.1程序与软件
理解软件,对比程序,软件的分类
视频含1.2节 -
●1.2软件生存周期
了解软件生存期,用户角度和程序员角度的软件生成期
视频含在1.1节 -
●1.3软件开发过程
把软件开发工作分成若干都有特定结果的步骤或活动,按照一定的方式开展软件活动,从而形成了软件过程。
根据每个活动的内容、活动的执行顺序、是否多次执行、活动参与者(特别地,是否包含客户/用户)、使用何种工具、采取哪些管理、活动产出等,出现了若干不同的软件开发过程。
本节概述基本的软件开发过程。 -
●1.4敏捷开发
敏捷开发是应对快速变化的需求的一种软件开发能力。它以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。
-
●1.5软件构造
“软件构造”指的是通过编码、验证、单元测试、集成测试和调试的组合,详细地创建可工作的、有意义的软件。软件构造知识域与所有其他知识域相关,特别与软件设计、软件测试联系最为密切,因为软件构造过程本身包含了重要的软件设计和软件测试活动。
-
●1.6为什么不直接编写软件
要完成一个对客户有价值的、可运行的软件,即使是一个规模不大的软件,开发者也要考虑技术、流程和管理等方面的因素。
-
●1.7案例导读
本书以问题为导向,通过一个完整案例的开发,学习构造技术,同时加入较小的例子补充说明相关知识。贯穿全书的案例名称——50道100以内的加减法口算习题。
案例开发工具Eclipse的简单使用说明
-
第二章模块化软件构造
讨论函数级的软件构造技术。学习如何运用模块化技术进行分解和细化,设计由函数组成的、具有一定结构的程序来分离不同的专注点,管理和控制程序的复杂性,使其便于维护、更新和扩展。本章还包括如何针对实际问题设计和选择数据结构;初步学习如何编程实现软件测试,如何调试程序;理解好程序不仅仅是正确的,还有易维护、健壮等其他性质,学习良好的编程风格。
-
●2.1分解与模块化
理解分而治之的策略:①把问题分成两个或多个更小的问题;②分别解决每个小问题;③然后把各个小问题的解答结合起来,即可得到原问题的解答。通过分解,人们把一个大的、错综复杂的问题划分成一个一个相对简单、独立的问题,运用合适的方法分别解决。
-
●2.2数据结构与算法
计算机算法与数据结构密切相关,算法依赖于具体的数据结构,数据结构直接关系到算法的选择和效率。
-
●2.3模块化设计理论初步
设计好了数据结构与相应的算法,就要运用模块化设计的原则,将其整合在结构良好的程序中实现。
-
●2.4测试程序
编写的程序是否正确,需要明确说明。初步理解软件测试:使用人工或自动手段来运行或测定某个系统的过程,其目的在于检测它是否满足规定的需求或者是否弄清预期结果与实际结果之间的差别。测试是对程序或系统能否完成特定任务建立信心的过程。软件测试是说明程序是否正确的最基本的一种技术手段。
-
●2.5调试程序
初步理解什么是debug,了解相关的概念和术语
-
●2.6案例分析与实践
对故事1程序的构造程序1:生成50道100以内加法/减法算式的习题,并输出。
由此开始增量迭代构造案例: 每一章都从一个用户“故事”(需求)开始:先编写一个简单、直接的代码实现,然后学习相关的方法、技术和工具,依据理论分析不足,接着运用理论修改甚至重写代码。 -
●2.7讨论与提高
认识软件质量:什么是好的程序、软件;、
软件测试的其它观点;
深入理解测试及测试的设计,介绍等价类测试和边界值分析测试。
如何呈现程序代码
-
第三章面向对象的软件构造
开始学习如何运用面向对象的软件构造技术管理和控制软件的复杂性。继续探讨分解和模块化,学习把抽象和封装的原则表示成数学模型——抽象数据类型,用面向对象的方法实现。通过面向对象的设计,UML的类图,理解软件设计及其原则和设计模式。学习调试技术和工具,并初步学习自动化测试框架。
-
●3.1抽象与封装
抽象是指对一个过程或一件事物的某些细节有目的地隐藏,以便把其他方面、细节或结构表达得更加清楚。抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征。进行抽象的主要目的是希望通过把相关的属性和其他不相关的属性分开,分离关注点。抽象是处理复杂问题的一个手段。抽象是分离对象特性、限制对它们在当前环境关注的一个机制。抽象的使用者不必理解所有细节就可以使用对象,而仅仅理解对当前任务或问题的相关。
-
●3.2认识面向对象
面向对象技术包括软件开发方法和程序设计语言,在传统的面向过程的程序设计语言、结构化设计方法的基础上做出了改进,并在软件开发、编程语言方面提出了新的理论和实践。
本节初步认识面向对象技术,不涉及语言。 -
●3.3面向对象的设计
用面向对象方法设计案例,第一次引入UML-统一建模语言来描述面向对象的设计。本节分为两部分:
设计一,单纯使用类
设计二,使用面向对象中类的继承关系 -
●3.4调试的基本技术
介绍debug的基本技术
-
●3.5软件自动化测试
初步介绍开源软件测试框架JUnit,理解自动化测试。JUnit已经成为现代软件开发方法和工具的核心组成,如极限编程、测试驱动开发、代码重构、Eclipse。JUnit是Java语言的测试框架,实质上就是包含测试用例、测试执行、测试记录等一组Java类和接口。程序员编码继承其中的类或实现其中的接口、抽象类,实现应用程序的测试。JUnit由于简单、实用、易用,特别适合自动化的单元测试和回归测试。
本节简单介绍Junit的初步使用。 -
●3.6案例分析与实践
根据本章的设计,实现案例的面向对象程序。由于整个程序比较大,依据程序结构,任务依然分成两个子任务完成。
构造任务3.1:实现BinaryOperation及其子类。
构造任务3.2:实现Exercise和ExerciseSheet。
程序构造过程遵循分而治之、循序渐进的策略。案例目前设计的模块化程度比较高,特别是两个子任务内部的类联系紧密,但是两个子任务之间的类的耦合性很低,只有Exercise包含了类BinaryOperation,两个子任务内的其他类之间相互独立。 -
●3.7讨论与提高
深入概括地讨论调试,并与测试进行比较。
继续学习面向对象的其它基本原则,初步学习设计模式及其原则的实现方式。
-
第四章数据处理的软件构造
本章讨论案例中数据处理的问题:按需选择、使用数据及数据持久性。重点是如何把算式和习题从程序变量的值转化为可共享的、持久性的文件数据,学习文件的产生、存储和读取操作,学习一个特殊的文本文件格式CSV。编程方面,学习表驱动编程模式和防御性编程。测试方面,学习白盒测试的基本技术,继续学习JUnit的其他测试方法。
-
●4.1数据及其持久化
存储在程序中的变量或数组中的数据是临时的,只有当程序在内存中运行时才能使用它们。变量离开了作用域或者程序停止了,数据就丢失了。计算机使用文件长期保留大量的数据,即使创建数据的程序停止了,数据还是存在。文件处理是编程语言支持应用程序存储和处理大量持久数据的一个最重要能力。Java等编程语言通常都提供了文件处理和输入/输出流的功能。
-
●4.2文件与输入/输出流
案例的持久性问题,本质上是程序之间的一种交互,即一个程序或模块产生数据,另一个程序或模块读取并使用这些数据。程序通过多种方式输入/输出。例如,人们用键盘向程序输入数据,程序通过屏幕显示运行结果。程序之间可以通过文件实现输入/输出。在操作系统中,文件是组织和管理数据的基本单位,也是对物理输入/输出设备的抽象,使用者不必关心文件及其内容的存取方式、存储位置、结束标志等。
-
●4.3编写健壮的程序
健壮性(robustness)是指程序对于要求之外的输入进行判断并处理、使程序保持运行状态,即使这有时可能导致不准确的结果。程序的正确性指的是程序绝不产生不准确的结果。有时更希望程序健壮,例如,互联网搜索程序,人们期望一次检索有点什么结果——即使显示的结果不准确,也比程序没有任何反应或崩溃要强。本节将提供学习健壮性编程的一些最佳实践。
-
●4.4字符串处理与正则表达式
在操作文本文件时,读取的数据都是字符串的形式。通常的编程语言都有把基本类型的数据转换为字符串的内置机制,提供了大量的字符串操作,如查找一个字符、查找一个字串、置换一个字串、合并两个字串、字符串复制等。可以使用编程语言提供的基本的字符串操作完成数据的构造。现代编程语言提供了更丰富的字符串处理的库,其中重要而又易用的是正则表达式。本节重点学习处理字符串的正则表达式。
-
●4.5程序中数据集的使用
截至目前,案例的算式及习题都是在使用时由程序随机产生的,即数据是按需生成和使用的。而且,产生的算式、习题数据都以程序变量的值出现在计算机的内存中,一旦程序结束,数据立即丢失。本节解决两个问题:效率和复用。由此引入了我们发明的算式基的概念和操作。
-
●4.6基于程序结构的测试
基于结构的测试又称白盒测试,分为两部分。
一、基于语句的测试,布尔表达式或条件的测试
二、基于程序执行路径的测试 -
●4.7运用Junit
继续学习自动化测试工具Junit: 参数测试、异常测试和测试套件
-
●4.8案例分析与实践
增量迭代实现案例。
1.随机生成多套习题,保存起来。
增加操作:在前一章有关算式类的基础上,把产生的习题以CSV的格式存储起来,对应地增加一个操作把CSV格式的习题读入程序。这个操作可以分配在类Exercise或ExerciseSheet中,方法可以是writeCSVExercise(File aFile),或writeCSVExercise(Exercise anExercise,File aFile)。较好的方式是在Exercise中存储CSV格式习题,读取方法是Exercise readCSVExercise(File aFile)。
注意:仔细考虑和设计存储习题的文件命名。
2.增加类,完成对练习的批改。
之前做习题的练习过程依旧是在打印出的纸张上填写每道算式的结果。现在,新增操作:①有人把练习结果输入电脑、存成文件;②案例程序读入这个文件及相应的习题,然后比对每个算式的结果,产生练习的统计,如正确的、错误的算式结果等。 -
●4.9讨论与提高
从算式基引入,学习一项编程技术:表驱动编程。继续了解契约式设计的思想,对比文件和数据库、为第8章铺垫
-
第五章用户交互的软件构造
本章学习以键盘为输入设备、以屏幕为输出设备的用户交互界面的软件构造,包括如何把多个模块实现的功能整合到一个程序的软件集成。通过交互式语音应答系统的层次结构的菜单交互界面的构造,学习用户功能与实现代码的关联。初步学习用户交互的基本概念、基本原理、设计原则及常用的静态测试方法。学习软件集成及其相关的集成测试、回归测试、基于模型的测试技术。完成案例基于菜单的用户交互的构造。
-
●5.1程序及其功能的使用
理解程序的两个认知角度:程序员和用户;如何整合多个功能/函数的程序,并友好地呈现给用户使用。
-
●5.2用户交互概述
机交互的目的是开发及提高计算机相关系统的安全性、效用、有效性、高效性和可用性。与人机交互的概念类似的还有交互设计,它定义了交互系统的结构和行为,交互设计人员致力于改善人与产品或人与服务之间的关系,如计算机、移动设备及与其他物理交互设备等。软件的人机交互性包括易学习性、易使用性等极大地影响了软件的使用,交互设计等同于交互式软件系统的设计,即人机交互。
-
●5.3用户交互的开发
用户界面与交互方式的好坏都是由最终用户凭感性决定的。符合用户习惯、能快速实现要完成的任务、不让他们花费时间去猜测软件的功能或使用等,就容易得到用户的认可。近年来,出现的以用户体验为中心的设计,还在追求应用软件的好玩、新颖、探究等方面的用户体验。让用户参与设计或开发已经成为现代软件开发方法的基本原则。以用户为中心的开发方法,指的是以真实用户和用户目标作为产品开发的驱动力而不仅仅以技术为驱动力。设计良好的系统应能充分利用人们的技能和判断力,应同用户的工作直接相关,而且应支持用户,而不是限制用户。
-
●5.4静态测试
概要介绍静态测试,包括桌面检查、代码走查、正式审查、同行评审以及静态程序分析
-
●5.5软件集成与测试
随着程序功能的不断扩展,实现各个功能的模块也在不断增多,需要把这些模块、数据、用户交互界面等模块组织起来,构建成一个完整的应用程序,这个过程称为软件集成。传统的软件工程开发活动中没有明确定义的集成阶段或活动,与之相对应的是集成测试。软件集成主要体现并依赖于软件设计或软件架构设计,明确组成软件的各个模块的功能和接口。只要严格按照要求开发,模块之间就能通过良好定义的接口整合在一起,构成一个完整的软件系统。
-
●5.6案例分析与实践
继续案例的增量迭代构造,构造任务7——案例程序的菜单式用户交互的构造,划分如下。
构造任务7.1:构造用户交互的菜单框架原型。完成菜单的设计与构造,实现子菜单、菜单之间的转换。
构造任务7.2:完成在线练习。这是本章新增的功能,需要设计和构造,并集成到菜单框架。
构造任务7.3:完成整个程序。逐个实现菜单中其他子菜单及其中的桩模块,完成整个程序。 -
●5.7讨论与提高
概要讨论本章相关知识:软件建模、基于建模的软件测试,持续集成
-
第六章软件重构与交付
通过例子学习改善代码质量的重构技术和方法,学习软件打包和交付一个完整的软件,以及自动化软件构建的技术。作为提升,通过例子学习一种新型的软件开发方式——测试驱动开发,并了解软件交付的其他方式与基本活动。
-
●6.1代码重构
增量迭代的开发方式不断地在增加编写的代码,由于是边思考、边设计、边构造,可能会造成许多模块有重复的代码片段或者在一个模块中临时命名了变量等,使得代码欠规范,结构不清晰。
在完成构造、交付代码前改进代码质量,有助于今后的软件维护和更新。代码重构是增量迭代开发不可或缺的技术,已经成为现代软件开发的基本技术,并在很多常用的IDE中成为标准模块。代码重构就是在不改变软件外部行为的前提下改善它的内部结构。
本节以一个较小的例子说明代码重构的基本概念和方法。 -
●6.2软件交付
如何把在开发者机器上开发的应用程序安装到用户的机器上,交付给用户去运行。按照软件生命周期模型,软件开发之后的阶段是维护。如何平滑地连接这两个阶段,把开发的软件投入市场或提供给用户使用。本节将概括地介绍与这个阶段相关的一些术语及活动。
-
●6.3案例分析与实践
继续案例的增量迭代开发,完成两个比较大的构造任务。
构造任务8.1:重构案例程序。
构造任务8.2:案例程序的打包与交付。 -
●6.4讨论与提高
为了能系统、全面地测试软件,测试可以先从程序的基本单元开始,然后按照一定方式——如软件集成的顺序,逐步测试集成后的程序,直至测试完成整个软件。按照软件的构成,测试可以划分为4个阶段或层次:单元测试、集成测试、系统测试和验收测试。
用一个例子说明测试驱动开发。
-
第七章GUI软件构造
继续学习交互式软件的构造。首先认识GUI及其基本元素,理解GUI的基本设计原则,学习GUI的设计模式、在GUI开发中广泛运用的编程范式——事件驱动编程,通过例子学习使用工具构造GUI软件。作为提升,深入讨论GUI的其他设计原则,探讨GUI测试方法。
-
●7.1GUI简介
简单介绍了Java GUI实现的技术和工具
-
●7.2GUI的基本元素与设计规范
学习Java GUI的基本元素以及GUI基本设计规范
-
●7.3Java GUI设计模式
学习实现Java GUI的设计模式
-
●7.4事件驱动编程
用户交互程序——不论是基于字符或命令行的,还是基于GUI的,运行都不再按照程序预定的顺序,而是由用户与系统的交互及系统状态等决定的。移动鼠标、按下鼠标、敲击键盘、输入数字或文本及在手机上滑动,甚至语音操作应用程序等属于用户交互的动作,
本节我们将学习一种编程范式——事件驱动编程,它主要用于GUI和其他为响应用户的交互做出特定动作的应用程序。事件驱动编程可以理解为实现MVC模式的一种技术方案。 -
●7.5案例分析与实践
继续增量实现案例,将GUI口算练习软件的构造任务分成两阶段。
构造任务9.1:实现基本功能,界面上共显示20道加法练习(4行,每行5道),用户可以单击按钮更换一批练习题。用户完成后提交答案,显示判题结果。
构造任务9.2:扩充功能,练习题的数量(20的倍数)、练习题的类型(加法、减法、混合)均可配置,界面上每页显示20道练习题;题目可以存到外设(硬盘)或者从外设载入;用户可以前后翻页作答,可以单击按钮更换一批练习题;用户完成、提交答案后,屏幕显示判题结果。 -
●7.6讨论与提高
学习GUI的其他原则及测试
-
第八章应用数据库
讨论软件构造中数据库的使用。介绍关系数据库的相关知识及结构化查询语言SQL,学习如何创建数据库、连接数据库、查询数据库;学习数据库及应用软件的开发,熟练掌握数据库的增、删、改、查等操作方法,以及如何在应用程序中操作数据库。还介绍数据库的深入应用。
-
●8.1数据库概述
数据库领域中最常见的数据模型有:层次模型、网状模型、关系模型、面向对象模型、对象关系模型。其中,关系数据库系统是支持关系模型的数据库系统。按照数据模型的三个要素,关系模型由关系数据结构、关系操作集合和关系完整性约束三部分组成。本节简要介绍关系数据库。
-
●8.2结构化查询语言
用户通过数据库中的程序设计语言SQL(Structured Query Language,结构化查询语言)定义和操作外模式中的视图和基本表。SQL是关系数据库的标准语言,被绝大多数关系数据库管理系统所支持。本节简要学习基本的SQL语句。
-
●8.3数据库的开发过程
数据库的开发是软件开发的一部分,但是由于其特点,不同于通常的软件开发。本节学习数据库系统的开发及其阶段。
-
●8.4编程操作数据库
C、Java、Python等通用的高级程序设计语言不能直接创建、访问和操作数据库,这些是由专用语言SQL完成的。
本节学习通过JDBC在应用程序和数据库之间建立连接,使用JDBC提供的API操作数据库。在Java应用程序中使用JDBC操作数据库的主要步骤是:
1)与数据库建立连接;
2)向数据库发送SQL语句,需要java.sql包的支持;
3)处理SQL语句返回的结果。 -
●8.5案例分析与实践
本小节继续案例的增量迭代构造,使用数据库及SQL。案例构造分为两个任务:
构造任务10.1:设计数据库。完善数据库模式,将前期生成的题目存放在数据库中。
构造任务10.2:应用数据库。编程连接数据库,在应用程序中使用数据库。
一些需要考虑的问题如下。
(1)数据库模式设计:需要考虑在数据库中要设计多少个基本表,表和表之间的关系是什么。在前期设计中,已经随机生成了口算题目,如何将这些题目导入到数据库中?
(2)数据库的边界:数据库的边界指的是什么问题需要DBMS完成,什么问题需要编程完成。例如,在导入口算题目后,是需要DBMS给出答案,还是要编程来验证计算结果。
(3)连接、使用数据库:不同的编程语言,数据库的访问方法也不相同。如果采用Java语言,如何使用JDBC?连接了数据库之后,如何实现增、删、改、查等相关操作。
-
第九章基于复用的软件构造
首先学习软件复用的基本概念、分类及开发方式。然后学习三种复用:程序库、设计模式和框架。通过具体的编程实现学习三种设计模式;通过分析Junit学习框架与应用;通过两个开源软件API、对案例实现基于程序库的复用开发。最后,简介开发案例其他形态软件的相关框架。
-
●9.1软件复用
学习软件复用:含义、类型、基于复用的软件开发
-
●9.2设计模式
模式设计(Design Pattern)是对给定环境下反复出现问题的一个通用的、可复用的解决方案。它是可以在很多不同场合用以解决问题的一种描述或样板。模式是程序员在设计一个软件或系统时解决共同问题最佳实践的正式描述。在软件领域,模式最初针对的是面向对象软件的编程和软件。面向对象的设计模式表示类或对象之间的关系与交互,没有说明涉及的最终应用软件的类或对象。一个设计模式不是一个可以直接转换成代码的完成的设计。
-
●9.3框架
框架是整个或部分系统的可复用设计,表现为一组抽象构件及构件实例间交互的方法。框架是可被应用开发者定制的应用骨架。可以说,一个框架是一个可复用的设计构件,它规定了应用的体系结构,阐明了整个设计、协作构件之间的依赖关系、责任分配和控制流程,表现为一组抽象类及其实例之间协作的方法,它为构件复用提供了上下文关系。
-
●9.4案例分析与实践
继续案例的增量构造,运用第三方复用件分别完成,
构造任务11是使用FreeMarker生成Word格式的习题。
构造任务12是使用FreeChar可视化展示口算习题练习的得分。
构造任务13包括一组软件构造。根据不同的用户需求,可以为本书案例程序提供不同配置的版本。 -
●9.5讨论与提高
简单提出案例的未来版本:Web软件和app