第1章软件工程学概述11 被动地等待外界对它施加操作,相反,它是数据处理的主体,必须向它发消息请求它执行 它的某个操作以处理它的数据,而不能从外界直接对它的数据进行处理。也就是说,对象 的所有私有信息都被封装在该对象内,不能从外界直接访问,这就是通常所说的封装性。 面向对象方法学的出发点和基本原则,是尽量模拟人类习惯的思维方式,使开发软件 的方法与过程尽可能接近人类认识世界,解决问题的方法与过程,从而使描述问题的问题 空间(也称为问题域)与实现解法的解空间(也称为求解域)在结构上尽可能一致。 传统方法学强调自顶向下顺序地完成软件开发的各阶段任务。事实上,人类认识客 现世界解现实问题的过程,是一个渐讲的过程。人的认识需要在继承已有的有关知识 的基础上,经过多次反复才能逐步深化。在人的认识深化过程中,既包括了从一般到特殊 的演绎思维过程,也包括了从特殊到一般的归纳思维过程。 用面向对象方法学开发软件的过程,是一个主动地多次反复迭代的演化过程。面向 对象方法在概念和表示方法上的一致性,保证了在各项开发活动之间的平滑(即无缝)过 度。面向对象方法普遍进行的对象分类过程,支特从特殊到一般的归纳思维过程:通过建 立类等级而获得的继承性,支持从一般到特殊的演绎思维过程】 正确地运用面向对象方法学开发软件,则最终的软件产品由许多较小的、基本上独立 的对象组成,每个对象相当于一个微型程序,而且大多数对象都与现实世界中的实体相对 应,因此,降低了软件产品的复杂性,提高了软件的可理解性,简化了软件的开发和维护工 作。对象是相对独立的实体,容易在以后的软件产品中重复使用,因此,面向对象范型的 另一个重要优点是促进了软件重用。面向对象方法特有的继承性和多态性,进一步提高 了面向对象软件的可重用性。 1.3软件生命周期 概括地说,软件生命周期由软件定义、软件开发和运行维护(也称为软件维护)3个时 期组成,每个时期又进一步划分成若干个阶段。 软件定义时期的任务是:确定软件开发工程必须完成的总目标:确定工程的可行性 导出实现工程目标应该采用的策略及系统必须完成的功能;估计完成该项工程需要的资 源和成本,并且制定工程进度表。这个时期的工作通常又称为系统分析,由系统分析员负 责完成。软件定义时期通常进一步划分成3个阶段,即问题定义、可行性研究和需求 分析 开发时期具体设计和实现在前一个时期定义的软件,它通常由下述4个阶段组成:总 体设计,详细设计,编码和单元测试,综合测试。其中前两个阶段又称为系统设计,后两个 阶段又称为系统实现。 维护时期的主要任务是使软件持久地满足用户的需要。具体地说,当软件在使用过 程中发现错误时应该加以改正;当环境改变时应该修改软件以适应新的环境;当用户有新 要求时应该及时改进软件以满足用户的新需要。通常对维护时期不再进一步划分阶段 但是每一次维护活动本质上都是一次压缩和简化了的定义和开发过程。 下面简要介绍软件生命周期每个阶段的基本任务。 www.TopSage.com
www.TopSage.com
2软件工程导论 1.问题定义 问题定义阶段必须回答的关键问题是:“要解决的问题是什么?”如果不知道问题是什 么就试图解决这个问题,显然是盲目的,只会白白浪费时间和金钱,最终得出的结果很可 能是毫无意义的。尽管确切地定义问题的必要性是十分明显的,但是在实践中它却可能 是最容易被忽视的一个步骤 通过对客户的访问调查,系统分析员扼要地写出关于问题性质、工程目标和工程规模 的书面报告,经过讨论和必要的修改之后这份报告应该得到客户的确认。 2.可行性研究 这个阶段要回答的关键问题是:“对于上一个阶段所确定的问题有行得通的解决办法 吗?”为了回答这个问题,系统分析员需要进行一次大大压缩和简化了的系统分析和设计 过程,也就是在较抽象的高层次上进行的分析和设计过程。可行性研究应该比较简短,这 个阶段的任务不是具体解决问题,而是研究问题的范围,探素这个问题是否值得去解,是 否有可行的解决办法】 可行性研究的结果是客户作出是否继续进行这项工程的决定的重要依据,一般说来, 只有投资可能取得较大效益的那些工程项目才值得继续进行下去。可行性研究以后的那 些阶段将需要投人更多的人力物力。及时终止不值得投资的工程项目,可以避免更大的 浪费, 3.需求分析 这个阶段的任务仍然不是具体地解决问题,而是准确地确定“为了解决这个问题,目 标系统必须做什么”,主要是确定目标系统必须具备哪些功能。 用户了解他们所面对的问题,知道必须做什么,但是通常不能完整准确地表达出他们 的要求,更不知道怎样利用计算机解决他们的问题;软件开发人员知道怎样用软件实现人 们的要求,但是对特定用户的具体要求并不完全清楚。因此,系统分析员在需求分析阶段 必须和用户密切配合,充分交流信息,以得出经过用户确认的系统逻辑模型。通常用数据 流图、数据字典和简要的算法表示系统的逻辑摸型, 在需求分析阶段确定的系统逻辑模型是以后设计和实现目标系统的基础,因此必须 准确完整地体现用户的要求。这个阶段的一项重要任务,是用正式文档准确地记录对目 标系统的需求,这份文档通常称为规格说明书(specification)。 4.总体设计 这个阶段必须回答的关键问题是:“概括地说,应该怎样实现目标系统?”总体设计又 称为概要设计 首先,应该设计出实现目标系统的几种可能的方案。通常至少应该设计出低成本、中 等成本和高成本3种方案。软件工程师应该用适当的表达工具描述每种方案,分析每种 方案的优缺点,并在充分权衡各种方案的利弊的基础上,推荐一个最佳方案。此外,还应 www.TopSage.com
www.TopSage.com
第1章软件工程学概述3 该制定出实现最佳方案的详细计划。如果客户接受所推荐的方案,则应该进一步完成下 术的另一项主要任务 上述设计工作确定了解决问题的策略及目标系统中应包含的程序,但是,怎样设计这 些程序呢?软件设计的一条基本原理就是,程序应该模块化,也就是说,一个程序应该由 若干个规模适中的模块按合理的层次结构组织而成。因此,总体设计的另一项主要任务 就是设计程序的体系结构,也就是确定程序由哪些模块组成以及模块间的关系, 5.详细设计 总体设计阶段以比较抽象橙括的方式提出了解快问题的办法。详细设计阶段的任务 就是把解法具体化,也就是回答下面这个关键问题:“应该怎样具体地实现这个系统呢?” 这个阶段的任务还不是编写程序,而是设计出程序的详细规格说明。这种规格说明 的作用很类似于其他工程领域中工程师经常使用的工程蓝图,它们应该包含必要的细节 程序员可以根据它们写出实际的程序代码。 详细设计也称为模块设计,在这个阶段将详细地设计每个模块,确定实现模块功能所 需要的算法和数据结构。 6.编码和单元测试 这个阶段的关键任务是写出正确的容易理解、容易维护的程序模块 程序员应该根据目标系统的性质和实际环境,选取一种适当的高级程序设计语言(必 要时用汇编语言),把详细设计的结果翻译成用选定的语言书写的程序,并且仔细测试编 写出的每一个模块。 7.综合测试 这个阶段的关键任务是通过各种类型的测试(及相应的调试)使软件达到预定的 要求。 最基本的测试是集成测试和验收测试。所谓集成测试是根据设计的软件结构,把经 过单元测试检验的模块按某种选定的策略装配起来,在装配过程中对程序进行必要的测 试。所谓验收测试则是按照规格说明书的规定(通常在需求分析阶段确定),由用户(或在 用户积极参加下)对目标系统进行验收。 必要时还可以再通过现场测试或平行运行等方法对目标系统进一步测试检验。 为了使用户能够积极参加验收测试,并且在系统投入生产性运行以后能够正确有效 地使用这个系统,通常需要以正式的或非正式的方式对用户进行培训。 通过对件侧试结果的分析可以预侧软件的可靠性:反之,根据对软件可竞性的要 求,也可以决定测试和调试过程什么时候可以结束, 应该用正式的文档资料把测试计划、详细测试方案以及实际测试结果保存下来,作为 软件配置的一个组成部分 www.TopSage.com
www.TopSage.com
14软件工程导论 8.软件维护 维护阶段的关键任务是,通过各种必要的维护活动使系统持久地满足用户的需要。 通常有4类维护活动:改正性维护,也就是诊断和改正在使用过程中发现的软件错 误;适应性维护,即修改软件以适应环境的变化:完善性维护,即根据用户的要求改进或扩 充软件使它更完善:预防性维护,即修改软件,为将来的维护活动预先做准备。 虽然没有把维护阶段进一步划分成更小的阶段,但是实际上每一项维护活动都应该 经过提出维护要求(或报告问题),分析维护要求,提出维护方案,审批维护方案,确定维护 计划,修改软件设计,修改程序,测试程序,复查验收等一系列步骤,因此实质上是经历了 一次压缩和简化了的软件定义和开发的全时程 每一项维护活动都应该准确地记录下来,作为正式的文档资料加以保存。 以上根据应该完成的任务的性质,把软件生命周期划分成8个阶段。在实际从事软 件开发工作时,软件规模、种类、开发环境及开发时使用的技术方法等因素,都影响阶段的 划分。事实上,承担的软件项目不同,应该完成的任务也有差异,没有一个适用于所有软 件项目的任务集合。适用于大型复杂项目的任务集合,对于小型简单项目而言往往就过 于复杂了. 1.4软件过程 软件过程是为了获得高质量软件所需要完成的一系列任务的框架,它规定了完成各 项任务的工作步骤。 概括地说,软件过程描述为了开发出客户需要的软件,什么人(wo)、在什么时候 (when)、做什么事(what)以及怎样(how)做这些事以实现某一个特定的具体目标。 在完成开发任务时必须进行一些开发活动,并且使用适当的资源(例如,人员、时间 计算机硬件、软件工具等),在过程结束时将把输入(例如,软件需求)转化为输出(例如,软 件产品)。因此,IS09000把过程定义为“使用资源将输入转化为输出的活动所构成的系 统。”此处,“系统”的含义是广义的:“系统是相互关联或相互作用的一组要素。” 过程定义了运用方法的顺序、应该交付的文档资料、为保证软件质量和协调变化所需 要采取的管理措施,以及标志软件开发各个阶段任务完成的里程碑。为获得高质量的软 件产品,软件过程必须科学、有效 上一节曾经讲过,没有一个适用于所有软件项目的任务集合。因此,科学、有效的软 件过程应该定义一组适合于所承担的项目特点的任务集合。通常,一个任务集合包括- 组软件工程任务、里程碑和应该交付的产品(软件配置成分) 通常使用生命周期模型简洁地描述软件过程。生命周期模型规定了把生命周期划分 成哪些阶段及各个阶段的执行顺序,因此,也称为过程模型。 实际从事软件开发工作时应该根据所承担的项目的特点来划分阶段,但是,下面讲述 典型的软件过程模型时并不是针对某个特定项目讲的,因此只能使用“通用的”阶段划分 方法。由于瀑布模型与快速原型模型的主要区别是获取用户需求的方法不同,因此,下面 www.TopSage.com
www.TopSage.com
第1章软件工程学概述15 在介绍生命周期模型时把“规格说明”作为一个阶段独立出来。此外,问题定义和可行 性研究的主要任务都是概括地了解用户的需求,为了简洁地描述软件过程,把它们都 归并到需求分析中去了。同样,为了简洁起见,把总体设计和详细设计合并在一起称 为“设计” 1.4.1瀑布模型 ,在20世纪80年代之前,瀑布模型一直是唯一被广泛采用的生命周期模型,现在它仍 然是软件工程中应用得最广泛的过程模型。传统软件工程方法学的软件过程,基本上可 以用瀑布模型来描述。 如图1.2所示为传统的瀑布模型。按照传统的澡 需求分析 布模型开发软件,有下述的几个特点: 毁证 1.阶段间具有顺序性和依赖性 规格说明 这个特点有两重含义:①必须等前一阶段的工作 验证 完成之后,才能开始后一阶段的工作;②前一阶段的 输出文档就是后一阶段的输人文档,因此,只有前一阶 设计 证 段的输出文档正确,后一阶段的工作才能获得正确的 结果。 2.推迟实现的观点 缺乏软件工程实践经验的软件开发人员,接到软 综合测试 件开发任务以后常常急于求成,总想尽早开始编写程 。阳是,实践表明,对于规模较大的软件项目来说 维护 往往编码开始得越早,最终完成开发工作所需要的时 图1,2传统的澡布模型 间反而越长。这是因为,前面阶段的工作没做或做得 不扎实,过早地考虑进行程序实现,往往导致大量返工,有时甚至发生无法弥补的问题,带 来灾难性后果。 瀑布模型在编码之前设置了系统分析与系统设计的各个阶段,分析与设计阶段的基 本任务规定,在这两个阶段主要考虑目标系统的逻辑模型,不涉及软件的物理实现。 清楚地区分逻辑设计与物理设计,尽可能推迟程序的物理实现,是按照瀑布模型开发 软件的一条重要的指导思想。 3.质量保证的观点 软件工程的基本目标是优质、高产。为了保证所开发的软件的质量,在瀑布模型的每 个阶段都应坚持两个重要做法 (1)每个阶段都必须完成规定的文档,没有交出合格的文档就是没有完成该阶段的 任务。完整,准确的合格文档不仅是软件开发时期各类人员之间相互通信的媒介,也是运 行时期对软件进行维护的重要依据。 www.TopSage.com
www.TopSage.com