软件工程基础期末复习.docx
《软件工程基础期末复习.docx》由会员分享,可在线阅读,更多相关《软件工程基础期末复习.docx(13页珍藏版)》请在冰豆网上搜索。
软件工程基础期末复习
《软件工程基础》期末复习
一绪论
1、软件工程的来源和研究内容
软件工程的来源和软件产业的发展密不可分,同软件开发的实际工作密不可分。
软件工程这门学科,是从实践中碰到的各种问题中产生的,又反过来指导软件开发工作的实践。
软件工程这门学科的主要研究内容包括:
(1)软件开发的理论。
任何一门学科发展到一定程度,都会形成一定的理论。
软件开发的理论当然是整个软件开发实践的一些经验总结,并且是从这些经验中抽象出来的关于软件开发的一些基本概念、原则、思想等等。
(2)软件开发的方法。
在一些公认的理论的指导下,不同的软件开发人员和研究人员,都提出了各种各样的具体方法,这些方法各有优势,也各有不足。
但是大多数都已经在实际运用中取得了比较好的效果。
(3)软件开发的标准。
任何一个产业,要能够实现工业化的、大批量的生产,必需有一定的大家共同承认和共同遵守的标准。
在技术领域,标准的来源主要有两种,一种是由各种标准化组织制定的(包括国际的、国家的、行业的),另一种是由在这个产业里居主导地位的生产厂商事实上形成的,当然,这种标准也会根据市场情况逐渐地被标准化组织所采纳。
2、软件的定义和特点
软件是指计算机系统中与硬件相互依存的另一部分,包括程序、数据及相关文档的完整集合。
软件的主要特点为:
(1)软件不是物理实体,而是一种特殊的逻辑实体;
(2)软件的开发和设计过程是以人为主的,是通过设计将人的智力成果转化成软件;
(3)软件设计的结果是没有误差概念;
(4)软件一旦开发成功,它不会随着时间的流逝老化;
(5)软件的开发过程和生产过程是统一在一起的,开发过程的结束也就是生产过程的结束;
(6)软件完成后有一个较长时期的维护工作。
3、软件工程的产生背景:
在本世纪60年代末由于缺乏对软件开发工作的研究,缺乏正确的理论和方法导致的“软件危机”,表现在:
(1)软件的质量难以达到用户的要求,并且极易发生故障,可靠性差;
(2)开发一个软件的成本和进度难以预测,也难以控制;
(3)开发出来的软件维护困难;
(4)软件开发工作难以管理。
(5)软件的成本逐年上升。
造成“软件危机”的原因首先是由于软件开发产业的发展时间不长,积累的经验还没有上升成为能够指导实践的理论;但是,从最早的程序员开发软件的方式中遗留下来的很多错误观念,也是使软件开发工作难以跟上整个计算机技术发展水平的重要原因,这些错误观念包括:
(1)开发软件就是编程。
(2)只要向用户提交了程序,并且可以运行,软件开发工作即告结束。
(3)软件是灵活的,可以很容易修改。
(4)增加人员可以加快进度。
正是因为面对着软件开发中的各种各样的问题,在上世纪60年代末提出了“软件工程”这一概念。
4、软件工程的定义和基本目标:
“软件工程”的定义(IEEE):
将系统的、规范的可度量的工程化方法应用于软件开发、运行和维护的全过程及上述方法的研究。
软件工程研究的目标:
在有限的时间、人力、物力、财力的基础上,生产出符合用户需求的软件产品,提高软件生产率。
软件工程的组成:
方法、工具和过程。
5、软件工程的七条基本原理:
任何一门学科,例如数学、物理等学科都有一些基本的原理,实际上就是一些公理。
软件工程的7条基本原理是:
(1)用分阶段的生命周期计划严格管理;
(2)坚持进行阶段评审;
(3)实行严格的产品控制;
(4)采用现代程序设计技术;
(5)结果应能清楚地审查;;
(6)开发小组的人员应该少而精;
(7)承认不断改进软件工程实践的必要性。
二软件工程的生命周期方法学
1、软件生命周期定义和阶段划分:
软件工程认为:
任何一个软件,都有产生、发展、消失(灭亡)的过程。
这个过程就叫做软件的“生命周期”。
它是软件工程的基本概念,软件工程的各种理论和方法都是以软件的生命周期为基础。
软件生命周期的阶段划分为四大阶段:
需求分析(问题定义和可行性分析)、设计(概要设计、详细设计、实现与测试)、应用和维护(灭亡)。
2、软件工程生命周期方法学的定义和特点
软件工程的生命周期方法学是指严格按照软件的生命周期,采用分阶段、有计划和控制,以及顺序实施的步骤,以结构化分析与设计(StructuredAnalysis,SA;StructuredDesign,SD)或面向对象分析与设计(Object-OrientedAnalysis,OOA;Object-OrientedDesign,OOD)为主的软件开发过程。
生命周期方法学的特点是:
(1)分阶段计划;
(2)瀑布式开发模式;
(3)阶段性的技术审查和管理复审——基线;
(4)在各个阶段采用结构化技术/面向对象技术。
结构化技术是指采取自上而下,逐步求精,单入口,单出口的模块化的分析与设计的模型。
面向对象技术是指在客观世界映射到信息世界时,采用人们认识客观世界的过程中普遍运用的思维方法,直观、自然地描述客观世界中的有关事物——类与对象,并通过抽象性、封装性、继承性、多态性和消息机制等设计类与对象,并建立他们之间关系的分析与设计的模型。
3、生命周期方法学的阶段划分:
(1)问题定义
(2)可行性研究
(3)需求分析
(4)概要设计
(5)详细设计
(6)编码
(7)测试
(8)应用与维护
按照软件工程思想,采用生命周期方法学,则上述的某些阶段,可以简化和合并,但是不能够完全取消,或者破坏瀑布模型的从上至下的流程。
三问题定义和可行性分析
1、问题定义阶段的任务、步骤和文档
问题定义阶段的主要任务是:
明确要解决的问题究竟是什么。
问题定义的步骤可以分为三步:
(1)问题定义:
系统分析员与用户方的项目负责人交谈,并对现场情况进行调研,然后根据所收集到的资料,写出软件的开发目标报告书草稿。
(2)需求描述:
系统分析员以开发目标报告书草稿为基础,一方面交用户审阅,一方面与用户的项目负责人、使用负责人、其他有关人员进行详细的讨论,澄清双方认识上不一致的地方和报告中描述模糊的地方,最后对开发目标报告书进行修改,写出正式的开发目标报告书。
(3)需求评审:
系统分析员将正式的开发目标报告书提交用户审阅,经用户方负责人签字认可后问题定义阶段结束。
问题定义阶段结束提交的文档为软件开发目标报告书,内容包括:
(1)软件系统名称;
(2)软件系统目标;
(3)软件开发和运行环境;
(4)软件开发背景;
(5)软件开发的成本和进度限制。
2、描绘系统逻辑模型的图形工具
2.1数据流图
数据流图(DFD)纯粹是从系统数据流动的角度来描绘系统的逻辑模型。
数据流图的基本符号只有数据的源点/终点、变换数据的处理、数据存储和数据流线四种。
强调一点:
DFD中带箭头的线段表示数据的流动,而不是控制的转移。
2.2数据字典
数据字典是表达系统逻辑模型中所有数据元素详细情况的工具,它严格定义整个系统逻辑模型中所涉及到的基本数据、数据结构、文件形式,每一个元素作为一个词条,在词条解释中对该元素的定义、描述、使用特点、与其他数据元素的关系等等都进行了准确详细的表达。
数据字典的形式定义包括:
表格、范式(定义式)、Wornior图等形式。
在编辑数据字典的时候,要注意这样几个问题:
(1)完整性:
在DFD中的数据流名称在DD中必定有相应的名称。
(2)一致性:
在DFD中的数据流名与在DD中定义的数据语义必须一致。
(3)正确性:
数据定义真实描述用户领域的数据、结构、文件等信息。
四需求分析
1、需求分析的主要任务
需求分析的主要任务是分析出软件开发目标中的所有具体要求,主要包括:
(1)功能需求:
系统实现什么功能?
(2)性能需求:
包括速度、存储、数据量、安全性和可靠性等指标。
(3)领域需求:
包括与领域相关的保密性、可扩展性等。
(4)其它需求:
如预防性维护需求、版权、政策等。
2、需求分析与建模
(1)问题定义:
功能和性能(约束条件),注意问题说明和定义的一致性和完整性;
(2)结构化分析方法
按照结构化的思想,采取从总到分,逐步求精的过程。
按照面向对象的思想,采取类-对象分析、属性、方法、服务、主题层分析。
(3)需求建模:
数据建模、功能建模、行为建模
(4)修正开发计划
对在可行性研究阶段制定的开发计划进行仔细的修订,对人员的配备、设备的要求、进度安排、费用分配都进行进一步的研究。
3、需求分析的文档
4、需求分析阶段使用的图形工具
●ER图;
●DFD:
要注意分解前后数据流图的一致性。
●STD:
●判定树、判定表;
●PDL描述:
算法描述工具有结构化分析语言、判断树、判定表等。
五软件设计基础
1、软件设计的概念和原理
模块的独立性由模块化、抽象和信息隐藏共同体现。
(1)模块化
模块化是结构化设计的基本理论之一。
模块是指具有输入、输出、逻辑功能、内部数据这四个基本属性的指令集合。
模块化的目的就是为了降低软件自身的复杂度,减少开发所需的工作量。
在模块数量适中的某一个值时,软件开发的总工作量最少,成本也最低。
(2)抽象
抽象是一个方法论的名词,抽象是指从客观事物中抽取它们共同特征,并对其进行概括和总结;对于它们在其他细节上的差异暂时忽略。
在软件设计中,采用抽象的方法也就是采用结构化的思想。
(3)信息隐藏和局部化
信息隐藏:
每一个模块内部与其他模块无关的数据,其他模块都没有办法访问;每个模块只完成一个相对对立的功能;模块之间交换的仅是为了实现系统功能而必须交换的信息。
局部化:
是指应该把可能互相作用的过程和数据尽量放在一个模块内。
信息隐藏和局部化的意义都在于降低模块之间接口的复杂度,提高模块的独立性。
(4)模块独立
模块之间的独立程度的度量方式是模块的耦合和内聚。
1、耦合
耦合是对一个软件结构内不同模块之间互连程度的度量。
按照由弱至强的顺序,模块间的耦合关系有这样几种:
●非直接耦合:
模块之间没有直接的调用关系;
●数据耦合:
信息交换仅发生在接口上;
●特征耦合:
交换的信息是一个复合的数据结构;
●控制耦合:
交换的信息是控制信息;
●公共耦合:
交换的公共的数据环境;
●内容耦合:
模块之间的叠加。
对于良好的结构化设计,应该是:
尽量使用数据耦合、少用控制耦合,限制公共耦合范围,坚决不用内容耦合。
2、内聚:
内聚是指一个模块内的处理和数据之间的关联程度。
一个模块的内聚方式按照内聚程度的由低到高排列,有以下几种:
●偶然内聚:
模块内部是松散的关系(如节约内存等);
●逻辑内聚:
逻辑上相关,例如都是输入或者输出操作,用参数区别;
●时间内聚:
在同一时间内上运行,或者在逻辑上有先后顺序;
●过程内聚:
按照过程描述自上而下组织任务,如“打开/关系”
●通信内聚:
模块内部操作同一数据区域/结构;
●顺序内聚:
同一功能、按顺序执行;
●功能内聚:
模块是一个整体,完成一个独立的功能。
2、启发式规则
(1)改进软件结构提高模块独立性;
(2)模块规模应该适中;
(3)深度、宽度、扇出和扇入都应该适中;
(4)模块的作用域应该在控制域之内;
(5)力争降低模块接口的复杂程度;
(6)设计单入口、单出口的模块;
(7)模块功能应该可以预测;
(8)内聚高的指标不能绝对;
(9)根据关键任务优化模块划分。
“先让系统正确运行起来,再让系统好起来!
”
六总体设计
1、总体设计的目标
总体设计的目标从根本上来说,就是要确定软件的总体实现方案和总体结构。
总体设计分为:
结构设计、系统数据设计和系统接口/界面设计。
2、总体设计的步骤
(1)设想供选择的方案;
(2)选取合理的方案,要选择至少三种方案:
低成本、中等成本和高成本的。
成本是综合因素的考虑,包括:
技术、资金、人力、物力、时间、空间、管理等。
(3)推荐最佳方案
(4)功能分解
(5)设计软件结构
(6)数据设计
(7)制定测试计划
(8)书写文档
3、图形工具
(1)层次图(逻辑结构)
表达软件结构的层次图也使用很多分层的矩形框和分支线条。
层次图中每一个矩形框表示软件结构中的一个模块,矩形框之间的线条表示调用关系。
(2)结构图(表示模块间数据的传递)
结构图是层次图的一种改进。
它的线条直接标示在模块之间,而且在调用线旁边使用带箭头的线段来表示模块之间传递的信息。
4、面向数据流图的设计方法(事务流,变换流)
(1)事务流和变换流的形态;
(2)变换流的映射方法:
自动化边界的划分;
(3)事务流的映射方法:
事务中心的确认;
七详细设计
1、详细设计的任务、步骤和文档
详细设计阶段的主要任务是对每一个模块的内部细节进行具体的设计,实现所有软件的功能。
按照什么顺序去完成每一个模块内部细节的设计,从系统整体结构实现上来说,有两种不同的开发方式:
自顶向下和自底向上。
2、结构化程序设计
(1)基本概念
经典的结构化程序设计仅使用顺序、选择、循环这三种基本控制结构的组合来构成整个软件。
(2)结构化程序设计原则
结构化程序设计的原则有如下几条:
●使用基本控制结构完成所有软件控制结构的构造。
●设计软件控制结构的过程应该采用逐步求精技术。
●所有结构都应该是单入口单出口的。
●没有无限循环和不可及结构部分。
3、详细设计的工具
(1)程序流程图;
(2)盒图(NS图):
要能够用盒图描写简单的处理过程;
(3)PAD图;
(4)过程设计语言(PDL):
要能够阅读简单的PDL描述。
八编码
九软件测试
1、软件测试的基本概念
(1)测试的定义和目标
测试是为了发现程序中的错误而执行程序的过程。
测试的目标,是为了发现错误,而不是为了证明软件是正确的。
(2)测试方法:
1、黑盒测试
不考虑程序的内部结构和处理过程,只对它的输入输出进行测试,就是“黑盒”测试。
实际上,黑盒测试完成的是对模块功能的测试。
2、白盒测试
如果测试是按照程序的内部结构或者运行的逻辑顺序来进行,这样的测试就是白盒测试。
无论是黑盒法还是白盒法,要想做到穷举测试都是不可能的。
(1)测试策略
软件测试的测试策略和基本步骤是:
1、单元测试;
2、集成测试;
3、系统测试;
4、验收测试;
如果在测试中,发现这样一些情况:
A.错误非常多,并且很多是需要对软件进行大规模修改的严重错误,那么这个软件的设计一定存在着很大的问题,需要进一步仔细测试或者进行重新审查;
B.错误不多,并且多数很容易修正,那么可能说明这个软件的可靠性是不错的,当然也可能说明是测试方案还不够好,还不能够发现其它的错误;
C.如果测试的结果一个错误都没有发现,那么说明测试方案一定有严重的缺陷,没有起到有效测试的目的。
(2)测试原则
1、一般不测试自己设计的程序。
2、要对测试输入有预期输出。
3、要对合法输入和非法输入都进行测试。
4、多干工作也是错误。
5、测试数据必须长期保存。
6、程序中的错误率和已经发现的错误的比例成正比。
2、单元测试的任务、步骤和方法
单元测试的测试对象是模块,主要任务是检查每一个模块是否能够按照预定的设计要求进行工作,完成预定的功能。
单元测试包含于编码阶段之中,一般按照以下的步骤来进行:
(1)代码审查:
静态测试、代码走查;
(2)运行测试;
(3)测试软件测试:
单元测试一般以白盒测试为主,之后的其它测试以黑盒测试为主。
3、综合测试的任务、步骤和方法
综合测试包括集成测试和系统测试,它的任务主要是测试软件结构上的问题,包括模块之间的接口和整体的功能。
综合测试的方法主要区别在于集成子系统的方法,有非渐增式测试和渐增式测试。
渐增式测试其实是把单元测试和组装测试或系统测试结合在一起来进行,是一种循序渐进的方法。
使用渐增式测试方法,在如何组合模块的过程上,又有两种不同的策略,自顶向下和自底向上,分别需要设计桩模块和驱动模块。
4、测试方案的设计
(1)基于白盒法的测试数据设计(逻辑覆盖)
1、语句覆盖;
2、判定覆盖;
3、条件覆盖;
4、判定/条件覆盖;
5、条件组合覆盖;
6、路径覆盖。
(2)基于黑盒法的测试数据设计
主要考虑等价类划分:
至少有两大类,无效等价类和有效等价类。
1、等价类划分;
2、边界值分析;
3、错误推测;
十面向对象分析(OOA)
1、OO基本概念
(1)面向对象的基本概念,包括:
类、对象、属性、方法、消息。
(2)面向对象的三大特征:
封装性、继承性、多态性。
(3)类-&-对象之间的关系:
一般与特殊、部分与整体、友元、实例连接(聚集)、消息连接
2、OOA的过程
(1)建立用例(功能)模型;
(2)
确定类-&-对象;
(3)
静态模型
确定类属性;
(4)确定类服务;
(5)确定类结构;
(6)确定主题;
(7)建立动态模型。
3、UML的OOA建模
面向对象的分析方法,就是采用基于UML的图形工具,将现实世界的问题转换为分析模型。
(1)UML的建模图:
1.静态建模图:
用例图、类图(类对象图)、包图、构建图、配置图。
2.动态建模图:
顺序图、协作图、活动图、状态图
(2)UML的建模过程:
1.用“用例图”、场景描述需求;
2.用包图和类图描述系统软件总体框架结构。
十一面向对象设计(OOD)
1、基本概念
面向对象的设计方法,就是采用基于UML的图形工具,将分析模型转换为设计模型。
2、OOD的主要过程
(1)系统设计:
分层和分块;
(2)类-对象设计:
精化类间关系;
(3)数据设计;
(4)消息设计;
(5)人机交互设计。
结构化设计准则仍然有用:
1)模块化2)抽象3)信息隐藏4)弱耦合5)强内聚6)可重用
十二维护
1、基本概念
(1)维护的定义和分类:
在软件已经交付使用之后,为了改正错误或满足新的需要而修改软件的过程,称作维护。
1、纠错性维护;
2、适应性维护;
3、完善性维护;
4、预防性维护。
(2)可维护性:
可维护性是指维护人员理解、改正、改动和改进需要进行维护的软件的难易程度。
影响软件可维护性的主要因素有以下这样三种:
1、可理解性;
2、可测试性;
3、可修改性。
2、维护的过程
(1)人员组织:
以维护管理员为核心的人员组织方式。
(2)维护的事件流
(3)维护阶段的文档:
维护阶段自身的文档主要是指维护记录。
包括软件问题报告和软件修改报告。
3、维护的副作用
(1)代码修改;
(2)数据修改;
(3)文档。