软件工程第七讲教案 下载本文

图 7-2传统的软件工程方法 图7-3面向对象的软件工程方法 2.传统的软件工程学

传统的软件工程方法指面向对象方法出现之前的各种软件工程方法,这里主要讨论结构化软件工程方法。 ( 1)需求分析

软件工程学中的需求分析具有两方面的意义。在认识事物方面,它具有一整套分析、认识问题域的方法、原则和策略。这些方法、原则和策略使开发人员(系统分析员)对问题域的理解比不遵循软件工程方法更为全面、深刻和有效。在描述事物方面,它具有一套表示体系和文档规范,这比仅用自然语言来表达更为准确,也更接近于后期的开发阶段。

但是,传统的软件工程学中的需求分析在上述两方面都存在不足。它对问题的描述不是以问题域中的固有的事物作为基本单位,并保持它们的原貌,而是打破了各项事物之间的界限,在全局范围内以功能、数据或数据流为中心来进行分析。例如功能分解法,把整个问题域看作一些功能和子功能;数据流法则把它看作一些数据流和加工。所以这些方法的分析结果不能直接地映射问题域,而是经过了不同程度的转化和重新组合。因此,传统的分析方法容易隐蔽一些对问题域的理解偏差,给后续开发阶段的衔接带来了困难。 ( 2)概要设计和详细设计

在概要设计阶段,以需求分析的结果作为出发点构造出一个具体的系统设计方案。主要是决定系统的模块结构,包括决定模块的划分,模块间的数据传送及调用关系。详细设计是在概要设计的基础上考虑每个模块的内部结构及算法,最终将产生每个模块的程序流程图。

经过概要设计和详细设计,开发人员对问题域的认识和描述越来越接近于系统的具体实现——编程。但是传统的软件工程方法中设计文档很难与分析文档对应,原因是二者的表示体系不一致。结构化分析的结果——数据流图( DFD)和结构化设计的结果——模块结构图(MSD)是两种不同的表示体系。DFD中的一个数据流,既不能对应MSD中的模块的数据,也不能对应模块间的调用关系,DFD中的加工也未必对应MSD中的一个模块。分析与设计之间

5

在表示体系上的不一致被称作分析与设计的鸿沟。它为从分析到设计的过渡带来了较大的困难,所谓从分析到设计的转换,实际上并不存在可靠的转换规则,而是带有人为的随意性,从而很容易因理解上的错误而埋藏下隐患。分析与设计的鸿沟带来的另一个后果是,设计文档与问题域的本来面貌相差更远了,因为其中经过了两次扭曲。当程序员手持设计文档进行编程工作时,难以透过这些文档看到问题域的本来面貌。 ( 3)编程和测试

编程阶段完成的任务是利用一种编程语言产生一个能够被机器理解和执行的系统,这方面技术最为成熟。测试是发现和排除程序中的错误,最终产生一个正确的系统。但所谓正确是相对的,因为至今还没有哪种测试方法能保证找到程序中的全部错误。

从理论上讲,从设计到编程、从编程到测试应能较好地衔接。但是,由于分析方法的缺陷很容易产生对问题域的错误理解,而分析与设计的鸿沟很容易造成设计人员对分析结果的错误转换,所以在编程时程序员往往需要对分析员和设计人员已经认识过的事物重新进行认识,并产生与他们不同的理解。在实际开发过程中常常看到,后期开发阶段的人员不断地发现前期阶段的错误,并按照他们的新的理解进行工作,所以每两个阶段之间都会出现不少变化,其文档不能很好的衔接。 ( 4)软件维护

软件维护阶段的工作有两种情况:一是对使用中发现的错误进行修改,二是因需求发生了变化而进行修改。前一种情况需要从程序逆向追溯到发生错误的开发阶段。由于程序不能映射问题域以及各个阶段的文档不能对应,每一步追溯都存在许多理解障碍。第二种情况是一个从需求到程序的顺向过程,它也存在初次开发时的那些困难,并且又增加了理解每个阶段原有文档的困难。

3 .面向对象的软件工程方法

面向对象的软件工程方法是面向对象方法在软件工程领域的全面运用。它包括面向对象的分析、面向对象的设计、面向对象的编程、面向对象的测试和面向对象的软件维护等主要内容。

OOA和OOD的理论与技术从80年代后期开始出现,到目前仍是十分活跃的研究领域。一系列关于OOA和OOD的专著不断问世,表明面向对象方法从早期主要注重于编程理论与技术,发展成为一套较为完整的软件工程体系。目前出现的各种OOA与OOD方法在方法论上是一致的,具体的策略、表示法、过程及模型构成等方面则略有差别。对于OOA与OOD的职责划分也有不同的观点。

( 1)面向对象的分析

OOA强调直接针对问题域中客观存在的各项事物建立OOA模型中的对象。用对象的属性和服务分别描述事物的静态特征和行为。问题域有哪些值得考虑的事物,OOA模型中就有哪些对象。而且对象及其服务的命名都强调与客观

6

事物一致。另外,OOA模型也保留了问题域中事物之间关系。把具有相同属性和相同服务的对象归结为一类;用一般/特殊结构(又称分类结构)描述一般类与特殊类之间的关系(即继承关系)。

用整体 /部分结构(又称组装结构)描述事物间的组成关系;用实例连接和消息连接表示事物之间的静态联系和动态联系。静态联系是指一个对象的属性与另一对象属性有关,动态联系是指一个对象的行为与另一对象行为有关。可以看到,无论是对问题域中的单个事物,还是对各个事物之间的关系,OOA模型都保留着它们的原貌,没有转换、扭曲,也没有重新组合,所以OOA模型能够很好地映射问题域。OOA对问题域的观察、分析和认识是很直接的,对问题域的描述也是很直接的。它所采用的概念及术语与问题域中的事物保持了最大程度的一致,不存在语言上的鸿沟。 ( 2)面向对象的设计

OOA与OOD的职责划分是:OOA针对问题域运用OO方法,建立一个反映问题域的OOA模型,不考虑与系统实现有关的因素(包括编程语言、图形用户界面、数据库等等),从而使OOA模型独立于具体的实现。OOD则是针对系统的一个具体的实现运用OO方法。其中包括两方面的工作,一是把OOA模型直接搬到OOD(不经过转换,仅作某些必要的修改和调整),作为OOD的一个部分;二是针对具体实现中的人机界面、数据存储、任务管理等因素补充一些与实现有关的部分。这些部分与OOA采用相同的表示法和模型结构。 OOA与OOD采用一致的表示法是面向对象的分析与设计优于传统的软件工程方法的重要因素之一。这使得从OOA到OOD不存在转换,只有很局部的修改或调整,并增加几个与实现有关的独立部分。因此OOA与OOD之间不存在传统方法中分析与设计之间的鸿沟,二者能够紧密衔接,大大降低了从OOA过渡到OOD的难度、工作量和出错率。 ( 3)面向对象的编程

面向对象的编程( OOP)又称作面向对象的实现(OOI)。在OOA-OOD-OOP这一软件工程的过程系列中,OOP的分工比较简单,认识问题域与设计系统成分的工作已经在OOA和OOD阶段完成,OOP工作就是用同一种面向对象的编程语言把OOD模型中的每个成分书写出来。

理想的 OO开发规范,应要求在OOA和OOD阶段对系统需要设立的每个对象类及其内部构成(属性和服务)与外部关系(结构和静态、动态联系)都达到透彻的认识和清晰的描述,而不是把许多问题遗留给程序员去重新思考。程序员需要动脑筋的工作主要是:用具体的数据结构来定义对象的属性,用具体的语句来实现服务流程图所表示的算法。 ( 4)面向对象的测试

面向对象的测试( OOT)是指:对于用OO技术开发的软件,在测试过程中继续运用OO技术,进行以对象概念为中心的软件测试。

采用 OO技术开发的软件含有大量与OO方法的概念、原则及技术机制有关的语法与语义信息。在测试过程中发掘并利用这些信息,继续运用OO的概念与

7

原则来组织测试,可以更准确地发现程序错误并提高测试效率。主要原因是:在用 OOPL编写的程序中,对象的封装性使对象成为一个独立的程序单位,只通过有限的接口与外部发生关系,从而大大减少了错误的影响范围。OOT以对象的类作为基本测试单位,查错范围主要是类定义之内的属性和服务,以及有限的对外接口(消息)所涉及的部分。有利于 OOT的另一个因素是对象的继承性。对父类测试完成之后,子类的测试重点只是那些新定义的属性和服务。

对于用 OOA和OOD建立模型并由OOPL编程的软件,OOT可以发挥更强的作用,通过捕捉OOA/OOD模型信息,检查程序与模型不匹配的错误。这一点是传统的软件工程方法难以达到的。 ( 5)面向对象的软件维护

软件维护的最大难点在于人们对软件的理解过程中所遇到的障碍。维护人员往往不是当初的开发人员,读懂并正确地理解由别人开发的软件是件困难的事情。在用传统的软件工程方法开发的软件中,各个阶段的文档表示不一致,程序不能很好地映射问题域,从而使维护工作困难重重。

面向对象的软件工程方法为改进软件维护提供了有效的途径。程序与问题域一致,各个阶段的表示一致,从而大大降低了理解的难度。无论是发现了程序中的错误而逆向追溯到问题域,还是需求发生了变化而从问题域正向地追踪到程序,道路都是比较平坦的。 OO方法可提高软件维护效率的另一个重要原因是,将系统中最容易变化的因素(功能)作为对象的服务封装在对象内部,对象的封装性使一个对象的修改对其它影响也小,从而避免了波动效应。

7.1.3 面向对象的基本概念和特征

在面向对象的设计方法中,对象和传递消息分别是表现事物及事物间相互联系的概念。类和继承是适应人们一般思维方式的描述范式。方法是允许作用于该类对象上的各种操作。这种对象、类、消息和方法的程序设计范式的基本点在于对象的封装性和继承性。通过封装能将对象的定义和对象的实现分开,通过继承能体现类与类之间的关系,以及由此带来的动态聚束和实体的多态性,从而构成了面向对象的各种特征。 1. 对象

OO方法中把组成客观世界的实体称之为问题空间的对象。显然,对象不是固定的,可以是有形的(如一架飞机),也可以是无形的(如一项规划)。世界上的各个事物都是由各种对象组成的,任何事物都是对象,是某一个对象类的一个元素。复杂的对象可由相对比较简单的对象以某种方法组成,甚至整个世界也可以从一些最原始的对象开始,经过层层组合而成。 本质上,用计算机解题是借助某种语言规定对计算机实体施加某种动作,以此动作的结果去映射解,把计算机实体称之为解空间(求解域)对象。因此从以下四方面描述:

8