第一部分: 选择题知识点小结
1,软件,软件危机,软件工程的定义
P3 软件是依附在硬件上面的程序、数据和文档的集合,是指挥控制计算机系统(包括硬件和软件)工作的神经中枢。通常,软件有以下定义:软件 = 程序 + 数据 + 文档
软件文档分为开发文档和管理文档两大类。开发文档主要由项目组书写,用于指导软件开发与维护;管理文档主要由软件工程管理部门书写,用于指导软件管理和决策。软件工程规定:文档必须指挥程序,而决不允许程序指挥文档;文档与程序必须保持高度一致,而决不允许程序脱离开文档。
P4软件工程来源于软件危机,即先有软件危机,后有软件工程。所谓软件危机,就是在软件开发和维护过程中所遇到一系列难以控制的问题,包括软件开发的成本增大、进度延期、维护困难和质量得不到保障。
软件工程是研究软件开发和软件管理的一门工程学科。这里,一是强调开发,二是强调管理,三是强调工程,四是强调学科。
2,可行性研究目的及几个方面: P53
可行性分析是立项的前提,立项是可行性分析的后果。立项和合同的区别:立项有两个分析1.投资2.经济效应;合同只有一个分析经济分析。 3,画分层DFD图的基本原则P128
数据守恒 所谓数据守恒是指加工的输入输出数据流是否匹配,即每一个加工既有输入数据流又有输出数据流。或者说一个加工至少有一个输入数据流,一个输出数据流。 加工分解的原则 自然性:概念上合理、清晰;
均匀性:理想的分解是将一个问题分解成大小均匀的几个部分;
分解度:一般每一个加工每次分解最多不要超过7个子加工,分解应分解到基本加工为止。
子图与父图的“平衡” 父图中某个加工的输入输出数据流应该同相应的子图的输入输出相同(相对应),分层数据流图的这种特点称为子图与父图“平衡”。
合理使用文件 当文件作为某些加工之间的交界面时,文件必须画出来,一旦文件作为数据流图中的一个独立成份画出来了,那么他同其他成份之间的联系也应同时表达出来。 画分层DFD图的方法: “先全局后局部,先整体后细节,先抽象后具体”
通常可将这种分层的DFD图,分为顶层、中间层、底层。 具体步骤: 1。先确定系统范围,画出顶层的DFD图。
2。逐层分解顶层DFD图,获得若干中间层DFD图。 3。画出底层的DFD图。
顶层图说明了系统的边界,即系统的输入和输出数据流,顶层图只有一张。底层图由一些不能再分解的加工组成,这些加工都已足够简单,称为基本加工。在顶层和底层之间的是中间层。中间层的数据流图描述了某个加工的分解,而它的组成部分又要进一步分解。
画各层DFD图时,“由外向内”。 4,软件设计原理p121
1)设计方法概论:软件设计的输入是《需求规格说明书》,输出是《概要设计说明书》和《详细设计说明书》。概要设计:概要设计,一是要覆盖《需求规格说明书》的全部内容,二是要作为指导详细设计的依据。概要设计注重于宏观上和框架上的设计,它是软件系统的总体结构设计、全局数据库(包括数据结构)设计、外部接口设计、功能部件分配设计、部件之间的接口设计。概要设计又称为架构设计。详细设计,一是要覆盖《概要设计说明书》的全部内容,二是要作为指导程序设计的依据。详细设计注重于微观上和框架内的设计,它是各子系统的公用部件实现设计、专用模块实现设计、存储过程实现设计、触发器实现设计、外部接口实现设计、部门角色授权设计、其他详细设计等。在设计之前要确定命名规范。包括系统命名规范,模块命名规范,构件命名规范,变量命名规范,以及表名、字段名、索引名、视图名、存储过程名的命名规范等。软件设计时,一方面要善于将需求规格说明书中的冗余去掉,将公用功能提炼出来,并将它设计为构件,标准化后加入到公司构件库中。另一方面,还要尽量调用公司构件库中已有的构件。按照“五个面向理论”,概要设计主要方法是面向数据,详细设计和程序设计主要方法是面向对象。所有的详细设计都是面向模块(部件/构件)的,不是面向组织结构或部门单位的。一个组织或单位,根据角色的不同授权,可以挂上不同的模块或部件。
2)软件设计原理
原理1:抽象 (1) 控制抽象:面向过程设计 ,通过控制抽象(控制流程和接口),对软件进行分解,达
到降低软件复杂度的目的。面向对象设计 ,通过数据抽象和控制抽象,实现使数据和控制溶为一体,构成一个完整的对象。(2) 过程抽象:将数据处理抽象成函数或方法,获得最终的执行结果,而不必去关心它们的内部实现细节。 (3) 数据抽象:在数据库建模和面向对象建模时,使用数据抽象,设计出数据库的表及字段,或设计出类及类的属性。
原理2:分解 (1) 在架构设计中,将软件系统分解为子系统和模块; (2) 在详细设计中,将子系统和模块分解成类和接口。 原理3:低耦合高内聚
原理4:封装:封装是将信息隐藏在一个实体中,使其内部细节对外部不可见。封装是实现“低耦合高内聚”的技术手段之一。要进行正确的封装,必须遵守下列原则:
(1). 实体间相互隐藏内部实现; (2). 尽量减少全局的共享数据。 原理5:接口和实现分离 3)详细设计的任务与步骤1. 基本任务: 回答的关键问题:“怎样具体地实现这个系统”。主要任务是设计出程序的“蓝图”,供程序员日后根据这个蓝图编写出实际的程序代码。
2. 基本步骤 a. 确定模块如何实现 b. 编写详细设计说明书 c. 制定单元测试计划d. 评审详细设计 4) 面向对象详细设计
软件系统的架构设计完成后,利用UML的描述工具:类图、顺序图、状态图、部件图、部署图,分别将架构中的部件(组件/构件)进行实现设计,直到可以编程为止;在实现设计中,对类的属性定义、类的方法算法、接口说明、接口实现、类之间的关系、对象与消息之间的关系、实体之间的状态转换,均要详细说清楚。
5,耦合性和内聚性p123
模块的独立程度的两个标准: (内聚和耦合)。内聚和耦合是密切相关的,模块内的高内聚往往意味着模块间的松耦合。内聚和耦合都是进行模块化设计的有力工具,但是实践表明内聚更重要。 1). 耦合(衡量不同模块间互相依赖的程度)
耦合是对一个软件结构内不同模块之间互连程度的度量。耦合强弱取决于模块间接口的复杂程度。(下面顺序是弱到强)(1) 非直接耦合(2) 数据耦合(或参数传递耦合),属于低级别耦合。例如,模块间通过参数传递或数据结构来访问(3)标记耦合 (4) 控制耦合,属于中级别耦合。例如,操作系统中的进程调度程序,通过就绪进程的优生级来调度。那么调度程序与进程之间的耦合,就是控制耦合。(5) 外部耦合(或共用耦合),它属于高级别耦合。例如,模块间共享全局变量,或共同访问全局数据区中的数据项,就是共用耦合。(6)当两个或多个模块通过一个公共数据环境相互作用时,它们之间的耦合称为公共环境耦合; (7) 内容耦合,它属于最高级别耦合。例如,一个模块利用分支或跳转技术,转入到另一个模块中去执行,就是内容耦合。 耦合可发生在软件设计、软件编程之中。
2)内聚性. 内聚(标志一个模块内各个元素彼此结合的紧密程度)
内聚有如下7类(下面顺序是弱到强):(1)如果一个模块完成一组任务,这些任务彼 此间即使有关系,关系也是很松散的,就叫 做偶然内聚。(2)逻辑内聚(3)如果一个模块包含的任务必须在同一段时间内执行,就叫时间内聚。(4)过程内聚(5)通信内聚(6)信息内聚 (7)如果模块内所有处理元素属于一个整体,完成一个单一的功能,则称为功能内聚。功能内聚是最高程度的内聚。
6,软件需求分析的目的,重点,任务以及工具p56
7,软件维护的定义,分类以及可维护性的四条性质p179
所谓软件维护就是在软件已经交付使用之后,为了改正错误或满足新的需要而修改软件的过程。其基本任务是保证软件在一个相当长的时期能够正常运行。用于维护工作的劳动可以分成生产性活动(例如,分析评价,修改设计和编写程序代码等)和非生产性活动(例如,理解程序代码的功能,解释数据结构、接口特点和性能限度等)。
(1)在程序使用期间,用户必然会发现程序错误,把诊断和改正错误的维护称为改正性维护。 (2)为了和变化了的环境适当地配合而进行的修改软件的活动,是适应性维护。
(3)在使用软件的过程中用户往往提出增加新功能或修改已有功能的建议,称为完善性维护。
(4)为了改进未来的可维护性或可靠性,或为了给未来的改进奠定更好的基础而修改软件时,称为预防性维护(例如千年虫)。
与软件维护有关的绝大多数问题,都可归因于软件定义和软件开发的方法有缺点。下面列出和软件维护有关的部分问题:
(1) 理解别人写的程序通常非常困难。
(2) 需要维护的软件往往没有合格的文档,或者文档资料显著不足。 (3) 当要求对软件进行维护时,往往原来写程序的人已经不在附近了。 (4) 绝大多数软件在设计时没有考虑将来的修改。
(5) 软件维护不是一项吸引人的工作。形成这种观念很大程度上是因为维护工作经常遭受挫折。
维护是软件生命周期的最后一个阶段,也是持续时间最长代价最大的一个阶段。软件工程学的主要目的就是提高软件的可维护性,降低维护的代价。可以把软件的可维护性定性地定义为: 维护人员理解、改正、改动或改进这个软件的难易程度。在前面的章节中曾经多次强调,提高可维护性是支配软件工程方法学所有步骤的关键目标。决定软件可维护性的因素主要有下述5个:1. 可理解性2. 可测试性3. 可修改性4. 可移植性5. 可重用性 软件生命周期每个阶段的工作都和软件可维护性有密切关系。因此,在软件生命周期的每个阶段都必须充分考虑维护问题。
8,软件生命周期的定义以及几种模型的优缺点p33
软件的生存周期与选择的开发模型有关,不同的开发模型,对应不同的生存周期。常用的4种软件开发模型:瀑布模型、增量模型、迭代模型和原型模型,以及开发模型。 瀑布模型 (文档驱动的模型) 特点 阶段间具有顺序性和依赖性 质量保证的观点 选择条件 不是任何软件都可以采用瀑布模型的,选择瀑布模型,必须满足下列条件: (1)在开发时间内需求没有变化或很少变化。 (2)分析设计人员对该应用领域很熟悉,包括对目 标、环境很熟悉。 (4)用户除提出需求以外,不参与开发。 优缺点 瀑布模型有许多优点: (1)可强迫开发人员采用规范的方法(例如,结构化技术); (2)严格地规定了每个阶段必须提交的文档; (3)要求每个阶段交出的所有产品都必须经过质量保证小组的仔细验证。 模型的缺点: 可维护性差,表现在 失。 (2) 由于文档驱动,错误的传递,会采取发散扩大的方式。 模型的缺点: ---若软件系统的组装和拆卸性不强, ---或开发人员全局把握水平不高(没有数据库设计专家进行系统集成), 都不宜采用这种模型。 (3)用户使用环境很稳定。 (1) 由于逆转性很差,所以返工会造成重大损增量模型 (任务或功能模块驱动) (1) 任务或功能模块驱动,可以分阶段提交产品; (2) 有多个任务单,这些多个任务单的集合,构成项目的一个总任务书(总用户需求报告)。 选择模型的条件: (1)在开发过程中,客户接受分阶段交付。 (2)开发人员对应用领域不熟悉,难以一步到位。 (3)工期过紧的中等或高风险项目。 (4)用户可参与到整个软件开发过程中。 原型模型 (原型驱 动) 模型的缺点: 因为事先有一个展示性的产品原型,所以在一定程度上,不利于开发人员的创新。 9,几种软件工程方法的定义,优缺点以及地位p11
软件工程中软件开发方法的集合,称为软件工程方法论。
1)面向过程方法:习惯上称为传统软件工程开发方法,或结构化方法,来自于面向过程的程序设计语言,如汇编语言、C语言。面向过程方法包括面向过程需求分析、面向过程设计、面向过程编程、面向过程测试、面向过程维护、面向过程管理。也可以说,它包括结构化分析、结构化设计、结构化编程、结构化测
试、结构化维护。面向过程的方法,有时又称面向功能的方法,即面向功能分析、面向功能设计、面向功能编程、面向功能测试、面向功能维护。由此可见,面向过程方法、面向功能方法、结构化方法,三者是同一个意思。面向过程方法,设计时强调模块化的思想,采用“自顶向下,逐步求精”的技术对系统进行划分,分解和抽象是它的两个基本手段。面向过程方法编程时采用单入口单出口的控制结构,并且只包含顺序、选择和循环三种结构,目标之一是使程序的控制流程线性化,即程序的动态执行顺序符合静态书写结构。
? 面向过程方法的优点是:以处理流程为基础,简单实用。
? 面向过程方法的缺点是:只注重过程化信息,因而忽略信息的层面关系以及相互联系。它企图使
用简单的时序过程方法(顺序、分支、循环三种结构),来描述关系复杂(随机)的信息世界,因而对于关系复杂的信息系统来说,其描述能力不强,最后可能导致软件设计、开发和维护陷入困难。
2)面向对象方法 :称为现代软件工程开发方法。该方法包括面向对象需求分析、面向对象设计、面向对象编程、面向对象测试、面向对象维护、面向对象管理。面向对象方法是一种运用对象、类、消息传递、继承、封装、聚合、多态性等概念来构造软件系统的软件开发方法。面向对象方法的特点是将现实世界的事物(问题域)直接映射到对象。分析设计时由对象抽象出类(Class),程序运行时由类还原到对象(Object)。面向对象方法,来源于二十世纪八十代年开始流行的面向对象的程序设计语言,例如Java,C++等。面向对象方法的基本特点是:将对象的属性和方法封装起来,形成信息系统的基本执行单位,再利用对象的继承特征,由基本执行单位派生出其他执行单位,从而产生许多新的对象。众多的离散对象通过事件或消息连接起来,就形成了软件系统。业界流传的面向方面的方法、面向主体的方法和面向架构的方法,都是面向对象方法的具体应用案例。
? ?
面向对象方法的优点是:能描述无穷的信息世界,同时易于维护。 面向对象方法的缺点是:对于习惯于面向过程方法的人,他们较难掌握。
3)面向元数据方法,就是在软件需求分析、设计、实现、测试、维护过程中,均以元数据为中心的软件工程方法。元数据(meta-data)是关于数据的数据,组织数据的数据,管理数据的数据。这里的元数据,是泛指一切组织数据的数据,例如类的名称、属性和方法,实体的名称、属性和关联,数据库中的表名、字段名、主键、外键、索引、视图,数据结构中存储数据的框架等等。
? ?
面向元数据方法的优点是:通俗易懂,特别适合信息系统中数据层上的设计与实现。 面向元数据方法的缺点是:只能实现二维表格,不能实现窗口界面。
4)形式化方法
10.P13“五个面向”实践论是指“面向流程分析、面向元数据设计、面向对象实现、面向功能测试、面向过程管理”。“五个面向”实践论,它综合了软件工程方法论中各种开发方法的优点,去掉了各种开发方法的缺点,它是人们在软件开发实践中经验的结晶,是软件工程方法论在软件工程实践中的具体运用。
? 因为类的实例化就是对象,所以面向对象实现,实质上是面向类实现。
? 面向对象方法的软件分析师与程序员时刻要牢记:分析设计时由对象抽象出类,程序运行时由类
还原到对象。
? 面向功能测试的方法就是黑盒子测试方法。 11总体设计 经验规则
1. 改进软件结构提高模块独立性 2. 模块规模应该适中
3. 深度、宽度、扇出和扇入都应适当 4. 模块的作用域应该在控制域之内 5. 力争降低模块接口的复杂程度 6. 设计单入口单出口的模块 7. 模块功能应该可以预测
总体设计过程通常由两个主要阶段组成: (1)系统设计阶段,确定系统的具体实现方案;
? 设想供选择的方案
? 选取合理的方案 ? 推荐最佳方案
(2)结构设计阶段,确定软件结构。
? 功能分解 ? 设计软件结构
第二部分: 数字字典
? 设计数据结构
建立数据字典是为了对数据流程图上各个元素作出详细的定义和说明。数据流程图配以数据字典,就可以从图形和文字两个方面对系统的逻辑模型进行描述,从而形成一个完整的说明。数据字典的内容包括以下六个方面:数据项,数据结构,数据流,数据存储,处理逻辑和外部实体。
● 数据项 又称数据元素,是数据的最小单位。在数据库中数据项指数据表中每条记录的每个字段。描述不可再分解的数据单位,包括:编号。名称。简述。数据类型。长度(精度)。取值范围及缺省值。计量单位 ● 数据结构 数据结构的描述重点是数据之间的组合关系,即说明这个数据结构包括哪些成份; 一个数据结构可以包括若干个数据元素或(和)数据结构;
三种特殊的数据成分:任选项:可有也可以没有;必选项:必须有;重复项:多次出项的数据项。
● 数据流 通过数据流的来源、去处、组成等属性说明。给出DFD中某个数据流的定义,通常包括:数据流标 流来源
数据流去向
数据流的数据组成 流动属性描述:频率、数据量
数据存储名字 数据存储
● 数据存储 只描述数据的逻辑存储结构。给出DFD中某个数据存储的定义,通常包括:
数据
描述 数据存储组成 数据存储方式 关键码 存取频率和数据量 安全性要求(用户存取权限)
● 处理逻辑 仅定义对数据流程中最底层处理逻辑加以说明。处理类条目即数据处理描述,也称为小说明。描述实现处理的策略而不是实现处理的细节。小说明可认为是DD的组成部分。也可在DD中定义只说明每个处理的组成(每个处理分解成多少小处理),而在小说明中详细描述它的处理逻辑。处理条目描述的内容:错处理对策
● 外部实体 外部实体编号、名称、简述及有关数据流的输入与输出。
处理逻辑(简述) 描述基本处理如何把输
输出
优先级 执行频率 出
入数据流变化为输出数据流的处理步骤,不涉及具体处理方法。执行条件 输入
应用举例(1)
某订货系统功能说明如下:
假设某一企业采购部门每天需要一张订货报表,报表按材料编号排序,报表中列出所有需要再次订货的材料。对于每种需要再次订货的材料应列出下列数据:材料编号、名称、订货数量、目前价格(或参考价格)、主要供应单位、第二供应单位等。材料入库或出库称为事务,通过放在仓库的CRT终端把事务报告给订货系统。当某种材料的库存数量少于库存量临界值时就应该再次订货。
1. 约定的描述方法
定义式中使用的符号:
操作符 含义描述 限制重复次数: = 定义为 + 与(顺序结构) {...} 重复(循环结构) 〔..|..〕 或(选择结构) ( ... ) 任选 m..n 界域
例1,北京某高校可用的电话号码由以下几类:校内电话号码由 4位数字组成,第1位数字不是零;校外电话又分为本市电
话和外地电话两类,拨校外电话需先拨 0,若是本市电话再接着拨 8位数字(第1位不是 0),若是外地电话则拨 3位区码再拨 8 位电话号码(第1位不是 0),
请用定义数据字典的方法,定义上述的电话号码。
电话号码=[校内电话号码|校外电话号码] 校内电话号码=非零数字+ 3位数字 //后面继续定义 校外电话号码=[本市号码|外地号码] 本市号码=数字零+8位数字
外地号码=数字零+3位数字+8位数字 非零数字=[1|2|3|4|5|6|7|8|9] 数字零=0 3位数字=3{数字}3 //3至3个数字 8位数字=非零数字+7位数字 7位数字=7{数字}7 数字=[0|1|2|3|4|5|6|7|8|9]
练习:某旅馆的电话服务如下:可以拨分机号和外线号码。分机号是从7201至7299。外线号码先拨9,然后是市话号码或长话号码。长话号码是以区号和市话号码组成。区号是从100到300中任意的数字串。市话号码是以局号和分局号组成。局号可以是455,466,888,552中任意一个号码。分局号是任意长度为4的数字串。
要求:写出在数据字典中电话号码的数据条目的定义(即组成)。 第三部分:三种表达工具的比较 表达处理逻辑的工具 1)表达处理逻辑的工具
如果对处理功能的说明采用自然语言来描述,则常常会出现许多意义不明确的现象:(1)界限不明确。(2)逻辑条件的次序不明确。(3)意义模糊的形容词或副词。采用适当的表达工具来描述数据流程图中的处理功能; 一般采用结构式语言、判断树和判断表三种工具。
结构式语言: 结构式语言是一种介于自然语言和程序设计语言之间的一种语言,它采用了结构化程序设计思想,只使用三种基本的逻辑结构:顺序结构、判断结构和循环结构。结构式语言使用的语句只允许有以下三类: (1)简单的祈使句。(2)判断句(3)循环语句 2)三种表达工具的比较
(1)从工具的难易程度讲,决策树最容易,而决策表难度较高。 (2)对于逻辑验证,决策表最好,而决策树较差。
(3)对于直观表达逻辑结构,决策树最好,而决策表最差。 (4)作为程序设计说明,结构化语言最好,决策树最差。 (5)对于机器可读性,结构化语言最好,决策树最差。
(6)对于可修改性,结构化语言最好,而决策表的可修改性是最低。 综上所述,可以得出的结论:
对于一个不太复杂的判断逻辑即条件只有2-3个,条件组合及行动在10-15个之间,使用决策树最好。 对于一个复杂的判断逻辑(条件多,组合多,相应的动作也多),使用决策表最好。 对于一个处理逻辑既包含了一般的顺序执行动作,又包含了判断或循环逻辑,则使用结构化语言最好。 判定表:描述多条件、多目标动作的形式化工具 判定表结构:条件组合
操作执行
例题:某单位对一部分职工重新分配工作,分配原则是:“如果年龄不满18岁,文化程度是小学,则脱产学习;文化程度是中学,则当电工。如果年龄满18岁但不满40岁,文化程度是小学或中学,若是男性,则当钳工;若是女性,则当车工;文化程度是大学,则当技术员。如果年龄满40岁及其以上,文化程度是小学或中学,则当材料员;文化程度是大学,则当技术员。”
第四部分:软件测试的基本概念 (下接第七部分) 1 软件测试的定义
软件测试是为了发现错误而执行程序的过程。软件测试是在软件投入运行前,对软件需求分析、设计规格说明书和编码进行的最终复审,是保证软件质量的关键步骤。 2 软件测试的目的和原则 软件测试的目的:
测试是程序的执行过程,目的在于发现错误; 一个好的测试用例在于能发现至今未发现的错误; 一个成功的测试是发现了至今未发现的错误的测试。 软件测试的原则:
应当尽早规划和不断地进行软件测试。
测试用例设计应包括测试输入数据和与之对应的预期输出结果这两部分。 程序员应避免检查自己的程序
在设计测试用例时,应当包括合理的输入条件和不合理的输入条件。 严格执行测试计划,排除测试的随意性。 应当对每一个测试结果做全面检查。
妥善保存测试计划,测试用例,出错统计和最终分析报告,为维护提供方便。 测试应有一个终止的标准。 3 软件测试的对象及信息流
软件测试应贯穿于软件定义与开发的整个期间。因此软件测试的对象不仅包括源程序,还包括需求规格说明书、概要设计说明书、详细设计规格说明都应成为软件测试的对象。软件开发在每个环节都需要进行确认和验证工作以保证它的正确性。确认与验证工作都属于软件测试。在软件测试过程需要有三类输入:
? 软件配置:包括软件需求规格说明、软件设计规格说明、源代码等; ? 测试配置:包括测试计划、测试用例、测试驱动程序等; ? 测试工具:测试工具为测试的实施提供某种服务。 测试信息流如图所示。
4. 黑盒测试包括:1 等价类划分法
2 边界值分析法3 错误推测法4 因果图法5 功能图
5. 软件的测试过程一般按4个步骤进行,即单元测试、组装测试(集成测试)、确认测试和系统测试。 6. 常用的几种调试方法 1)、强行排错 : 这是目前使用较多,效率较低的调试方法。
2)、回溯法排错 : 先分析错误征兆,确定最先发现“症状”的位置。然后,人工沿程序的控制流程,反向追踪源程序代码,直到找到错误根源或确定错误的范围。 3)、归纳法排错:归纳法是一种从特殊推断一般的系统化思考方法。归纳法排错的基本思想是:从一些线索(错误征兆)着手,通过分析它们之间的关系来找出错误。 4)、演绎法排错:演绎法是一种从一般原理或前提出发,经过排除和精化的过程来推导出结论的思考方法。 7. 面向对象的测试包括面向对象分析的测试、面向对象设计的测试、面向对象编程的测试、面向对象单元测试 、面向对象集成测试 和面向对象系统测试 。 1 面向对象的测试模型 2 面向对象软件的测试策略 3 面向对象软件测试用例设计
第五部分: 软件工程概论
1, 软件危机是指在计算机的开发和维护过程中所谓遇到的一系列严重问题。 2, 软件工程是指导计算机软件开发和维护的一门工程学科。 3, 软件生命周期由软件定义、软件开发和软件维护三个部分组成。
4, 软件生命周期细分为八个阶段:问题定义、可行性研究、需求分析、总体设计、详细设计、编码和单元测试、综合测试。 5, 可行性研究的任务:技术可行性、经济可行性、操作可行性。(P35) 6, 系统流程图是概括地描绘物理系统的传统工具。(P38)
7, 数据流图(DFD)是一种图形化技术,它描绘信息流和数据从输入移动到输出的过程中所经历的变换。(P40)
8, 数据字典是关于数据的信息的集合,也就是对数据流图中包含的所有元素的定义的集合。任何字典最主要的用途都是供
人查阅对不了解的条目的解释,数据字典的作用也正是在软件分析和设计的过程中给人提供关于数据的描述信息。 9, 举例定义数据的符号的使用方法:某程序设计语言规定,用户说明的标识符是长度不超过8个字节的字符串,其中第一
个字符必须是字母字符,随后的字符可以是字母字符也可以是数字字符。使用上面讲过的符号,可以像下面那样定义标识符:
标识符=字母字符+字母数字串 字母数字串=0{字母或数字}7
字母或数字=【字母字符|数字字符】(P48) 10,验证软件需求应从以下4个方面进行:(P70)
一致性、完整性、现实性、有效性 11,验证需求的完整性和有效性(P71)
① 需要用户的参与;②需要开发原型系统
12,设计原理:①模块化;②抽象;③逐步求精;④信息隐藏和局部化;⑤模块独立。(P94-P97) 13,面向数据流的设计方法:(P104-P113)
① 变换流;②事物流(接收输入数据、分析每个事物以确定它的类型、根据事物类型选取一条活动通路);③设计
过程。
14,结构程序设计技术是详细设计的逻辑基础。(P118)
可理解性是衡量软件质量的最主要的指标之一。
15,过程设计的工具:程序流程图、盒图(会画)、PAD图。(P124-P126) 16,计算环形复杂度的方法(P137)要求会计算环形复杂度
①流图中的区域数等于环形复杂度;
②流图G的环形复杂度V(G)=E-N+2,其中,E是流图中边的条数,N是节点数。 ③流图G的环形复杂度V(G)=P+1,其中,P是流图中判定节点的数目。 17,软件测试的目的:为了发现程序中的错误而执行程序的过程。 22,面向对象方法学的优点5个:(P205-P208)
①与人类习惯的思维方式一致; ②稳定性好;
③可重用性好; ④较易开发大型软件产品 ⑤可维护性好。
23,类(class)的定义:对具有相同数据和相同操作的一组相似对象的定义;对具有相同属性和行为的一个或多个对象的
描述,通常在这种描述中也包括对怎样创建该类的新对象的说明。(P211) 24,实例就是由某个特定的类所描述的一个具体的对象。(P212) 25、面向对象方法用对象分解取代传统方法学中的功能分解。 26,要学会怎么建立一个系统的对象模型。(P235) 27、用面向数据流设计系统的软件结构(要求会104)
第六部分:详细设计
详细设计阶段的根本目标是确定应该怎样具体地设计系统,从而在编码阶段可以把这个描述直接用某种程序设计语言书写成程序。因此,详细设计的结果基本上决定了最终的程序代码的质量。考虑程序代码的质量时必须注意,程序的“读者”有两个,那就是计算机和人。 1 结构程序设计
3种基本的控制结构是“顺序”、“选择”和“循环”;虽然从理论上说只用上述3种基本控制结构,但是为了实际使用方便起见,常常还允许使用DO-CASE控制结构。 2 人机界面设计
1)对于交互式系统来说,人机界面在系统中所占的比例越来越大,在个别系统中人机界面的设计工作量甚至占总设计量的一半以上。人机界面的设计质量,直接影响用户对软件产品的评价,从而影响软件产品的竞争力和寿命,因此,必须对人机界面设计给予足够重视。
2)在设计人机界面的过程中,几乎总会遇到下述4个问题: (1)系统响应时间: (2)用户帮助设施: (3)出错信息处理: (4)命令交互。 3)人机界面设计指南:
1. 一般交互指南:这类指南是全局性的,忽略它们将承担较大风险。 (1) 保持一致性;
(2) 在执行有较大破坏性的动作之前要求用户确认; (3) 允许取消已执行过的操作;
(4) 系统应能保护自己不受严重错误的破坏。
2. 信息显示指南:人机界面显示的信息应该是完整的和易理解的,可以用多种不同方式“显示”信息,下面是关于信息显示的设计指南。
(1) 只显示与当前工作内容有关的信息。
(2) 使用一致的标记、标准的缩写和可预知的颜色显示。 (3) 使用窗口分隔不同类型的信息。
3. 数据输入指南:用户的大部分时间用在选择命令、键入数据和向系统提供输入,下面是关于数据输入的设计指南。
(1)尽量减少用户的输入动作。最重要的是减少击键次数。 (2)允许用户自定义输入。 3 过程设计的工具
计算题中考,详见第二次作业第一题 1) 程序流程图 2) 盒图(N-S图) 3) PAD图
4) 判定表,计算题中考,详见第二次作业第二题 5) 判定树
4 面向数据结构的设计方法 5 程序复杂程度的定量度量
第七部分:软件测试 一)软件测试方法
1,黑盒测试,黑盒测试是在程序接口进行的测试,又称为功能测试。黑盒测试检查的主要方面有: 1) 程序的功能是否正确或完善;
2) 数据的输入能否正确接收,输出是否正确;
3) 是否能保证外部信息(如数据文件)的完整性等。
4) 用黑盒法设计测试用例时,必须用所有可能的输入数据来检查程序是否都能产生正确的输出。 黑盒测试不可能实现穷尽测试!
2,白盒测试,白盒测试时将程序看作是一个透明的盒子,也就是说测试人员完全了解程序的内部结构和处理过程。所以
测试时按照程序内部的逻辑测试程序、检验程序中的每条通路是否都能按预定的要求正确工作。白盒测试又称为结构测试。 利用白盒测试设计测试用例时,应包括以下三类测试:(1)语句测试:要求程序中的每个语句至少测试一次;(2)分支测试:要求程序中的每个分支至少测试一次;(3)路径测试:要求程序中的每条路径至少测试一次。
3,测试用例的设计,
逻辑覆盖:计算题中考,详见第二次作业第三题
等价类划分 :等价类划分是一种实用的测试技术,属于黑盒测试。步骤:划分等价类和确定测试用例 等价类的划分在很大程度上依靠的是测试人员的经验,下面给出几条基本原则:
(1)如果输入条件规定了取值范围,则可划分出一个有效的等价类(输入值在此范围内)和两个无效的等价类(输入值小于最小值、输入值大于最大值)。
(2)如果输入条件规定了输入数据的个数,则可相应地划分出一个有效的等价类(输入数据的个数等于给定的个数要求)和两个无效的等价类(输入数据的个数少于给定的个数要求、输入数据的个数多于给定的个数要求)。
(3)如果输入条件规定了输入数据的一组可能的值,而且程序对这组可能的值做相同的处理,则可将这组可能的值划分为一个有效的等价类,而这些值以外的值划分成无效的等价类。
(4)如果输入条件规定了输入数据的一组可能的值,但是程序对不同的输入值做不同的处理,则每个输入值是一个有效的等价类,此外还有一个无效的等价类(所有不允许值的集合)。
(5)如果输入条件规定了输入数据必须遵循的规则,则可以划分一个有效的等价类(符合规则)和若干个无效的等价类(从各种角度违反规则)。
划分出等价类后,根据以下原则设计测试用例:
(1)为每个等价类编号。(2)设计一个新的测试用例,使它能包含尽可能多的尚未被覆盖的有效等价类。重复这一过程,直到所有的有效等价类都被覆盖。
(3)设计一个新的测试用例,使它包含一个尚未被覆盖的无效等价类。重复这一过程,直到所有的无效等价类都被覆盖。
边界值分析:使用边界值分析方法设计测试用例时,首先要确定边界情况。通常输入等价类和输出等价类的边界,就是应该着重测试的程序边界情况。也就是说,应该选取恰好等于、小于和大于边界的值作为测试数据,而不是选取每个等价类内的典型值或任意值作为测试数据。边界值分析也属于黑盒测试,可以看作是对等价类划分的一个补充。在设计测试用例时,往往联合等价类划分和边界值分析这两种方法。 错误推测法:错误推测法的基本想法是:列举出程序中所有可能有的错误和容易发生错误的特殊情况,根
据它们选择测试用例。例如,输入数据为零或输出数据为零的地方往往容易出错;各模块间对公有变量的引用也是容易出错的地方。
二)软件测试的步骤:
1,单元测试,又称模块测试,集中对软件设计的最小单位——模块进行测试,主要是为了发现模块内部可能存在的各种错误和不足。进行单元测试时,根据程序的内部结构设计测试用例,主要使用白盒测试法。由于各模块间相对独立,因而对多个模块的测试可以并行地进行,以提高测试效率。单元测试的内容:(1)模块接口,(2)局部数据结构,(3)重要的执行路径,(4)出错处理,(5)边界条件。单元测试的步骤:单元测试的对象是模块。测试者必须自己动手设计这两类模块:驱动模块(相当于所测模块的“主程序”。它接收测试数据,把这些数据传送给所测模块,然后输出测试结果)和存根模块(也叫虚拟子程序。它的作用是模拟被测模块所调用的子模块。存根模块可以做少量的数据操作,一般情况下,不需要把实际子模块的所有功能都带进来)。
2,集成测试,集成测试过程中要考虑的问题: (1)数据穿过模块接口时是否会丢失;
(2)模块的功能是否会对其它模块的功能产生不利的影响; (3)把子功能组合起来,能否达到预期的主功能要求;
(4)单个模块的误差累积起来是否会放大到不能接受的程度; (5)全局数据结构是否有问题。(6)单个模块的错误是否会导致数据库错误。
将各个模块组装成系统的方法:非增殖式组装方式(先分别对每个模块进行测试,再把所有模块按设计要求组装在一起进行测试,最终得到所要求的软件)和增殖式组装方式(把下一个要测试的模块同已经测试好的那些模块结合起来进行测试,测试完以后再把下一个应该测试的模块结合进来测试,这种方法实际上同时完成单元测试和集成测试)。这两种方法各有优缺点:
(1)采用非增殖式组装方式时,可以较早发现模块间的接口错误,而采用增殖式组装方式时,只有在模块加进来时才可能发现,因此接口错误发现较晚。
(2)采用非增殖式组装方式时要对每个模块进行单元测试,需要编写的测试软件较多,工作量大,而采用增殖式组装方式时,利用已测试过的模块部分作为部分测试软件,因而工作量较小。
(3)非增殖式组装方式要求一下子把所有模块组装起来,如果发现错误则较难判断错误的位置,而采用增殖式组装方式时,由于每次只加入一个模块,因而错误往往与刚加入的模块有关,查错则相对容易些。
(4)采用非增殖式组装方式时,各模块的单元测试可以并行地进行,因此可以充分利用人力,加快测试进程,采用增殖式组装方式时却不能如此。
注:在使用增殖式组装方式时,常用的有自顶向下和自底向上两种方法。
自顶向下结合的主要优点:不需要设计测试驱动模块,与存根模块相联系的问题可能在测试的早期发现。 主要缺点是:需要设计存根模块,并且由于为了使存根模块能够尽量模拟实际模块的功能,必然会增加设计存根模块的复杂度,从而导致增加一些附加的测试。
自底向上结合的主要优点:不需要设计存根模块,而设计测试驱动模块一般比建立存根模块要容易,同时比较容易设计测试用例,并且可以实现多个模块的并行测试,从而提高测试效率。
主要缺点是:直到最后一个模块结合进来以前,程序作为一个整体始终不存在。也就是说,对主要的控制直到最后才接触到。 3,有效性测试, 4,系统测试
三)调试的步骤
调试过程由两个部分组成:首先,确定程序中错误的确切性质和位置;然后,对程序代码进行分析,确定问题的原因,并设法改正这个错误。具体地说,由以下步骤组成: (1)从错误的外部表现入手,确定程序中出错的位置; (2)分析有关程序代码,找出错误的内在原因;
(3)修改程序代码,排除这个错误;
(4)重复进行暴露了这个错误的原始测试以及某些回归测试,以确保该错误确实被排除且没有引入新的错误;(5)如果所作的修正无效,则撤消这次改动,重复上述过程,直到找到一个有效的办法为止。 四)有下列3种调试途径可以采用: 1. 蛮干法 2. 回溯法 3. 原因排除法
百度搜索“70edu”或“70教育网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,70教育网,提供经典综合文库2024级爱恩学院软件工程期末复习知识点小结--andy cao在线全文阅读。
相关推荐: