11章 软件工程课件_第1页
11章 软件工程课件_第2页
11章 软件工程课件_第3页
11章 软件工程课件_第4页
11章 软件工程课件_第5页
已阅读5页,还剩93页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第11章面向对象实现11.1面向对象的程序设计语言11.2面向对象的程序实现特征11.3面向对象测试11.4组件技术简介11.1面面向对象象的程序序设计语语言11.1.1面面向向对象语语言的优优点编码相对对软件生生命期的的各个阶阶段来说说是最容容易的,,所以为为数较多多的初级级程序员员均可参参加这一一阶段的的工作。。但是在在软件生生命期中中,程序序是经常常需要被被阅读的的,例如如设计测测试用例例、排错错、修改改、功能能扩充等等都需要要程序员员或其他他人员阅阅读程序序。可以以这样说说,在软软件开发发过程中中,读程程序的时时间比写写程序的的时间还还要多,,因此,,如何能能够更完完整、更更准确地地表达问问题域语语义,使使所开发发出的程程序易于于阅读,,使所开开发的系系统具有有很强的的可重用用性和可可维护性性,选择择一种什什么样的的语言作作为开发发工具就就显得尤尤为重要要。面向对象象设计的的结果要要转换为为计算机机系统可可以识别别的代码码,既可可以用面面向对象象语言,,也可以以用非面面向对象象语言实实现。设设计阶段段设计的的对象和和关联最最终都必必须用具具体的编编程语言言或数据据库实现现。使用用OO语语言来实实现OO设计相相对来说说比较容容易,因因为语言言的结构构与设计计的构造造是相似似的,OO语言言支持对对象、多多态性和和继承性性。使用用非OO语言需需要特别别注意和和规定保保留程序序的OO结构,,OO概概念可以以映射到到非OO语言结结构中,,这只是是一个表表达方式式的问题题,不是是语言能能力的问问题,因因为编程程语言最最终要转转换为机机器语言言,但OO语言言良好的的风格尤尤为突出出。由于于语言本本身充分分支持面面向对象象概念的的实现,,因此,,编译程程序可以以自动把把面向对对象概念念映射到到目标程程序中。。使用非非面向对对象语言言编写面面向对象象程序,,则必须须由程序序员自己己把面向向对象概概念映射射到目标标程序中中。例如人语语言并不不直接支支持类或或对象的的概念,,程序员员只能在在结构中中定义变变量和相相应的函函数(事事实上,,不能直直接在结结构中定定义函数数而是要要利用指指针间接接定义))。所有有非面向向对象语语言都不不支持一一般到特特殊结构构的实现现,使用用这类语语言编程程时要么么完全回回避继承承的概念念,要么么在声明明特殊化化类时,,把对一一般化类类的引用用嵌套在在它里面面。我们说选选用面向向对象语语言还是是非面向向对象语语言,这这只是一一个表达达方式的的问题,,不是语语言能力力的问题题。从原原理上说说,使用用任何一一种通用用语言都都可以实实现面向向对象概概念。在在传统的的面向功功能的方方法学中中,强调调的是确确定和分分解系统统功能,,这种做做法虽然然是目标标的最直直接的实实现方式式,但由由于功能能是软件件系统中中最不稳稳定、最最容易变变化的方方面,因因而获得得的程序序往往难难于维护护和扩充充。OO方法开开发软件件,其结结构源于于客观世世界稳定定的对象象结构,,与传统统软件相相比,软软件本身身的内部部结构发发生了质质的变化化,易重重用性和和易扩充充性都得得到提高高。围绕绕对象来来组织软软件系统统,可以以自然地地将现实实世界模模型映射射到软件件结构中中。因此此,使用用面向对对象语言言,实现现面向对对象概念念,远比比使用非非面向对对象语言言方便。。当然,,方便性性也并不不是决定定选择何何种语言言的关键键因素。。选择程序序设计语语言的关关键因素素,是语语言的一一致的表表达能力力、可重重用性及及可维护护性。面面向对象象语言刻刻画客观观系统较较为自然然,它具具有:①识认认性,系系统中的的基本构构件可识识认为一一组可识识别的离离散对象象;②类别别性,系系统具有有相同数数据结构构与行为为的所有有对象可可组成一一类;③多态态性,对对象具有有惟一的的静态类类型和多多个可能能的动态态类型;;④继承承性,在在基于层层次关系系的不同同类中共共享数据据和操作作等特点点。因此,能能够更完完整、更更准确地地表达问问题域语语义的面面向对象象语言的的语法是是非常重重要的,,这将会会对系统统带来下下述几个个重要优优点。1.一一致的表表示方法法从前面章章节的讲讲述中可可以知道道,面向向对象开开发基于于不随时时间变化化的、一一致的表表示方法法。这种种表示方方法应该该从问题题域到OOA,,从OOA到OOD,,最后从从OOD到面向向对象编编程(OOP)),始终终稳定不不变。一一致的表表示方法法既有利利于在软软件开发发过程中中始终使使用统一一的概念念,也有有利于编编程人员员理解软软件的各各种配置置成分。。我们以““自动饮饮料售货货机”为为例,说说明面向向对象开开发基于于不随时时间变化化的、一一致的表表示方法法。对于于“自动动饮料售售货机””这一实实例,在在问题域域、OOA、OOD或或是OOP的各各个阶段段所用到到的概念念都是一一致的、、不变的的。如::退币杆杆、找零零、熄灯灯、投币币口、投投币、饮饮料、饮饮料倒出出等,这这对于用用户、分分析人员员、编程程人员、、测试人人员、维维护人员员来说,,无疑是是有很大大的帮助助的。2.可可重用性性软件的可可重用性性的好坏坏对于提提高软件件产品的的质量和和软件开开发效率率意义重重大。为为了能带带来可观观的商业业利益,,必须在在更广泛泛的范围围中运用用重用机机制,而而不是仅仅仅在程程序设计计这个层层次上进进行重用用。因此此,在OOA、、OOD直到OOP中中都显式式地表示示问题域域语义,,其意义义是十分分深远的的。随着着时间的的推移,,软件开开发组织织既可能能重用它它在某个个问题域域内的OOA结结果,也也可能重重用相应应的OOD和OOP结结果。我们仍以以“自动动饮料售售货机””为例,,说明可可重用性性对于提提高软件件产品的的质量和和软件开开发效率率意义重重大。假假设该““自动饮饮料售货货机”可可提供汽汽水、洛洛神、红红茶、可可乐、奶奶昔等五五种饮料料,有关关这五种种饮料所所实施的的操作是是相同的的,因此此,可以以构造一一个饮料料类,然然后由该该类构造造汽水、、洛神、、红茶、、可乐、、奶昔等等五种不不同的对对象。这这对于提提高软件件开发质质量和软软件开发发效率具具有重要要的意义义。3.可可维护性性软件维护护是一件件极为复复杂的事事情,在在软件的的开发成成本中约约占到70%左左右。为为了降低低维护成成本,尽尽管人们们反复强强调保持持文档与与源程序序一致的的必要性性,但是是,在实实际工作作中很难难做到交交付两类类不同的的文档,,并使它它们保持持彼此完完全一致致。特别别是考虑虑到进度度、预算算、能力力和人员员等限制制因素时时,做到到两类文文档完全全一致几几乎是不不可能的的。因此此,维护护人员最最终面对对的往往往只有源源程序本本身。以ATM(自动动取款机机)系统统为例,,说明在在程序内内部表达达问题域域语义对对维护工工作的意意义。假假设在维维护该系系统时没没有合适适的文档档资料可可供参阅阅,于是是维护人人员人工工浏览程程序或使使用软件件工具扫扫描程序序,记下下或打印印出程序序显式陈陈述的问问题域语语义,维维护人员员看到““ATM”、““账户””和“现现金兑换换卡”等等,这对对维护人人员理解解所要维维护的软软件将有有很大帮帮助。因此,在在选择编编程语言言时,应应该考虑虑的首要要因素,,是在供供选择的的语言中中哪个语语言能最最好地表表达问题题域语义义。11.1.2面面向向对象语语言的技技术特点点面向对象象语言借借鉴了20世纪纪50年年代诞生生的人工工智能语语言LISP,,引入了了动态绑绑定的概概念和交交互式开开发环境境的思想想;始于于20世世纪60年代的的离散事事件模拟拟语言SIMULA67,,引入了了类的概概念和继继承机制制;形成成于20世纪70年代代的Smalltalk语言言。面向向对象语语言发展展有两大大方向,,一是纯纯面向对对象的语语言,如如Smalltalk、EIFFEL、、Java等语语言;另另一类是是混合型型面向对对象语言言,也就就是在过过程语言言或其他他语言中中增加了了类、继继承等面面向对象象机制,,如C+++、Objective__C等语语言。就就两种形形式的面面向对象象语言比比较而言言,纯面面向对象象语言更更加适合合面向对对象方法法研究和和快速原原型的实实现;而而混合型型面向对对象语言言则更加加注重于于提高系系统的运运行速度度,使传传统使用用结构化化编程方方式的程程序员容容易接受受面向对对象思想想。面向对象象程序设设计语言言以对象象为中心心,对象象是程序序运行时时的基本本成分。。面向对对象程序序设计语语言中提提供了类类、继承承等机制制。面向向对象的的程序设设计即为为设计类类及由类类构造程程序的方方法和过过程,用用计算机机对象模模拟现实实世界。。成熟的的面向对对象的程程序设计计语言通通常都提提供丰富富的类库库和强有有力的开开发环境境。1.支支持类与与对象概概念的机机制面向对象象语言都都允许用用户动态态创建对对象,并并且可以以用指针针引用动动态创建建的对象象。允许许动态创创建对象象,就意意味着系系统必须须处理内内存管理理问题,,如果不不及时释释放不再再需要的的对象所所占用的的内存,,动态存存储分配配就有可可能耗尽尽内存,,出现内内存不足足的问题题。通常常,对这这类问题题的解决决方法有有两种,,一种是是由语言言的运行行机制自自动管理理内存,,即提供供自动回回收“垃垃圾”的的机制;;另一种种是由程程序员编编写释放放内存的的代码。。自动管管理内存存不仅方方便而且且安全,,但是必必须采用用先进的的垃圾收收集算法法才能减减少开销销。某些些面向对对象的语语言(如如C+++)允许许程序员员定义析析构函数数(Destructor))。每当当一个对对象超出出范围或或被显式式删除时时,就自自动调用用析构函函数。这这种机制制使得程程序员能能够方便便地构造造和唤醒醒释放内内存的操操作,却却又不是是采用垃垃圾收集集机制。。2.实实现整体体-部部分结结构的机机制实现整体体-部部分结结构的机机制有两两种方法法,一种种是使用用指针实实现整体体-部部分结结构,另另一种是是使用独独立的关关联对象象实现整整体--部分分结构。。一般来来说,通通过增加加内部指指针可以以方便地地实现关关联,使使用指针针是最容容易的实实现方法法。但是是,大多多数现有有的面向向对象语语言并不不显式支支持独立立的关联联对象。。3.实实现一般般-特特殊结结构的机机制实现一般般-特特殊结结构的机机制,包包括实现现继承的的机制和和解决名名字冲突突的机制制。所谓谓解决名名字冲突突,是指指在支持持多重继继承的语语言中,,处理在在多个基基类中可可能出现现的重名名问题。。通常,,有些语语言拒绝绝接受有有名字冲冲突的程程序,另另一些语语言提供供了解决决冲突的的协议。。无论使使用何种种语言,,程序员员都应该该尽力避避免出现现名字冲冲突。4.实实现属性性和服务务的机制制实现属性性的机制制应该着着重考虑虑的几个个因素::支持实实例连接接的机制制;属性性的可见见性控制制;对属属性值的的约束。。对于实实现服务务的机制制来说,,主要应应该考虑虑下列因因素:支支持消息息连接的的机制;;控制服服务可见见性的机机制;动动态联编编。所谓动态态联编,,是指应应用系统统在运行行过程中中,当需需要执行行一个特特定服务务的时候候,选择择(或联联编)实实现该服服务的适适当算法法的能力力。动态态联编机机制使得得程序员员在向对对象发送送消息时时拥有较较大自由由,在发发送消息息前,无无须知道道接收消消息的对对象当时时属于哪哪个类。。5.类类型检查查按照编译译时进行行类型检检查的严严格程度度,程序序设计语语言可以以分为三三种类型型:弱类类型、强强类型和和混合型型。弱类类型:语语言仅要要求每个个变量或或属性隶隶属于一一个对象象。强类类型:语语法规定定每个变变量或属属性必须须准确地地属于某某个特定定的类。。面向对对象语言言包含不不同类型型的语言言,例如如,Smalltalk实际际上是一一种无类类型语言言(所有有变量都都是未指指定类的的对象));C+++则是是强类型型语言。。混合型型语言::为了提提高操作作的效率率,甚至至允许属属性值不不是对象象而是某某种预定定义的基基本类型型数据((如整数数、浮点点数等)),如C++,,Objective_C等等。强类型语语言主要要有两个个优点::有利于于在编译译时发现现程序错错误;增增加了优优化的可可能性。。通常使使用强类类型编译译型语言言开发软软件产品品,使用用弱类型型解释型型语言快快速开发发原型。。一般来来说,强强类型语语言有助助于提高高软件的的可靠性性和运行行效率,,现代的的程序语语言都是是强类型型的,大大多数理理论支持持强类型型检查。。6.类类库目前,基基本所有有的面向向对象的的程序设设计语言言都提供供一个实实用的类类库。某某些语言言本身并并没有规规定提供供什么样样的类库库,而是是由实现现这种语语言的编编译系统统自行提提供类库库。有了了类库,,程序员员可以重重用许多多软构件件,不必必重新编编写,这这为实现现软件重重用带来来很大方方便。类库中通通常包含含实现通通用数据据结构的的类,例例如,动动态数组组、表、、队列、、栈和树树等,通通常把这这些类称称为包容容类。类类库中还还包含了了实现各各种关联联的类。。更完整的的类库通通常还提提供了接接口类和和图形库库。接口口类是独独立于具具体设备备的(例例如,输输入/输输出流)),图形形库是用用于实现现窗口系系统的用用户界面面类的一一个相对对独立的的库。7.效效率某些早期期的面向向对象语语言是解解释型的的而不是是编译型型的。许许多人认认为这些些语言的的主要缺缺点是效效率低。。当今的的面向对对象语言言都拥有有完整类类库,类类库中提提供了更更高效的的算法和和更好的的数据结结构,与与非面向向对象语语言相比比,能得得到更快快运行的的代码。。例如,,库中已已经提供供了算法法先进、、代码可可靠的一一类数据据结构,,程序员员再不必必编写像像实现哈哈希表或或平衡树树算法的的代码了了,因此此,提高高了编程程效率和和运行效效率。面向对象象语言在在运行时时使用动动态联编编实现多多态性,,这似乎乎需要在在运行时时查找继继承树,,以得到到定义给给定操作作的类。。这也是是人们认认为面向向对象语语言效率率低的另另一个理理由。当当今的绝绝大多数数面向对对象语言言都优化化了这个个查找过过程,从从而实现现了高效效率查找找。只要要在程序序运行时时始终保保持类结结构不变变,就能能在子类类中存储储各个操操作的正正确入口口点,从从而使得得动态联联编成为为查找哈哈希表的的高效过过程,不不会由于于继承树树深度加加大或类类中定义义的操作作数增加加而降低低效率。。8.永永久保存存对象在一个程程序都对对数据进进行处理理时,希希望数据据能够长长时间保保存下来来,以备备后用。。保存数数据需要要提供某某种保存存数据的的方法。。长期保保存数据据主要有有两个原原因:①为实实现在不不同程序序之间传传递数据据,需要要保存数数据;②为恢恢复被中中断了的的程序的的运行,,首先需需要保存存数据。。对于不同同面向对对象语言言,长期期保存数数据的方方法也不不同。有有些面向向对象语语言(例例如C+++)没没有提供供直接存存储对象象的机制制,这些些语言的的用户必必须自己己管理对对象的输输入/输输出,或或者购买买面向对对象的数数据库管管理系统统。有些些面向对对象语言言(例如如Smalltalk)把当当前的执执行状态态完整地地保存在在磁盘上上。还有有一些面面向对象象语言提提供了访访问磁盘盘对象的的输入//输出操操作。通过在类类库中增增加对象象存储管管理功能能(例如如EIFFEL语言采采用的策策略),,可以在在开发环环境中提提供对象象存储管管理功能能,而且且还不改改变语言言定义或或不增加加关键字字。然后后,可以以从“可可存储的的类”中中派生出出需要永永久保存存的对象象,该对对象自然然继承了了对象存存储管理理功能。。如果能能使程序序设计语语言语法法与对象象存储管管理语法法实现无无间隙集集成,则则是最理理想的。。9.类类模板在实际的的应用系系统开发发中,经经常用函函数、类类等软件件元素处处理不同同类型的的数据((对象)),但是是,对它它们的数数据元素素所进行行的基本本操作都都是相同同的。例例如,对对于一个个向量((一维数数组)类类来说,,不论是是整型向向量,浮浮点型向向量,还还是其他他任何类类型的向向量,针针对它的的数据元元素所进进行的基基本操作作都是相相同的((例如,,插入、、删除、、检索等等)。在在这种情情况下,,如果程程序语言言提供一一种能抽抽象出这这类共性性的机制制,则对对减少冗冗余和提提高可重重用性大大有好处处。所谓参数数化类,,就是使使用一个个或多个个类型去去参数化化一个类类的机制制,有了了这种机机制,程程序员就就可以先先定义一一个参数数化的类类模板((即在类类定义中中包含以以参数形形式出现现的一个个或多个个类型)),然后后把数据据类型作作为参数数传递进进来,从从而把这这个类模模板应用用在不同同的应用用程序中中,或用用在同一一应用程程序的不不同部分分。EIFFEL语言言中就有有参数化化类,C++语语言也提提供了类类模板。。VisualBasic和VisualC++提提供了函函数模板板和类模模板。10.开开发环环境在软件工工程学中中,方法法和工具具之间是是相互依依赖的关关系,方方法是工工具研制制的先导导,工具具是方法法的实在在体现。。软件开开发环境境是指在在计算机机的基本本软件基基础上,,为了支支持软件件开发而而提供的的一组工工具软件件系统。。软件工工具和软软件工程程环境对对软件生生产率有有很大影影响。由由于面向向对象程程序中继继承关系系和动态态联编等等引入的的特殊复复杂性,,面向对对象语言言所提供供的软件件工具或或开发环环境就显显得尤为为重要了了。一般般来说,,面向对对象语言言所提供供的开发发环境,,至少应应该包括括下列一一些最基基本的软软件工具具:编辑辑程序、、编译程程序或解解释程序序、浏览览工具和和调试器器等。编译程序序或解释释程序是是最基本本、最重重要的软软件工具具。编译译与解释释的差别别主要是是速度和和效率不不同。利利用解释释程序解解释执行行用户的的源程序序,虽然然速度慢慢、效率率低,但但调试比比较方便便、灵活活。编译译型语言言具有良良好的优优化功能能,并且且生成目目标代码码效率很很高,适适于用来来开发正正式的软软件产品品。有些些面向对对象语言言(例如如Objective_C)不但但提供了了编译程程序,还还提供了了解释工工具,这这样给软软件开发发人员带带来很大大方便。。有些面向向对象语语言虽然然提供编编译程序序,但是是,源程程序到目目标代码码翻译是是间接的的。它先先把用户户源程序序翻译成成一种中中间语言言程序,,然后再再把中间间语言程程序翻译译成目标标代码。。像这类类的编译译程序,,就很有有可能使使调试器器不能理理解原始始的源程程序。因因此,使使用调试试器时,,首先应应该弄清清楚它是是针对原原始的面面向对象象源程序序,还是是针对中中间代码码进行调调试的。。如果是是针对中中间代码码进行调调试的,,则会给给调试人人员带来来许多不不便。除除此之外外,查看看属性值值和分析析消息连连接也是是面向对对象的调调试器应应该具备备的功能能。在开发大大型系统统的时候候,还可可能需要要系统构构造工具具和变动动控制工工具。因因此应该该考虑语语言本身身是否提提供了这这种工具具,或者者该语言言能否与与现有的的这类工工具很好好地集成成起来。。11.1.3选选择择面向对对象语言言总体来说说,在使使用面向向对象的的软件开开发过程程中,OO语言言明显优优于非OO语言言,因此此,除了了在很特特殊的应应用领域域,如::对程序序的执行行时间和和使用空空间都有有很严格格限制的的情况;;需要产产生任意意的甚至至非法的的指令序序列;体体系结构构特殊的的微处理理器等。。开发人人员一般般应该选选择面向向对象的的程序设设计语言言,但是是,目前前面向对对象的程程序设计计语种类类繁多,,究竟应应该选择择何种语语言更利利于系统统开发和和维护呢呢?在充充分考虑虑到程序序设计语语言特点点(如应应用领域域、算法法与计算算的复杂杂性、数数据结构构的复杂杂性、效效率等))的同时时,还应应该着重重考虑以以下一些些实际因因素。1.未未来能否否占主导导地位语言在未未来能否否占主导导地位,,是否具具有很强强的生命命力,对对于软件件生存期期具有相相当重要要的作用用。因为为,软件件投入运运行后,,其维护护和功能能扩充是是经常性性的工作作,如果果在若干干年以后后,你所所使用的的面向对对象的程程序设计计语言仍仍占主导导地位,,那么,,你所开开发的产产品在若若干年后后仍然具具有很强强的生命命力。否否则,若若干年后后,其维维护或功功能扩充充就很难难实施了了,你所所开发的的产品就就会自动动退役。。究竟如何何来选择择呢?通通常情况况下,就就是依据据目前该该语言占占有的市市场份额额,以及及专业书书刊和学学术会议议上所做做的分析析、评价价。这样样,人们们往往能能够对未未来哪种种面向对对象语言言将占据据主导地地位做出出预测。。当然,,最终决决定选用用哪种面面向对象象语言的的实际因因素,往往往是诸诸如成本本之类的的经济因因素而不不是技术术因素。。2.可可重用性性采用面向向对象方方法开发发软件的的基本目目的,是是通过重重用提高高软件质质量和软软件生产产率,增增强系统统的可维维护性。。面向对对象语言言的主要要优点是是能够最最完整、、最准确确地表达达问题域域语义,,因此,,在开发发系统时时,应该该优先选选用面向向对象语语言。3.类类库和开开发环境境语言、开开发环境境和类库库是决定定可重用用性的三三个因素素。可重重用性除除了依赖赖于面向向对象程程序语言言本身以以外,同同时还依依赖于开开发环境境优劣和和类库内内容的丰丰富程度度。只有有语言、、开发环环境和类类库这三三个因素素综合起起来,才才能共同同决定可可重用性性。考查程序序语言的的时候,,不但应应该考查查是否提提供了类类库,更更重要的的是考查查类库中中提供了了哪些有有价值的的类。随随着类库库的日益益成熟和和丰富,,会给开开发应用用系统带带来很大大的方便便,需要要开发人人员自己己编写的的代码将将越来越越少,以以致会有有事半功功倍或更更高的效效率。目前较为为流行的的OO程程序设计计语言和和工具大大致可以以分为两两类,一一类是传传统OO语言和和工具::Smalltalk、C+++、ObjectPascal、Java等等;另一一类是高高级OO语言((OO--4GL)和工工具:VisualBasic、、PowerBuilder、Delphi、PowerObjects、Developer/2000、VisualFoxpro、、Javascript等。。用户在在选择具具体的语语言作为为开发工工具时,,除要考考虑上述述的几个个方面外外,还应应该考虑虑的其他他因素有有:对用用户学习习面向对对象分析析、设计计和编码码技术所所能提供供的培训训服务;;在使用用这个面面向对象象语言期期间能提提供的技技术支持持;能提提供给开开发人员员使用的的开发工工具、开开发平台台;对机机器性能能和内存存的需求求;集成成已有软软件的容容易程度度;软件件的规模模;软件件的可移移植性;;软件的的应用领领域等。。程序是软软件设计计的自然然结果,,程序的的质量主主要取决决于设计计的质量量,根据据设计的的要求选选择了程程序设计计语言之之后,编编程风格格在很大大程度上上影响着着程序的的可读性性、可测测试性和和可维护护性。保保证程序序质量的的重要方方法是有有良好的的程序设设计风格格。对面面向对象象实现来来说,良良好的程程序设计计风格也也是非常常重要的的,它不不仅能够够减少系系统维护护或扩充充所带来来的系统统开销,,而且更更有助于于在新项项目或工工程中重重用已有有的程序序代码。。因此,,良好的的面向对对象程序序设计风风格,既既要遵循循传统的的结构化化程序设设计风格格和准则则,同时时也要遵遵循为适适应面向向对象方方法所特特有的概概念(例例如,继继承性))而必需需的一些些新的风风格和准准则。11.2面面向对象象的程序序实现特特征11.2.1提提高高可重用用性提高软件件的可重重用性是是面向对对象方法法的一个个主要目目标。软软件重用用是指在在两次或或多次不不同的软软件开发发过程中中重复使使用相同同或相似似软件元元素的过过程。软软件元素素包括程程序代码码、测试试用例、、设计文文档、设设计过程程、需求求分析甚甚至知识识领域等等多个层层次。在在编码阶阶段主要要考虑代代码重用用的问题题,代码码级的重重用是最最简单,,也是最最流行的的,是迄迄今为止止研究最最深入、、应用最最广泛的的重用技技术。传传统上,,代码级级重用部部件的主主体是子子程序((函数或或过程))。现在在,由于于基于对对象和面面向对象象的程序序设计语语言及相相应开发发环境的的发展,,代码级级重用部部件的内内容更加加丰富,,不仅包包括结构构化程序序设计语语言中的的函数或或过程,,同时也也包括面面向对象象程序设设计语言言中的程程序包和和类。一般说来来,代码码重用可可分为两两种形式式,一种种是本项项目内的的代码重重用,称称为内部部重用;;另一种种是新项项目重用用已有项项目的代代码,称称为外部部重用。。内部重重用主要要是找出出本项目目设计中中相同或或相似的的部分,,然后利利用继承承机制共共享它们们。要做做到外部部重用,,即一个个项目重重用另一一项目的的代码,,就要求求开发人人员必须须具有重重用的设设计思想想,做到到反复考考虑,精精心设计计。虽然然为实现现外部重重用与内内部重用用需要考考虑的范范围不同同,但是是有助于于实现这这两类重重用的程程序设计计准则却却是相同同的。下下面介绍绍主要的的准则。。1.提提高方法法的内聚聚,减小小方法的的规模一个方法法(即服服务)应应该只完完成单个个功能,,这样的的方法是是高内聚聚的。如如果某个个方法涉涉及两个个或多个个不相关关的功能能或规模模大的方方法,则则应该把把它分解解成几个个更小的的方法。。2.保保持方法法的一致致性实现代码码重用的的一个重重要因素素是应该该保持方方法的一一致性。。一般来来说,功功能相似似的方法法应该有有一致的的名字、、参数特特征(包包括参数数个数、、类型和和次序))、返回回值类型型、使用用条件及及出错条条件等。。这样有有助于实实现代码码重用。。3.把把策略与与实现分分开方法从所所完成的的功能来来看有两两种类型型:策略略方法和和实现方方法。策策略方法法负责做做出决策策,提供供变元,,并且管管理全局局资源;;实现方方法只负负责完成成具体的的操作,,但却没没有执行行这个操操作的决决定权,,也不知知道为什什么执行行这个操操作。策略方法法不直接接完成计计算或实实现复杂杂的算法法,只是是检查系系统运行行状态,,并处理理出错情情况。该该方法通通常紧密密依赖于于具体应应用,这这类方法法易编写写、易理理解。实现方法法仅仅针针对具体体数据完完成特定定处理,,通常用用于实现现复杂的的算法。。实现方方法既不不制定决决策,也也不管理理全局资资源。实实现方法法如果在在执行过过程中发发现错误误,只返返回执行行状态而而不处理理出错情情况。由由于实现现方法是是自含式式算法,,与具体体应用相相对独立立,因此此,容易易在其他他应用系系统中重重用,具具有较高高的可重重用性。。在编程时时分清策策略方法法和实现现方法,,不要把把它们放放在同一一个方法法中。应应该把算算法的核核心部分分放在一一个单独独的具体体实现方方法中。。为此需需要从策策略方法法中提取取出具体体参数,,作为调调用实现现方法的的变元,,才能提提高方法法可重用用性。4.采采用全面面覆盖技技术在编程时时,对系系统全面面考虑,,写出覆覆盖整个个系统所所有可能能的方法法。而不不能仅仅仅针对当当前需要要的功能能写方法法。例如如,如果果在当前前应用中中需要写写一个获获取表中中第一个个元素的的方法,,则至少少还应该该为获取取表中最最后一个个元素再再写一个个方法。。一个方方法不仅仅能处理理正常值值,而且且还能够够对异常常情况((如空值值、极限限值及界界外值等等)作出出有意义义的响应应。5.降降低方法法的耦合合度降低方法法与外界界的耦合合程度的的一项主主要措施施是在方方法中尽尽可能少少使用或或不使用用全局信信息。6.充充分地利利用继承承机制使用继承承机制可可实现共共享和提提高重用用性,是是面向对对象程序序设计的的主要途途径。(1)使使用子子过程。。把公共共的代码码分离出出来,构构成一个个被其他他方法调调用的公公用方法法,是实实现代码码复用最最常用、、最简单单的方法法。通常常可以在在基类中中定义这这个公用用方法,,供派生生类中的的方法调调用。(2)分分解因因子。提提高相似似类代码码可重用用性的另另一个有有效途径径,是从从不同类类的相似似方法中中分解出出公共代代码和不不同的代代码(即即因子))。把公公共代码码作为公公用方法法,定义义在一个个抽象基基类(额额外的))中;把把不同的的因子作作为名字字相同而而算法不不同的方方法,定定义在不不同类中中,并被被这个公公用方法法调用。。把这种种分解与与面向对对象语言言提供的的多态性性机制结结合起来来,抽象象基类中中定义的的公用方方法可由由派生类类来继承承,在新新子类中中只需编编写其特特有的代代码,由由于增添添新子类类编写的的代码减减少了,,显然为为增添新新子类所所需付出出的工作作量也就就明显降降低了。。(3)使使用委委派。当当确实存存在一般般-特特殊关关系时,,利用继继承关系系,子类类可以继继承父类类的所有有方法和和属性。。但是,,当逻辑辑上不存存在一般般-特特殊关关系时,,为重用用已有的的代码,,可以利利用委派派机制。。要恰当当地使用用继承机机制,否否则会降降低程序序的可理理解性、、可修改改性和可可扩充性性。(4)把把重用用代码封封装在类类中。解解决同一一类应用用问题时时,程序序员往往往希望重重用其他他方法编编写的程程序代码码。那么么就将被被重用的的代码封封装在类类中,这这样使用用起来比比较安全全,也是是程序员员应该提提倡的编编程风格格。例如如,如果果开发一一个应用用数学系系统时,,发现有有现成的的实现迭迭代法的的商品软软件包,,程序员员想重用用这个算算法,于于是先定定义一个个迭代法法类,然然后把这这个商品品软件包包的功能能封装在在该类中中即可。。11.2.2提提高高可扩充充性前面所述述的提高高可重用用性的准准则,同同样能提提高程序序的可扩扩充性。。下面将将介绍有有助于提提高程序序的可扩扩充性的的面向对对象程序序设计准准则。1.封封装实现现策略为了提高高类中数数据结构构或算法法可修改改性,应应该把类类中描述述属性的的数据结结构以及及修改属属性的算算法等实实现策略略封装起起来,只只提供公公有的接接口供外外界访问问。2.方方法的功功能应该该单一一个方法法应该高高内聚低低耦合,,包含对对象模型型中的有有限内容容。如果果用一个个方法遍遍历多条条关联链链,将使使方法过过分复杂杂,既降降低了可可理解性性,又影影响了可可修改性性和可扩扩充性。。3.避避免使用用多分支支语句在实施系系统开发发过程中中,可以以利用DO-CASE语句测测试对象象的内部部状态,,避免使使用多分分支语句句来根据据对象类类型选择择应有的的行为,,否则在在增添新新类时将将不得不不修改原原有的代代码。一一般来说说,应该该合理地地利用多多态性机机制,根根据对象象当前类类型,自自动决定定应有的的行为。。4.精精心选择择和定义义公有方方法公有方法法是对外外公用的的接口,,私有方方法是仅仅在类内内使用的的方法,,通常利利用私有有方法来来实现公公有方法法。一般般来说,,公有方方法的修修改代价价要比私私有方法法大得多多,因为为对公有有方法的的修改常常常会引引起许多多其他类类的修改改,而私私有方法法的删除除、增加加或修改改所涉及及的面要要小得多多(仅在在类内)),因此此代价也也比较小小。为提提高可修修改性,,降低维维护成本本,必须须精心选选择和定定义公有有方法。。11.2.3提提高高健壮性性提高健壮壮性,也也是程序序员在编编写实现现方法的的代码时时应该考考虑的一一个重要要方面。。通常需需要在健健壮性与与效率之之间做出出适当的的折衷。。健壮性性对任何何一个实实用软件件都是不不可忽略略的质量量指标。。遵守下下述准则则将有助助于提高高健壮性性。1.增增强系统统的容错错功能系统应该该具备容容错功能能,即具具有处理理用户操操作错误误的能力力。当用用户操作作失误或或输入数数据出错错时,不不会引起起程序运运行中断断,更不不应该造造成“死死机”,,而应该该对操作作进行检检查,发发现了的的错误,,必须给给出有关关的提示示信息,,并允许许用户再再次输入入或正常常退出。。2.检检查参数数的合法法性对软件系系统中所所使用的的方法或或过程,,尤其是是公有方方法或过过程,应应该着重重检查其其参数的的合法性性,不能能因为用用户在使使用公有有方法或或过程时时,违反反参数的的约束条条件而引引发程序序运行中中断或造造成系统统“死机机”现象象。3.不不要预先先确定限限制条件件预先确定定限制条条件对所所开发的的系统往往往会产产生一些些不良的的后果。。特别是是在设计计阶段,,往往很很难准确确地预测测出应用用系统中中使用的的数据结结构的最最大容量量需求。。当系统统中使用用的数据据结构的的容量大大于预先先确定的的限制条条件时,,系统有有可能引引发一连连串的问问题。因因此不应应该预先先确定限限制条件件。如果果有必要要和可能能的条件件下,则则应该使使用动态态内存分分配机制制来创建建数据结结构,当当然,该该数据结结构是未未预先确确定限制制条件的的。4.先先测试后后优化为了提高高健壮性性,往往往需要增增加大量量的代码码,这就就或多或或少地影影响了系系统的执执行效率率。因此此,就需需要在效效率与健健壮性之之间做出出合理的的折衷。。一般来来说,首首先根据据应用程程序的特特点,确确定需要要着重测测试的部部分(例例如,最最坏情况况出现的的次数及及处理时时间等)),进行行测试。。然后为为提高性性能,确确定着重重优化的的关键部部分。此此外在选选择算法法时,要要综合考考虑内存存需求、、速度以以及实现现的简易易程度等等因素,,选择出出适当的的算法。。11.3面面向对象象测试11.3.1OO软件的的单元测测试在面向对对象的软软件开发发中,““封装””导致了了类和对对象的定定义,这这意味着着类和类类的实例例(对象象)包装装了属性性(数据据)和处处理这些些数据的的操作((也称为为方法或或服务))。其核核心是““对象””,不存存在传统统软件开开发中的的“单元元”(或或者说单单元的概概念改变变了)。。也就是是说,封封装起来来的类和和对象是是最小的的可测试试单元。。一个类类可以包包含一组组不同的的操作,,而一个个特定的的操作也也可能定定义在一一组不同同的类中中。因此此,面向向对象的的软件的的单元测测试与传传统测试试方法不不一样,,它的含含义发生生了很大大变化。。面向对象象的软件件的单元元测试,,不是独独立地测测试单个个操作,,而是把把所有操操作都看看成类的的一部分分,全面面地测试试类和对对象所封封装的属属性和操操纵这些些属性的的操作整整体。具具体地说说,在OO的单单元测试试中不仅仅要发现现类的所所有操作作中存在在的问题题,还要要考查一一个类与与其他的的类协同同工作时时可能出出现的错错误。现现以实例例说明::在一个个类层次次中,操操作A在在超类中中定义并并被一组组子类继继承,每每个子类类都可使使用操作作A,但但是A调调用于类类中定义义的操作作并处理理子类的的私有属属性。由由于在不不同的子子类中使使用操作作A的环环境有所所不同,,因此有有必要在在每个子子类的语语境中测测试操作作A。这这就是说说,当测测试面向向对象软软件时,,传统的的单元测测试方法法是不可可用的,,我们不不能再独独立地对对操作A进行测测试。11.3.2OO软件的的集成测测试传统的集集成测试试是采用用自顶向向下或自自底向上上或二者者混合的的两头逼逼近策略略,通过过用渐增增方式集集成功能能模块进进行的测测试。但但是由于于面向对对象程序序没有层层次的控控制结构构,相互互调用的的功能也也是分散散在不同同的类中中,类通通过消息息的相互互作用申申请和提提供服务务,所以以这种集集成测试试的策略略就没有有意义了了。此外外,由于于面向对对象程序序具有动动态性,,程序的的控制流流往往难难以确定定,因此此只能做做基于黑黑盒方法法的集成成测试。。OO集成成测试主主要关注注于系统统的结构构和内部部的相互互作用。。面向对对象软件件的集成成测试有有两种方方法。1.基基于线程程的测试试(Thread-basedTesting)基于线程程的测试试是指把把响应系系统的一一个输入入或一个个事件所所需要的的一组类类集成起起来进行行测试。。应当分分别集成成并测试试每个线线程,同同时为了了避免产产生副作作用再进进行回归归测试。。2.基基于使用用的测试试(Use-basedTesting)基于使用用的测试试首先测测试几乎乎不使用用服务器器类的那那些类((称为独独立类)),把独独立类都都测试完完之后,,接着测测试使用用独立类类的最下下层的类类(称为为依赖类类)。然然后,根根据依赖赖类的使使用关系系,从下下到上一一个层次次一个层层次地持持续进行行测试,,直至把把整个软软件系统统测试完完为止。。除了上述述两种测测试方法法,集群群测试是是面向对对象软件件集成测测试的一一个步骤骤。为了了检查一一群相互互协作的的类,用用精心设设计的测测试用例例,力图图发现协协作错误误。通过过研究对对象模型型可以确确定协作作类。为减少测测试工作作的工作作量,在在进行集集成测试试时,可可参考类类关系图图或实体体关系图图,确定定不需要要被重复复测试的的部分,,从而优优化测试试用例,,使测试试能够达达到一定定的标准准。11.3.3OO软件的的确认测测试与系系统测试试通过对OO软件件单元测测试和集集成测试试,仅能能确认软软件开发发的功能能是正确确的,但但是不能能确认在在实际运运行时,,它是否否满足用用户要求求,是否否大量存存在与实实际使用用条件下下的各种种应用相相矛盾的的错误,,为此,,在完成成上述测测试活动动后,还还必须经经过规范范的确认认测试和和系统测测试。面向对象象软件的的确认测测试或系系统测试试,与传传统的确确认测试试一样,,通过设设计测试试用例,,主要检检查用户户界面和和用户可可识别的的输出,,不再考考虑类之之间相互互连接的的细节。。测试人人员应该该认真研研究动态态模型和和描述系系统行为为的脚本本,为系系统的输输入信息息设计出出错处理理的通路路,模拟拟错误的的数据和和软件界界面可能能发生的的错误,,设计出出合理的的测试用用例。11.3.4设设计计测试用用例目前,面面向对象象软件的的测试用用例的设设计方法法,还处处于研究究、发展展阶段。。1993年,,Berard提出了了指导OO软件件测试用用例设计计的方法法,其要要点如下下:●每一一个测试试用例都都要有一一个惟一一的标识识,并与与被测试试的一个个或几个个类相关关联起来来;●每个个测试用用例都要要陈述测测试目的的;●对每每个测试试用例要要有相应应的测试试步骤,,包括被被测对象象的特定定状态,,所使用用的消息息和操作作,可能能产生的的错误及及测试需需要的外外部环境境。●与传传统软件件测试((测试用用例的设设计由软软件的输输入—处处理——输出出或单个个模块的的算法细细节驱动动)不同同,面向向对象测测试关注注于设计计适当的的操作序序列以检检查类的的状态。。1.OO概念念对测试试用例设设计的影影响封装性和和继承性性是类的的重要特特性,这这给面向向对象的的软件开开发带来来很多好好处,同同时它又又对面向向对象的的软件测测试带来来负面影影响。类的属性性和操作作是被封封装的,,而测试试需要了了解对象象的详细细状态。。同时,,需要考考虑当改改变数据据成员的的结构时时,是否否影响了了类的对对外接口口,是否否导致相相应外界界必须改改动。例例如,强强制的类类型转换换会破坏坏数据的的封装性性,请看看下面的的这段程程序:classHd{private:inta=1;char*h="Hd";}classVb{public:intb=2;char*v="Vb";}Hdp;Vb*q=(Vb*)&p;…则其中,,p的数数据成员员可以通通过q被被随意访访问。此外,继继承不会会减少对对子类的的测试,,相反,,会使测测试过程程更加复复杂化。。因此,,继承也也给测试试用例的的设计速速度带来来负面影影响。当当父类与与子类的的环境不不同时,,父类的的测试用用例对子子类没有有什么使使用价值值,必须须为子类类设计新新的测试试用例。。在设计面面向对象象的测试试用例时时应注意意以下三三点。(1)继继承的的成员函函数需要要测试。。对于在在父类中中已经测测试过的的成员函函数,根根据具体体情况仍仍需在子子类中重重新测试试。一般般在下述述两种情情况下要要对成员员函数重重新进行行测试::●继承承的成员员函数在在子类中中有所改改动;●成员员函数调调用了改改动过的的成员函函数。(2)子子类的的测试用用例可以以参照父父类。例例如,有有两个不不同的成成员函数数的定义义如下::father:::B(()中定定义为if((value<<0)message(""less"));elseif(value===0)message(""equal"");elsemessage(("more"");son:::B(()中定定义为if((value<<0)message(""less"));elseif(value===0)message(""Itisequal"");else{message(""more"));if((value===99)message(""Luck"));}在原有的的测试上上,对son:::B(()的测测试只需需作如下下改动::将value==0的测试试结果期期望改动动,并增增加value==99这一一条件的的测试。。(3)设设计测测试用例例时,不不但要设设计确认认类功能能满足的的输入,,而且还还应有意意识地设设计一些些被禁止止的例子子,确认认类是否否有不合合法的行行为产生生。2.类类测试用用例设计计类测试是是类生存存期中的的初始测测试阶段段。类一一般是一一些单独独的部件件,可以以用于不不同的应应用软件件中。这这就要求求每个类类都必须须是可靠靠的,并并且不需需要了解解任何实实现细节节就能复复用。类类的测试试既可以以使用传传统的白白盒测试试方法,,也可以以使用黑黑盒测试试方法。。一般来来说,在在设计测测试用例例时,可可参照下下列步骤骤:(1)根根据OOD分分析结果果,选定定检测的的类,并并仔细分分出类的的状态和和相应的的行为,,以及成成员函数数间传递递的消息息和输入入输出的的界定。。(2)确确定覆覆盖标准准。(3)利利用结结构关系系图确定定待测试试类的所所有关联联。(4)构构造测测试用例例,确认认使用什什么输入入来激发发类的状状态,使使用类的的什么服服务,期期望产生生什么行行为。下面介绍绍两种常常用的类类测试用用例设计计方法。。1)基基于故障障的测试试用例设设计基于故障障的测试试(Fault-basedTesting))与传统统的错误误推测法法类似,,通过对对OOA/OOD模型型的分析析,首先先推测软软件中可可能有的的错误,,然后设设计出最最可能发发现这些些错误的的测试用用例。例例如,软软件工程程师经常常在问题题的边界界处犯错错误,因因此,在在测试((计算平平方根))操作((该操作作在输入入为负数数时返回回出错信信息)时时,应该该着重检检查边界界情况::一个接接近零的的负数和和零本

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论