2017年9月全国计算机等级考试《四级软件工程》【教材精讲+真题解析】讲义与视频课程【26小时高清视频】(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-03 21:44:24

点击下载

作者:圣才电子书

出版社:圣才电子书

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

2017年9月全国计算机等级考试《四级软件工程》【教材精讲+真题解析】讲义与视频课程【26小时高清视频】

2017年9月全国计算机等级考试《四级软件工程》【教材精讲+真题解析】讲义与视频课程【26小时高清视频】试读:

视频讲解教师简介

白香君,北京航空航天大学数学与系统科学学院信息与计算科学专业硕士,在校期间多次参与重大课题的研究,并曾先后在中科院软件所、联想研究院、中科院自动化所、中科曙光从事软件开发相关的实习工作,具有丰富的计算机理论基础知识和软件开发经验。

授课特点:思路清晰,基础知识扎实,讲解生动丰富。

视频讲解教师简介

第一部分 教材精讲[视频讲解]

第1章 软件工程概论[视频讲解]

考核目标

1.了解软件及软件工程的概念,包括软件的定义、软件的分类、软件危机的表现、软件工程的定义、软件工程的框架内容、软件工程的层次

2.了解两种软件工程方法的基本概念,包括结构化方法和面向对象方法。

3.了解软件生存周期过程的概念,包括软件生存周期的定义、阶段划分,各个阶段的主要任务和应交付的文档。

4.了解软件过程的概念,包括软件过程的定义,软件过程的主要活动。

5.了解主要软件(生存周期)过程模型的活动、流程和优缺点。

6.了解主要软件工具的概念。

1.1 软件和软件工程的概念

一、软件的概念

1.软件的定义“软件(Software)”一词是在20世纪60年代出现的。

一般认为,软件是计算机系统中与计算机硬件相互依存的另一部分。

从系统工程角度来看,它作为系统元素,与计算机硬件、人、数据库等共同构成计算机系统。

GB/T 11457—2006《信息技术软件工程术语》中给出的定义是,软件是与计算机系统的操作有关的计算机程序、规程及可能的相关文档的完整集合。

计算机程序(Program)是计算机指令和数据定义的组合,使得计算机硬件能够执行计算或控制功能;

规程(Procedure)是为执行给定的任务而应采取的一系列动作的描述;

文档(Document)是与程序开发、维护和使用有关的图文材料。

2.软件的分类

R.S.Pressman根据计算机软件的应用,将计算机软件分为以下7个大类。(1)系统软件。系统软件是一套服务于其他程序的程序。

一些系统软件(如编译器、编辑器、文件管理实用程序)处理的是复杂但确定的信息结构;另一些系统软件(如操作系统构件、驱动程序、网络软件和远程通信处理器)处理的主要是不确定的数据。(2)应用软件。应用软件是一些可以满足特定业务需要的独立应用软件。应用软件用于处理商务或技术数据,以协助业务操作和管理或技术决策。除了传统的数据处理应用外,应用软件也被用于业务领域的实时控制(如销售点的交易处理、实时制造过程控制等)。(3)工程/科学软件。工程和科学软件涵盖了广泛的应用领域。当今科学工程领域的应用软件已经不仅仅局限于传统的数值算法。计算机辅助设计、系统仿真和其他的交互性应用程序已经呈现出实时和系统软件的特性。(4)嵌入式软件。嵌入式软件存在于某个产品或者系统中,可实现和控制面向最终使用者和系统本身的特性和功能。嵌入式软件可以执行有限的功能(如微波炉的按键控制)或者提供重要的功能和控制能力(如汽车中的燃油控制、仪表板显示、刹车系统等)。(5)产品线软件。产品的设计方向是为多个不同的用户提供特定功能,关注有限的特定市场(如库存控制产品)或大众消费品市场(如文字处理、电子制表、电脑绘图、多媒体、娱乐、数据库管理、个人及公司财务应用等)。(6)Web应用软件。最简单的Web应用可以是一组超文本链接文件,仅仅用文本和有限的图形表达信息。但随着电子商务和B28应用的发展,网络应用演变成为复杂的计算环境与企业数据库和商务应用程序相结合,为最终用户提供了更强大的计算功能。(7)人工智能软件。人工智能软件利用非数值算法来解决计算和直接分析无法解决的复杂问题。这个领域的应用程序包括机器人、专家系统、模式识别(图像和语音)、人工神经网络、定理证明和博弈等。

为了经济地、顺利地开发软件产品,从事软件开发的人员还需要了解以下方面。

①遗留软件:以往的软件开发人员开发并成功使用的软件。为了使它们能够在新的环境下适应新的需要,必须对它们加以改造。这样做,多少可以减轻未来软件开发的负担。

②网络平台:当前,大多数软件开发都是基于网络的,软件开发人员采用适当的开发模式,建立灵活的系统架构,已成为网络软件开发的关键。

③开源软件:开源软件就是网络上可以下载并使用的免费软件,是允许用户自行修改和利用的各种软件程序。利用开源软件,软件开发人员可以少编或不编程序,将从网络上下载的开源软件直接集成到目标系统中,完成软件开发的任务。

二、软件危机

20世纪60年代中期,大容量、高速度计算机的出现,使计算机的应用范围迅速扩大,软件开发急剧增长,软件系统的规模越来越大,复杂程度越来越高,软件可靠性问题也越来越突出。

原来的个人设计、个人使用的方式不再能满足要求,迫切需要改变软件生产方式,提高软件生产率,软件危机开始爆发。

1.软件危机的主要表现(1)软件开发成本和进度严重失控,软件开发的实际成本在计算机系统总成本中所占的比例居高不下,投资一再追加,实际成本远远超出预算成本。(2)软件开发生产率提高的速度远远跟不上计算机应用的需要,拖延工期几个月甚至几年的现象也并不罕见,这种现象降低了软件开发组织的信誉。(3)软件的可靠性差,尽管耗费了大量的人力和物力,而系统的正确性却越来越难以保证,出错率大大提高,由于软件错误而造成的损失十分惊人。(4)生产出来的软件难以维护,很多程序缺乏相应的文档,程序的错误难以定位和改正,有时改正了已有的错误又会引入新的错误。

2.软件危机的解决途径

解决软件危机的途径在于工程化和标准化,也就是说,使用工程化的原则来指导软件产品的开发和维护,通过标准化的手段来规范软件产品的开发过程和管理过程,这就是软件工程的由来。

作为一个工程学科,软件工程从硬件工程和其他人类工程中吸收了许多成功的经验,明确提出了软件生存周期的模型,发展了许多软件开发与维护阶段适用的技术和方法,并应用于软件工程实践,取得了良好的效果。

在软件开发过程中人们可以使用软件工具,以辅助进行软件项目管理与产品的生产,人们还将软件生存周期各阶段使用的软件工具有机地集成为一个整体,形成集成化软件支撑环境。以期从管理和技术两方面解决软件危机问题。

三、软件工程的概念

1.软件工程的定义

1968年,在NATO(北大西洋公约组织)于德国Garmish举行的学术会议上,德国人Fritz Bau.er第一次为软件工程下了定义:“软件工程是为了经济地获得能够在实际机器上有效运行的可靠软件而建立和使用的一系列完善的工程化原则。

此后,IEEE多次给软件工程下定义。我国2006年的国家标准GB/T 11457—2006《信息技术软件工程术语》中给出的软件工程定义为“应用计算机科学理论和技术以及工程管理原则和方法,按预算和进度,实现满足用户要求的软件产品的定义、开发、发布和维护的工程或进行研究的学科”。

2.软件工程框架

北京大学杨芙清院士基于软件工程的不同侧面,提出了一个软件工程框架模型,如图1-1所示图1-1 软件工程框架

软件工程的目标是“生产具有正确性、可用性及开销适宜的产品”。

其中,正确性表明软件产品达到预期功能的程度;

可用性表明软件基本结构、实现和文档为用户所接受的程度;

合算性表明软件开发、运行的整个开销满足用户要求的程度。

这些目标形成了对过程、过程模型及工程方法选取的约束。

软件工程活动是“生产一个最终满足需求并达到工程目标要求的软件产品所需要的一系对步骤”,主要包括需求分析、设计、实现、V&V(验证与确认)以及支持等活动。

支持活动又包括修改和完善。

伴随以上活动的还有管理过程、支持过程和培训过程等。

围绕工程设计、工程支持和工程管理,应注意遵守以下4条基本原则。(1)选取适宜的开发范型(也称为开发方法学)。软件需求、硬件需求及其他因素间是相互制约、相互影响的,必须认清需求定义的易变性,采用适当的开发范型予以控制。(2)采用合适的设计方法。在软件设计中,通常需要考虑软件的模块化、抽象和信息隐蔽、局部化、一致性、适应性等特征。选取合适的设计方法有助于这些特征的实现。(3)提供高质量的工程支持。在软件工程中,软件工具与环境对软件过程的支持非常重要。软件工程项目的质量与开销直接取决于支撑软件工程的工具的质量与效用。(4)重视开发过程的管理。软件工程的管理工作直接影响到能否有效利用可用资源,生产满足要求的软件产品以及提高软件组织的生产能力等问题。

因此,只有当软件过程得到有效管理时,才能实现软件工程的有效运用。

从技术角度来看,R.S.Pressman认为软件工程是一种层次化的技术,如图1-2所示。图1-2 软件工程层次图(1)任何工程(包括软件工程)最基本的就是质量。任何产品(包括软件产品)的质量关注点就是要让客户满意,这意味着合格的产品要在规定的时间和成本内交付。(2)软件产品的质量需要在软件生产过程中层层把关。因此,软件过程的作用就是把各个技术层次结合在一起,合理地组织所有相关活动、人员、规程、方法,高效地开发计算机软件。(3)软件工程方法为构建软件产品提供了技术上的解决方法。方法覆盖面很广,包括沟通、需求分析、设计建模、编程、测试和技术支持。(4)软件工具为过程和方法提供了自动化或半自动化的支持。这些工具可以集成起来,使得一个工具产生的信息可被另外一个工具使用,这样就建立了软件开发的支撑系统,称为计算机辅助软件工程(Computer—Aided Software Engineering,CASE)。

1.2 软件工程方法

软件工程方法又称为软件开发范型(Paradigm)。从软件开发角度来看,范型与问题解决技术有关。研究软件开发范型的目的是帮助人们找到解决问题的途径。

目前使用最广泛的软件工程方法是面向过程方法、面向对象方法和形式化方法。

一、面向过程方法

面向过程方法是使用最广泛、历史最长的软件开发范型。

该方法从功能角度出发,把软件视为处理流,并定义成由一系列步骤构成的程序过程。

每一个步骤都是带有预定输入和特定输出的一个过程,把这些步骤串联在一起可产生合理的、稳定的、贯通于整个程序的控制流,最终产生一个简单的具有静态结构的体系结构,如图1-3所示。图1-3 面向过程方法所构造系统的基本架构

面向过程方法侧重于建立解决问题的处理流,数据结构是根据程序算法步骤的要求开发的,它贯穿于整个过程中,提供过程所要求操作的信息。

系统在运行中处于什么状态,可用一组全局变量来描述,并把系统当前状态用一组值保存在这组全局变量中,可从一个过程传送到另一个过程。

用面向过程方法建立起来的软件结构是由一系列程序模块组成的,目前已经有许多支持开发的工具,例如,用c语言或Pascal语言编写的程序都属于面向过程的方法,解决问题的每一步都必须用一条条程序语句写在程序里。

二、面向对象方法

面向对象方法是问题分解方法的演化结果。这种方法在考虑问题解决方法时优先考虑的不是按照功能建立系统,而是问题域中的实体。

该方法把标识和模型化问题领域中的主要实体作为系统开发的起点,主要考虑实体对象的行为而不是必须执行的一系列动作。

面向对象软件中的基本单位是对象,它是数据抽象与过程抽象的综合体。

数据抽象就是对象中的属性,过程抽象就是对象中操作属性值的一系列方法。

软件系统在运行中的状态用各个对象的属性值来表述。

完成系统功能所涉及的控制流是由包含在各个对象中的方法,以及各个方法之间传送的消息组成的,可以在将来修改软件系统时使得整个系统的架构保持稳定。

图1-4给出一个draw程序的面向对象体系结构。图1-4 一个draw程序的面向对象体系结构

图中的箭头描述了从一个对象传送到另一个对象的消息。

这个体系结构中的对象有外部的物理实体,如鼠标、键盘和显示器等;

还有数据实体,如事件、图形、队列等;以及控制实体,如事件处理器等。

在系统中还存在继承关系,描述了一般和特殊的关系,如图形可具体化为矩形、椭圆形和三角形等。

总之,面向对象方法的出发点和基本原则是尽量模拟人类习惯的思维方式,使开发软件的方法和过程尽可能接近人类认识问题和解决问题的方法与过程,从而使描述的问题空间与其解决空间在结构上尽可能一致。

用面向对象方法开发软件的过程是多次反复迭代的演化过程。

面向对象方法在概念和表示方法上的一致性,保证了各项开发活动之间的平滑过渡。对于大型、复杂及交互性比较强的系统,使用面向对象方法更有优势。

三、形式化方法

形式化方法是一种基于形式化数学变换的软件开发方法,它可将系统的规格说明转换为可执行的程序。过程的描述如图1-5所示。为了简化模型,过程的迭代在图中没有画出。图1-5 形式化方法

形式化方法的主要特点如下。(1)软件需求规格说明被细化为用数学记号表达的详细的形式化规格说明。(2)设计、实现和单元测试等开发过程由一个变换开发过程代替。通过一系列变换将形式的规格说明细化成为程序。

1.3 软件过程与软件生存周期

一、软件生存周期

软件生存周期是软件产品的一系列相关活动的整个生命期,即从形成概念开始,经过开发、交付使用,在使用中不断修改和演进,直到最终被废弃,被新的软件产品代替的整个时期。

根据软件工程实践,人们把软件生存周期划分为软件定义、软件开发和交付后运行维护3个时期,每个时期又进一步划分为若干阶段。

1.软件定义时期的基本任务

软件定义时期的主要任务是解决“做什么”的问题。(1)确定工程的总目标和项目范围。(2)开展可行性研究。(3)需求获取。(4)制订项目计划。

2.软件开发时期的基本任务

软件开发时期的主要任务是解决“如何做”的问题。给出待开发软件的设计方案并构造出待开发软件。

这一时期又可分为概念设计、概要设计、详细设计、编码和测试等阶段。(1)概念设计:这个阶段包括两大任务,一是建立分析模型,从功能、数据、行为等方面细致地描述系统的静态特性和动态特性,引入软件的各种需求细节。二是基于分析结果,编写软件需求规格说明,确认测试计划和初步的用户手册(2)概要设计:从系统的输入/输出入手,搭建系统的体系结构和全局数据结构,同时对软件的人机交互界面和运行控制机制建模。(3)详细设计:对软件体系结构中的每一成分(构件)进行算法和局部数据结构设计,同时设计人机交互界面的细节、构件内部的处理细节和构件在实际运行环境下的部署。(4)编码:使用某种编程语言把设计结果转换为程序代码,同时进行单元测试,发现差错需进行调试(排错),还可能要执行回归测试。(5)测试:通过集成测试组装系统;通过系统测试检查系统的实现是否与软件需求规格说明保持一致,通过接受测试检验软件产品的实用性。

3.交付后维护时期的基本任务

交付后维护时期的主要任务是使软件持久地满足用户的需要。通常有4类维护活动。(1)改正性维护:诊断和改正在使用过程中发现的软件错误所做的维护。(2)适应性维护:修改软件以适应环境的变化所做的维护。(3)完善性维护:根据用户的要求改进或扩充软件使其更完善所做的维护。(4)预防性维护:修改软件为将来的维护活动预先做准备。

二、软件过程

在从事软件开发工作时,由于项目的类型、规模不同,因而使用的开发方法不同,开发时需执行的活动也会有差异。但不论是何种情况,最基本的活动都可归为以下4种。(1)软件规格说明:定义软件产品的功能和操作约束。(2)软件设计与实现:生产满足规格说明的软件产品。(3)软件确认:确认软件产品的有效性,确保该软件产品所做的是用户所需要的。(4)软件演进:改进软件产品,满足用户新的需要。这些活动的集合就构成软件过程。

通常定义软件过程为软件生存周期中一系列相关软件工程活动的集合,它是由一组工作任务、软件阶段里程碑、工作制品和交付物以及质量保证检查点组成的。一个软件开发组织应有一个过程框架,如图1-6所示。图1-6 软件过程的框架

这个过程框架定义了少量可用于所有软件项目的活动,针对各个项目的具体特点和项目组的需求,可以选取和构建适合于该项目的过程活动。

保护伞活动,如软件质量保证、软件配置管理等,它们独立于任何一个框架活动并将贯穿于整个过程中。

1.4 软件过程模型

软件过程模型也称为软件生存周期模型,每个过程模型从某个特定视点描述了一个生存周期过程,从而提供了有关该过程的特定信息。下面介绍一些常用的过程模型。

1.编码—修补模型

这是没有掌握软件工程的人们最常用的过程模型。实现产品时没有需求规格说明,也没有设计,开发者只是简单地将代码拼凑在一起。为了满足客户要求,需多次改写该软件。该过程模型的描述如图1-7所示。图1-7 编码—修补模型

尽管这种方法可以成功地开发100行或200行的小程序,但对于规模较大的软件来说,编码一修补模型则完全不能令人满意。

软件工程实践表明,如果已经编出代码或产品已经交付并安装在客户计算机上,则修改软件产品的代价会相当大。因此,编码—修补方法的实际花费远远大于有正确的规格说明、经过仔细设计的产品所需的花费。另外,对没有规格说明和设计文档的产品进行维护相当困难。

2.瀑布模型

瀑布模型是1970年由Royce提出来的,它规定了需要进行的各项软件工程活动,以及这些活动自上而下、相互衔接的固定次序,如同瀑布流水,逐级下落。

瀑布模型要求在任何阶段所得到的可交付物被认可之前,不能认为该阶段已完成。只有当该阶段的可交付物(包括文档)经过技术评审得到认可,并成为里程碑后,才能认为该阶段结束,并可进入下一阶段。

瀑布模型如图1-8所示。图中用虚箭头表明产品在开发时期维护的反馈环和交付后维护的反馈环。图1-8 完整的瀑布模型

瀑布模型的阶段划分清晰,对每个阶段需要交付哪些文档做了清楚的规定,并且对每个阶段的活动坚持进行阶段评审,确保每个阶段可能发生的差错不会遗留到后续阶段。

然而这种模型的线性过程太理想化,不适合现代的软件开发模式,其问题在于各阶段的划分固定,缺乏灵活性,阶段间产生大量文档,极大地增加了工作量。

由于开发模型基本上是线性的,用户只有等到整个过程的末期才能见到开发成果,从而增加了开发风险。早期的错误可能要等到开发后期的测试阶段才能发现,进而会产生严重的后果。

3.快速原型开发模型

快速原型又称为演化模型,是基于快速开发一个满足最初构想的模型的想法提出来的。由于在软件开发初期人们对软件的认识不够清晰,使得开发难于一次成功,出现返工在所难免。因此,可以先做试验开发,其目的只在于探索可行性,弄清软件需求,然后在此基础上获得较为满意的软件产品。通常把第一次得到的试验性产品称为“原型”。

图1-9给出快速原型开发模型的步骤。第一步是建造一个快速原型,并让客户和未来的用户试用此原型。一旦客户认为原型确实满足了他们的要求,开发人员就可以编写规格说明文档,并确信计划中的产品能够满足客户的实际要求。当原型得到确认后,就可以参照它继续进行软件产品的开发。图1-9 快速原型开发模型

使用快速原型开发模型的好处是可以大大减少返工。原因是:

第一,开发组成员使用快速原型与客户沟通,可快速确认需求规格说明;

第二,通过快速原型的实际运行,软件设计人员可以从中了解哪些事情应该做,哪些事情不能做;

第三,由于初步的工作模型已经建造出来,可作为后续设计和实现的参考。

4.增量模型

增量式开发方法是1980年由Mills等提出来的,又被称为迭代—递增开发模型,如图1-10所示。使用增量式开发方法开发软件时,把软件产品作为一系列的增量来设计、实现和确认。然后把增量集成到系统中,最后可得到一个完整的软件系统。图1-10 增量模型

每个增量可以是一个子系统,也可以是一个或多个相关的模块,能够完成特定的功能。使用增量开发模型,客户不必等到整个系统全部完成就能得到他们所需要的功能。优先级最高的服务首先交付,然后再将其他增量逐次集成进来。

一个必然的事实是:最重要的系统服务将接受最多的测试,这意味着系统最重要的部分一般不会遭遇失败。

每个增量的开发都可以采用瀑布模型的方式。

5.快速应用开发模型

快速应用开发模型也是一种增量式软件过程模型,它强调采用极短的开发周期(如2~3个月),在基于可复用构件的编程环境中构造应用程序。RAD模型的框架活动如图1-11所示。图1-11 快速应用开发模型(RAD)

模型各个阶段的主要活动如下。(1)沟通:与客户和领域专家协同,理解相关业务和待开发软件应具有的各种特性。(2)策划:进行任务分解,安排开发过程,确保各个开发组依次完成增量的开发。(3)建模:包括以下3个主要步骤。

①业务建模:对业务功能中的信息流进行建模。用以明确驱动业务过程的信息是什么,生成了哪些信息,是谁生成了这些信息,信息流向了什么地方,谁处理了这些信息。

②数据建模:对作为业务建模一部分信息流进行进一步求精而得到一组数据对象。

③流程建模:从数据建模中的数据对象出发,根据每一个要实现韵业务功能的需要,给出对每一个数据对象操作的过程化描述。(4)构建:以RAD模型为基础,构造待开发的软件系统。

①从已有的可复用软件构件中选择适用的构件,必要时也可建立新的软件构件。

②使用代码自动生成技术构造待开发的软件系统。

③已有的可复用构件一般都经过了严格的测试,对于它们只需要进行确认测试,但是对于那些新开发的构件必须进行测试,对所有的用户界面程序也必须进行测试。

使用RAD模型能够快速地完成整个应用系统的开发。

6.螺旋模型

螺旋模型是1988年由Boehm提出来的。该模型将瀑布模型与快速原型模型结合起来,并且加入两种模型均忽略了的风险分析。

在螺旋模型中,软件过程被表示成一条螺线,螺线每转一圈表明软件过程的一个阶段完成。最内层的一圈是项目启动时进行需求获取和可行性研究活动,第二圈是进行软件需求建模和编写需求规格说明,再外一圈是进行系统设计等,如图1-12所示。图1-12 螺旋开发模型

螺线上的每一圈可划分为4个象限,分别表达了4个方面的活动。(1)目标设定:定义该阶段的阶段目标,弄清对过程和产品的限制条件,制订详细的管理计划,识别项目风险,可能还要计划与这些风险有关的对策。(2)风险评估与弱化:针对每一个风险进行详细分析,设想弱化风险的步骤。(3)开发与确认:评价风险之后再选择系统开发模型。(4)计划:评价开发工作,确定是否继续进行螺线的下一圈。如果确定要继续,则计划项目下一个阶段的工作。

软件开发中总会有风险。例如,在产品充分归档前,关键人物可能会离职;产品主要依赖的硬件生产商可能会破产;在投入了大量金钱开发一个主要的软件产品之后,技术上的突破可能使整个产品的价值全无;在集成产品时发现可能无法将产品的构件组合在一起。为了保全产品的价值,软件人员应尽力把这些风险减到最小。

7.同步—稳定模型

同步—稳定模型是1997年由Cusumano和Selby提出的,主要用于微软公司的软件开发生存周期模型。许多软件包都是使用这个模型构建的。

模型要求在需求分析阶段访问软件包的多个潜在客户,提取对客户具有最高优先级的特性列表,拟制规格说明文档。

之后将工作分为3或4个构建(Build),第一个构建包含最重要的特性,第二个构建包含次重要的特性,如此处理下去。每个构建都由多个小组并行开发完成。

每天工作结束前,所有小组进行工作同步(Synchronize),也就是把完成的部分构建放在一起,测试和调试得到的产品。

在每个构建结束时进行稳定化(Stabilization)工作。修补目前检测到的遗留差错,将该构建冻结(Freeze),也就是不再修改规格说明。

模型要求开发人员必须遵循的规则并不多,最重要的有以下两条。(1)每天软件人员必须把他们的代码输入到产品数据库中,以便同步当天的工作。(2)如果一个开发人员的代码阻碍了该产品当天的同步编译,则必须立刻解决问题,这样才能由小组的其他人测试和调试当天的工作。

重复的同步步骤保证各个构建总能一起工作。这种模型的优点是,开发人员能够及时掌握产品的工作状态,必要时在构建生成的过程中修改规格说明。

8.开源过程模型

几乎所有成功的开源软件项目都经历过两个阶段。

第一个阶段是初始阶段,一个软件从业人员把他的一个编程构想付诸实践,并建立了一个初始版本,然后把这个程序免费上传到网络上供别人下载。如果有网友下载了他的这个初始版本并认为该程序能够满足他们的需求,这个程序就会被这些网友使用。

第二个阶段是成熟阶段,网友变成了合作开发者,一些网友会报告程序中可能存在的缺陷,而另一些网友则会提出修复这些缺陷的建议。还有一些网友会提出扩充该程序的想法,而另一些网友则会实现这些想法。随着程序在功能上的扩充,另一些网友还会将该程序的接口进行转换,以便能够运行在其他的操作平台上。

这些参与合作的人都是利用业余时间在开源项目上自愿工作的,他们不索取报酬。

第二个阶段中的主要活动与交付后的维护活动类似,主要分为3类:改正性维护(报告并纠正程序中的缺陷)、完善性维护(增加新的功能)、适应性维护(为该程序建立一个向新环境转换的接口)。

9.极限过程

极限编程是2000年以后发展起来的一种新的软件开发方法。此种开发方式要求软件开发组首先确定客户希望产品支持的各种特性(用户故事)。对于每个特性,开发组应向客户通报实现这个特性需要的时间和花费。然后客户使用成本—效益分析方法选择每个后续的构建所应包含的特性,也就是根据开发组提供的时间、成本估算和该特性给客户带来的潜在收益来进行选择。

在软件开发过程中,把将要执行的构建分解为更小的部分,称为任务(Task)。

一个程序员首先应设计该任务的测试用例再做开发,这种工作方式称为测试驱动开发(TDD)。

然后两个程序员在一台计算机前一起工作,以结对编程的方式完成任务,并确保全部测试用例都能正确工作。

两个程序员每15或20分钟交替操作键盘,不进行键盘操作的程序员仔细检查同伴的代码。

之后把这个任务集成到产品的当前版本中。在理想情况下,实现和集成一个任务只需几个小时。通常结对的程序员会并行地完成任务,使集成可以连续进行。

如果可能,每天更换小组成员的编码同伴。从其他组员处的学习会提高每人的技能水平。

各任务所使用的TDD测试用例被保留下来并应用到所有进一步的集成测试中。

与通常开发软件所使用的方法相比,极限编程有许多不同的特性。(1)XP小组的所有成员在一个大房间中工作,大房间中有许多彼此相连的小隔间。(2)一个客户代表一直与XP小组一起工作。(3)没有一个人能够连续两周超时工作。(4)没有规格说明,而是XP小组的所有成员一同完成规格说明、分析、设计、编码和测试。(5)在构建出各种构件之前没有概要设计步骤。相反,在构建产品的过程中设计会被不断地调整,这个过程称为重组(Refactoring)。只要测试用例执行得不到正确结果,就需要重新组织代码,直到小组满意地认为这个设计是简单、易懂的并能正确地运行所有测试用例。

极限编程的原则是最小化特性的数量;不必生产客户实际上不需要的产品。

极限编程是一些新的统称为敏捷过程(Agile Process)的开发方法中的一个。敏捷软件开发方法除了极限编程外还有其他方法。它们的共性有以下几点。(1)不强调分析和设计。在开发过程中很早就开始编程和测试,因为能工作的软件比具体的文档更重要。(2)强调与客户的协作,并响应需求变化。(3)频繁交付可运行的软件,最好每2或3周一次。在敏捷过程中为每个迭代设定的典型时间为3周。换句话说,敏捷过程要求固定的时间,而不是固定的特性。(4)每日上班前有一个站立会议,进行交流。每个小组成员要依次回答5个问题:从昨天的会议到现在我做了什么?今天我要做什么?完成今天的工作将遇到什么问题?我们忘记了什么?我可以与小组成员分享的经验是什么?

敏捷过程的两个基本原则是:交流与尽可能快地满足客户的需要。

10.Rational统一开发过程

Rational统一开发过程(RUP)是用例驱动的、以体系结构为核心的、迭代的、增量的过程。它从3个视角来描述。(1)动态视角:给出模型随时间所经历的各个阶段。(2)静态视角:给出所规定的过程活动。(3)实践视角:建议在过程中采用最佳软件工程实践。

RUP将一个大型项目分解为可连续应用瀑布模型的几个小部分。在对一部分进行需求分析和风险、设计、实现并确认之后,再对下一部分进行需求分析、设计、实现和确认。以此进行下去,直到整个项目完成,这就是迭代式开发。

RUP的动态视角聚焦在产品的迭代开发上。在RUP中迭代过程分为4个阶段。各阶段中的过程活动与业务紧密关联。图1-13给出了RUP中的阶段划分。图1-13 RUP中的阶段(1)初始阶段(Inception):此阶段的目标是建立系统业务的用例。标识所有与系统交互的外部实体(人、事或相关系统),并定义它们与系统的所有交互。(2)细化阶段(Elaboration):此阶段的目标是增进对问题域的理解,计划需完成的活动和资源,详细说明产品特性并识别关键风险,然后建立系统体系框架。这个阶段结束时可得到系统的需求模型、软件系统的体系结构描述和开发计划。(3)构造阶段(Construction):此阶段将构造完整的产品,逐步完成系统各个部分的并行开发,再逐步集成。在这个阶段结束时可得到一个能工作的软件系统以及相关文档。(4)移交阶段(Transition):此阶段关注如何将系统从开发部门移交给用户,并使之在实际环境中工作,包括制造、交付、培训、支持及维护产品。此阶段结束时可得到在实际操作环境下能正常工作的软件系统及相关文档。

这4个阶段构成一个开发周期,周期结束时产生一代新的软件产品。软件产品产生于初始开发周期,随着同样的过程重复执行,软件发展到下一代,这一时期即为软件的进化周期。迭代周期如图1-14所示。图1-14 RUP的迭代周期

用户需求的变更、基础技术的变化、竞争都可能激活新的进化周期。周期之间在时间上会有重叠。后一个周期的初始与细化阶段与前一个阶段的移交阶段可能同时进行。在各阶段内也包含有一个或几个迭代过程。

RUP的静态视角聚焦在开发过程中活动的组织方面。在RUP描述中,用工作流来描述能够生成有用结果的活动序列,用以描述工作人员之间的交互。

在RUP的每一个迭代周期中涉及6个核心工程工作流,3个核心支持工作流。RUP是结合UML设计的,UML是一个面向对象建模语言,所以工作流描述围绕着UML模型给出。核心工程工作流和支持工作流的描述如表1-1所示。表1-1 RUP中的工作流工作流描述业务建模使用业务用例对业务过程进行建模找出与系统进行交互的参与者并开发用例,完成对

需求系统需求的建模分析和设使用体系结构模型、构件模型、对象模型和交互模计型来创建并记录设计模型实现系统中的构件并将它们合理安排在子系统中。

实现从设计模型自动生成代码有助于加快此过程测试是一个反复过程,它的执行是与实现紧密相关

测试的。系统测试紧随实现环节的完成

部署创建和分发产品版本并安装到它们的工作场所配置和变支持工作流管理对系统的变更更管理项目管理支持工作流管理系统开发

环境用于提供软件开发团队可用的合适的软件工具

RUP的实践视角描述的是系统开发中所需要的最佳软件工程实践。RUP主张的6个最佳软件工程实践如下。(1)迭代式地开发软件:基于螺旋模型组织一个迭代的和增量的开发过程,并根据客户的轻重缓急来规划系统的增量,在开发过程中先开发和交付最高优先权的系统特征。(2)管理需求:管理需求包括3种活动,一是需求获取并记入文档;二是估计生存周期的需求变化并评估它们的影响;三是跟踪、记录和权衡所做出的各种决策。(3)使用基于构件的软件体系结构:使用构件可以创建有弹性的体系结构,如使用模块化方法,开发人员可以区分和关注系统中易变的元素;使用标准化框架(如CORBA、EJB、COM+)和其他商品化构件可以提供软件的可复用性。(4)建立可视化的模型:模型是现实的简化,用于从特定的视角完整地描述一个系统。通过模型化,可将系统体系结构的结构和行为可视化、具体化;可以提供一系列方案,用以解决软件开发所遇到的问题;还可以帮助开发人员提高管理软件复杂性的能力。(5)不断地验证软件质量:在软件实施之后再查找和发现软件问题,比在早期就进行这项工作需多花10~100倍的费用。因此,必须不断地对软件质量进行评估。(6)控制对软件的变更:为使软件开发人员、开发组的活动和产品协调一致,必须建立管理软件变更的工作流,在迭代过程中,持续监控变更,动态地发现问题并及时反映。每次迭代过程结束时需建立和发布经过测试的基线,保证迭代过程与发布版本协调一致。

1.5 软件工具概述

软件工程师需要两种类型的工具。

一是用于软件开发的分析工具,如逐步求精法和成本—效益分析;

二是软件工具,即辅助软件工程师开发和维护软件产品的工具软件,这些软件工具统称为CASE(Computer Aided Software Engineering,计算机辅助软件工程)工具。

1.逐步求精法

逐步求精是一种解决问题的技术,是许多软件工程技术的基础。逐步求精可定义为“尽可能将细节的定义推延到最后,以便集中精力在重要的事项上”的一种方法。

在软件开发过程中,在每一个开发阶段都需要使用逐步求精法,建立需求规格说明、设计方案和程序的源代码。通过迭代和增量,不断改进和完善软件的各种制品。

2.成本—效益分析法

成本—效益分析法是想要对软件产品的未来收益和成本做出估计和对比,以确定开发一个软件工程项目是否合算。对于有形的收益,可以直接计算,而对于无形的收益则很难直接量化。为了确定无形的收益,通常的做法是通过一些假设来估算无形的收益。

成本—效益分析法用于确定客户是否应当实现计算机化来完成他们的业务工作。一旦确定要使用计算机系统处理他们的业务,还要比较各种可能解决方案的成本和收益,选择收益和成本之间差异最大的方案作为最佳方案。

3.软件度量

软件度量主要分为产品度量和过程度量。

产品度量是测量产品的某些特性,如规模或可靠性;

过程度量是推断有关软件开发过程的某些信息,如开发过程中错误检测的有效性,可用开发过程中检测出的错误数与在产品整个生存周期检测出的错误数之比度量。

进行软件度量的目的是根据已有的度量数据预测类似项目产品或过程可能存在的问题。基本度量有以下5方面。(1)规模:软件产品的源代码行数或功能点数。(2)成本:开发过程的实际费用,按人民币、港币或美元计。(3)时间:开发持续时间,按月计。(4)工作量:开发实际花费的工作量,按人月计。(5)质量:在开发期间检测到的错误数。

这些度量数据中的每一个都必须按开发阶段进行测量,通过这些度量数据,软件项目管理人员可以发现软件组织内部的问题,考虑解决方案。

为监测项目解决方案是否成功,人们还可以引入更具体的度量。一个重要的观点是:只有度量软件过程,才能控制软件过程。

4.软件工具与CASE

在软件产品的开发过程中,除了评估资源要求、编写规格说明文档、进行集成测试以及编写用户操作指南等外,在软件开发的每一阶段都可以借助一些软件工具完成与软件开发有关的大部分繁重的工作。

早期的软件工具,如编辑程序、编译程序、排错程序等,主要用于辅助程序员编程。在进入软件工程阶段以后,出现了一批软件工具来辅助软件工程实施,这些软件工具涉及软件开发、维护、管理过程中的各项活动,并辅助这些活动高质量地进行,这些软件工具统称为CASE(计算机辅助软件工程)工具。CASE工具的作用如下。(1)支持各种软件开发方法,辅助软件工程方法和过程的实施。(2)提高软件开发、维护和管理效率。(3)提供检测机制,提高软件质量。

5.CASE的分类

1993年Fuggertta对CASE工具进行了分类,如图1-15所示。图1-15 CASE工具分类

其中,工具是指支持软件开发单个活动或任务的软件工具。

工作台是指支持某一软件过程或一个过程中一组活动的工具集。

环境是指支持某些软件过程以及相关的大部分活动的工具集,它集成了若干工作台,它有两个作用:集成化环境提供对数据集成、控制集成、表示集成机制的基本支持;而以过程为中心的环境则利用过程模型和过程引擎提供对软件开发活动的导引。

如果按软件过程的活动进行分类,有如下3类CASE工具。(1)支持软件开发的工具:主要有分析和设计工具、编程工具、调试工具、测试工具等。此外,还可以根据工具所支持的开发方法进行细分,如可将分析工具分为结构化分析工具及面向对象分析工具。(2)支持软件维护过程的工具:主要有版本控制工具、文档分析工具、信息库开发工具、逆向工程工具、再工程工具等。(3)支持软件管理过程和支持过程的工具:主要有项目管理工具、配置管理工具、软件评价工具等。

6.版本工具

软件产品开发的每一个阶段都会生成一些可交付物,如各种文档、表格、代码等,它们可能会成为最终软件产品的一部分,这些可交付物称为软件制品。对于这些软件制品,只要修改过它们,就会产生这些软件制品的新版本,因此需要进行软件制品的版本控制。

需要进行版本控制的有两种类型的版本。(1)修订版本:假设软件产品交付后已在多个不同的地点进行了安装,如果在某一制品中发现了错误,就需要修复它。然而经过修改后,该制品就会有两个版本,即老版本和新版本(也称为修订版)。按照常理,这些新老版本都应保留。理由是:①即使测试了新版本,但仍不能保证新版本比老版本更正确。②产品可能已经被分发到许多地方,但在这些地方并没有都安装新版本。(2)变种版本:为了支持不同的设备,需要开发同一制品的不同版本,这就是变种版本。例如,当计算机系统既要支持喷墨打印机,又要支持激光打印机时,操作系统的打印机驱动程序针对每一种打印机,都需要有一个变种版本。

图1-16显示了修订版本和变种版本的例子。如果每个变种版本又有多个修订版本。这时,为了避免陷入多个版本的泥潭,软件开发组织需要使用CASE工具。图1-16 软件制品的多个版本示意图

7.配置控制

每个软件制品的代码通常以3种形式存在,第一种是源代码;第二种是目标代码,也称为编泽代码;第三种是编译代码与运行时例程结合形成的可执行载入映像,如图1-17所示。图1-17 可执行载入映像的构件

程序员可以使用每个制品的多种不同的版本。某个特定版本的软件产品就是由这些制品的指定版本构建而成的,称这些选定版本的软件制品为该软件产品的配置。

版本控制工具是管理各个软件制品或产品的版本的工具,它的作用有以下几个。(1)管理所有经过评审认定合格的软件制品或产品的各种修订版本和变种版本。(2)一旦发现软件问题,可以查出可执行载入映像包含了哪些制品及其版本号。(3)可自动管理变种版本。对最初的变种版本的任何修改都可以自动应用到所有其他相关的变种版本上。

8.建造工具与版本控制工具一同使用,可以帮助选择要链接的每个编译代码制品的正确版本,从而形成该产品的一个特定版本。因为版本控制工具可以帮助用户区分源代码制品的不同版本,从产品配置库中选择各个制品的多个变种版本和修订版本。

但是,由于编译代码在编译后版本信息可能缺失,因此可以使用UNIX工具make来解决这个问题。UNIX利用makefile给每个文件标附上日期和时间标记,这种make就是一种建造工具,可以检验载入映像是否体现了每个制品的当前版本。如果是,就不用再做什么,也不会在不需要的编译和链接上浪费CPU时间。如果不是,则make将调用相关的系统软件生成产品的最新版。像make这样的工具已经被加到不断变化的编程环境中,包括Visual Java和Visual C++。make的一个开源版本是Ant(Apache项目的一个产品)。小结

本章在讨论软件和软件工程的概念时,把所有软件归纳为7种类型,并特别强调了软件工程框架,从目标、原则和过程3个侧面指出软件工程的主要关注点。在讨论软件工程方法时,仅介绍了3种典型的软件开发方法。

在讨论软件过程和软件过程模型时,首先介绍了软件生存周期的概念,这是全书内容的主线,也是软件工程学的核心。这种把软件开发划分成多个阶段的思想影响很大,几乎所有的软件开发过程都能见到它的影子。

本章介绍了9种过程模型,从最原始的编码—修补模型,到瀑布模型、快速原型模型,是一种线性的开发模式。之后介绍的增量模型、快速应用开发模型、同步—稳定模型、螺旋模型和Rational统一开发过程模型,由于引入了迭代和增量的因素,形成了二维的开发模式。

最后,讨论了软件工具。前3个工具是系统方法,包括逐步求精法、成本—效益分析和软件度量,是软件开发的思维方式、产品和过程控制的方法。

在此之后,才讨论开发工具软件和CASE环境等。它们支持了软件工程方法和软件过程的良好实施。

第2章 面向对象的基本概念与UML[视频讲解]

面向对象方法是一个非常实用且有效的软件开发方法。它起源于20世纪60年代末挪威的K.Nyguard 等人推出的编程语言Simula67。

在这个语言中引入了数据抽象和类的概念,但真正使面向对象程序设计得到广泛应用的是Smalhalk语言。

几十年来,面向对象语言得到蓬勃发展,其中有代表性的包括Objective C(1986)、C++(1986)、Self(1987)、Eiffel(1987)、CLOS(1986)以及Java(1995)等。

考核目标:

1.了解面向对象的基本概念,包括什么是面向对象、对象、类、封装、继承、多态、消息通信等。

2.了解UML的产生和它的主要特点。

3.了解UML的模型元素,包括结构事物、行为事物、分组事物、注释事物,以及依赖、关联、泛化和实现关系。了解它们的使用场合和主要特点。

4.了解UML主要的图,包括各种图的作用,图形元素和适用的场合。

2.1 面向对象系统的基本概念

面向对象(Object—Oriented,OO)方法是软件开发的一种主流方法。

面向对象方法以客观世界中的实体为中心,其分析和设计思想符合人们的思维方式,分析和设计的结果与客观世界的实际比较接近,容易被人们所接受。

一、面向对象系统的概念

为了讨论面向对象的系统,必须首先明确什么是“面向对象”。

Coad和Yourdon给出了一个定义:面向对象=对象+类+继承+消息通信。如果一个系统是使用这样4个概念设计和实现的,则可认为这个系统是面向对象的。

一个面向对象的程序系统的每一个组成部分应是对象,计算是通过新的对象的建立和对象之间的通信来执行的。

面向对象系统的特色如下。(1)系统的定义从问题领域的实体出发,与人类习惯的思维方式一致。(2)搭建的系统结构稳定性好,修改可以局部化。(3)系统及体系结构可以使用构件组装,可复用性好。(4)软件系统容易理解,容易修改,容易测试,适合于开发大型的软件产品。(5)软件体系结构严格按照信息(细节)隐蔽的原则设计,产品可维护性好。

二、对象

1.对象的定义

对象(Object)是系统中用来描述客观事物的实体,是构成系统的基本单位。

每个对象可用它的名字、对象本身的一组属性和可以执行的一组操作来定义。

例如,student对象的属性可能有姓名、性别、出生日期、家庭住址、电话号码等,其操作可能是对这些属性的赋值及值的更改。

图2-1给出了对象的表示方法。图2-1 对象的图形表示

从图中可以看到,对象与后面讲的类具有几乎完全相同的表示形式,主要差别是在对象的名字下面要加一条下画线。

对象(1)第一种格式是有名对象。形如:对象名:类名。(2)第二种格式是无名对象。形如:类名。(3)第三种格式是默认类型对象。形如:对象名。

第三种格式不带类名,对象的类由其上下文决定。图2-1中的对象名采用的即是此格式。

对象有两个层次的概念。(1)在系统模型中对象指的是系统模型所涉及的实体。可以是有形对象,如人、学生、电梯、房屋等;也可以是抽象的逻辑对象,如事件、调度器。(2)程序中的对象就是一组变量和相关操作(或方法)的集合,其中变量表明对象的状态,操作表明对象所具有的行为。

可以将系统中的对象分为5类:物理对象、角色、事件、交互、规格说明。

每个应用系统可以拥有某几种或所有各种对象,但也不必特意对每个对象进行分类。

2.对象的特点(1)对象是消息处理的主体。在面向对象系统中,每个对象不是消息的发送者,就是消息的响应者,不存在既不发送消息也不接收消息的对象。(2)对象是以数据为中心的。所有操作都与对象的属性相关,而且操作的结果往往与当时所处的状态(属性的值)有关。(3)实现了数据封装。对象是一个黑盒,其属性值对外不可见,被完全封装在盒子内部,对属性值的访问只能通过界面中定义的(公有)操作进行。

三、类与封装

1.类的定义

类(Class)是一组具有相同属性、相同操作、相同语义的对象的集合。

类的定义包括类名、一组数据属性和在这组属性上的一组合法操作。

例如,可以将学生对象所属的类定义为Stud6nt。注意类名不加下画线。属于一个类的各个对象都是类的实例(Instance),它们的数据结构都与类定义的属性相同,但各个实例具有不同的属性值。它们都可以使用在类中定义的操作。

一个实例的属性在面向对象的程序中称为该实例的实例变量,实例变量的值一旦确定,该实例的状态也就确定下来。

2.类与封装

类的定义应遵循抽象数据类型(ADT)的原则,按照使用与实现分离的要求,封装类的属性和操作定义。

为此,必须把可提供给外部使用的操作定义在类的接口部分(在C++中这部分的存取权限为public)。

封装的定义如下。(1)清楚的边界,所有对象的内部信息被限定在这个边界内。(2)接口,即对象向外界提供的方法,外界可以通过这些方法与对象进行交互。(3)受保护的内部实现,即软件对象功能的实现细节,实现细节不能从类外访问。

通过封装规定了程序如何使用对象的数据,控制用户对类的修改和数据访问权限。

在多数情况下是禁止直接访问对象数据的,只能通过接口访问对象。

由于封装特性禁止外界直接操作类中的数据,模块与模块之间只能通过严格控制的接口进行交互,这使得模块之间的耦合度大大降低,从而保证了模块具有较好的独立性,使得程序的维护和修改变得较为容易。

四、继承

如果某几个类之间具有共性的东西(属性和行为),把它们抽取出来放在一个父类中,将各个类特有的特性放在子类中分别描述,则可建立起子类对父类的继承。

例如,当使用Student类来说明面向对象的概念时,很自然会想到本科生(Undergraduate)和研究生(Graduate)。这两个类有很多相同的特性,但也有不同的地方。可以将这两个类的相同属性和操作抽取出来放在父类Student中,Undergraduate类和Graduate类只保留它们特有的属性和操作,并作为子类建立与Student类的继承关系,如图2-2所示。图2-2 类的继承关系

继承从内容上可划分为以下4种。(1)取代继承。例如“窗口”和“Windows窗口”的关系,任何需要“窗口”的地方都可以用“Windows窗口”来代替。此时,“窗口”可视为父类,“Windows窗口”作为“窗口”的子类。(2)内容继承。例如“四边形”与“矩形”的关系,“四边形”包括了“矩形”。(3)受限继承。例如“鸵鸟”是一种特殊的“鸟”,它不能继承“鸟”“会飞”的特性。这样,子类(“鸵鸟”)只能继承父类(“鸟”)

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载