![G第七章 面向对象分析与设计_第1页](http://file4.renrendoc.com/view/de43080de989e6e268527a04571807bf/de43080de989e6e268527a04571807bf1.gif)
![G第七章 面向对象分析与设计_第2页](http://file4.renrendoc.com/view/de43080de989e6e268527a04571807bf/de43080de989e6e268527a04571807bf2.gif)
![G第七章 面向对象分析与设计_第3页](http://file4.renrendoc.com/view/de43080de989e6e268527a04571807bf/de43080de989e6e268527a04571807bf3.gif)
![G第七章 面向对象分析与设计_第4页](http://file4.renrendoc.com/view/de43080de989e6e268527a04571807bf/de43080de989e6e268527a04571807bf4.gif)
![G第七章 面向对象分析与设计_第5页](http://file4.renrendoc.com/view/de43080de989e6e268527a04571807bf/de43080de989e6e268527a04571807bf5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
面向对象方法面向对象的概念面向对象软件的开发过程面向对象分析OOA面向对象设计OOD面向对象编程面向对象测试OO软件的测试用例设计intmain(){doubleA,B;intC;doubleD;cout<<“请输入数据A:”;cin>>A;cout<<“请输入数据B:”;cin>>B;cout<<“请输入运算符:”;cin>>C;switch(C){case‘+’:D=A+B;break;case‘-’:D=A-B;break;case‘*’:D=A*B;break;case‘/’:D=A/B;break;}cout<<A<<C<<B<<“=”<<D<<endl;return1;}#include<exception>#include<iostream>usingnamespacestd;classCOperation//"calculator.h"{public: doublem_dFirst; doublem_dSecond; virtualdoubleGetResult()=0 { doubledResult=0; returndResult; }};classAddOperation:publicCOperation//加法{public: virtualdoubleGetResult() { returnm_dFirst+m_dSecond; }};classSubOperation:publicCOperation//减法{public: virtualdoubleGetResult() { returnm_dFirst-m_dSecond; }};classMulOperation:publicCOperation//乘法{public: virtualdoubleGetResult() { returnm_dFirst*m_dSecond; }};classDivOperation:publicCOperation//除法{public: virtualdoubleGetResult() { if(m_dSecond==0)throwexception("除数不能为0!"); returnm_dFirst/m_dSecond; }};#include"calculator.h"classCCalculatorFactory{public:staticCOperation*Create(charcOperator){COperation*oper; switch(cOperator){ case'+': oper=newAddOperation(); break; case'-': oper=newSubOperation(); break; case'*': oper=newMulOperation(); break; case'/':oper=newDivOperation(); break; default: oper=newAddOperation(); break; } returnoper;}};#include"calculator.h"intmain(){doublea,b;cin>>a>>b;COperation*op=CCalculatorFactory::Create('/');op->m_dFirst=a;op->m_dSecond=b;cout<<op->GetResult()<<endl;return0;}面向对象软件工程和传统的软件工程的原理在本质上没有什么不同,只是在传统软件工程方法中增加了面向对象考虑和研究问题的思想方法。传统软件工程方法侧重于解决具体问题,而面向对象工程方法则是从解决一类问题的思想方法和手段来解决一个具体问题,从长远来看会有较高的效率。传统的软件工程原则中增加面向对象的指导原则,更丰富了软件工程的原理和方法。应注意不要将传统软件工程的思想方法和面向对象软件工程方法割裂开来。面向对象方法(Object-Oriented)是一种把面向对象思想应用于软件开发过程,从而指导软件开发活动的系统方法,它建立在对象概念基础上,是一种运用对象、类、继承、封装、聚合、消息发送及多态性等概念来构造系统的软件开发方法。面向对象方法面向对象技术的提出(类和对象的概念),最早是在编程语言Simula中提出的。其作者是Ole-JohanDahl
和KristenNygaard。Simula语言是两个语言的统称:SimulaI
和Simula67(Simula67是在1967年发布的)。Simula语言是公认的最早的面向对象语言,虽然他的实现并不是很完整。但这是语言发展史上的一个重要的里程碑。
20世纪70年代推出的Smalltalk是一个支持面向对象、动态类型、类型反射的程序语言,奠定了面向对象程序设计的基础。是AlanKay
设计的系统,DanIngalls实现的系统。AlanKay在设计的时候,借用了Simula的messagepassing思想。80年代出现的Smalltak-80中增加了meteclasses。这实现了一个思想:一切皆对象,标志着面向对象程序设计进入了实用阶段。
//Javainttries=0;while(tries<=5){TryAgain();tries++;}//Smalltalk|tries|tries:=0;[tries<=5]whileTrue:[selfTryAgain.tries:=tries+1]alternatively:5timeRepeat:[selfTryAgain]自80年代中期起,人们注重于面向对象分析和设计的研究,逐步形成了面向对象方法学。P.Coad和E.Yourdon的面向对象分析(Object-OrientedAnalysis,OOA)和面向对象设计(Object-OrientedDesign,OOD)GradyBooch的面向对象开发方法James
Rambough等人提出的对象建模技术(ObjectModelingTechnique,OMT)IvarJacobson的面向对象软件工程(Object-OrientedSoftwareEngineering,OOSE)面向对象方法与结构化方法区别OO方法对现实世界中的实体或者概念对象进行建模对象各负其责对象通过消息进行协同,完成复杂的任务结构化方法研究功能分解的方法通过复杂的功能组合实现系统功能面向对象方法成为主流开发方法,其原因主要有:直观、自然和简单。面向对象方法符合人们对客观世界的认识规律,当用户的需求有所改变时,由于客观实体不变,实体之间的联系基本不变,面向对象的总体结构就相对比较稳定。增加递增性开发。面向对象方法开发的软件系统其体系结构易于理解、扩充和维护,对象的具体实现细节对外部可见,当对象接口确定后,实现细节的修改不会影响其他对象,此外,还能依据规定的接口方便地组装成系统。支持软件重用。面向对象方法中的继承机制有力地支持软件复用,通过继承服用公共的属性和操作,补充形成新系统的类。结构更科学,更能适应未来变化。软件体系结构、软件复用、分布计算、分布对象技术和面向agent的软件工程敏捷方法是网络时代软件工程技术发展的趋势。面向对象方法的特点包括如下:从问题领域的客观事物出发构造软件系统。用对象抽象表示这些事物,并作为系统的基本构成。事物的静态特征(数据的表达特征)用对象的属性表示,事物的动态特征(即事物的行为)用对象服务表示(即方法)。对象的属性与服务结合成一个独立的实体,对外屏蔽其内部细节(封装)。对事物进行分类,具有相同属性和服务的对象归成一类,类是这些对象的抽象描述,每个对象是它的类的一个实例。在不同程度上运用抽象的原则,可以得到较一般和特殊的类,特殊的类继承一般的类的属性与服务,从而简化系统的构造过程及文档(继承)。复杂的对象可以用简单对象作为其构成部分(聚合)。对象之间通过消息进行通信以实现对象之间的动态联系。通过关联表达对象之间的静态联系。在面向对象方法开发的系统中,以类的形式进行描述,通过对类的引用而创建的对象是系统的基本构成单位。这些对象对应着问题论域中的各个事物,它们的属性与服务刻画了事物的静态特征和动态特征。对象类之间的继承关系、聚合关系、消息和关联表达了问题论域中事物之间实际存在的各种关系。无论是系统的构成成分,还是通过这些成分之间的关系而体现的系统结构,都可以直接地影射成问题论域。面向对象软件工程(OOSE)方法是面向对象方法在软件工程领域的全面应用,包括:面向对象分析(OOA):针对问题论域中客观存在的各项事物建立OOA模型中的对象,用对象的属性和服务分别描述事物的静态特征和行为。面向对象设计(OOD):针对系统的某个具体实现来运用OO方法(1)将OOA模型作为OOD的一部分;(2)针对具体实现中的人机界面、数据存储和任务管理等因素补充实现相关操作。面向对象编程(OOP):用一种面向对象的编程语言将OOD模型中的每个成分书写出来。面向对象测试(OOT):在测试中运用OO技术,以对象的类作为基本测试对象,查错范围主要是类定义之内的属性及服务,以及继承中类之间关系。面向对象软件维护(OOM):程序与问题论域保持一致,降低理解难度;对象的封装减小对象的修改对系统的影响。面向对象的软件系统:面向对象(OO)=对象(Object)+类(Classfication)+继承(Inheritance)+通过消息的通信(CommunicationWithMessage)。面向对象可以定义为:一种使用对象(属性与操作封装)、消息传递、类、继承和多态等来开发问题论域的解的范型。一种基于对象、类、实例和继承等概念的技术。用对象作为建模的单位。面向对象概念1、类的实例化过程是一种实例的合成过程,而不仅仅是根据单个类型进行的空间分配、初始化和绑定。指导编译程序进行这种合成的是________。
A.类层次结构 B.实例的个数C.多态的种类 D.每个实例的初始状态2、重置的基本思想是通过_______机制的支持,使得子类在继承父类界面定义的前提下,用适合于自己要求的实现去置换父类中的相应实现。A.静态绑定B.对象引用C.类型匹配D.动态绑定3、_____反映了类间的一种层次关系,而______反映了一种整体与部分的关系。A.继承 B.组合C.封装 D.多态A.继承B.组合C.封装D.多态ADBA1、类的实例化过程是一种实例的合成过程,而不仅仅是根据单个类型进行的空间分配、初始化和绑定。指导编译程序进行这种合成的是________。
A.类层次结构 B.实例的个数C.多态的种类 D.每个实例的初始状态2、重置的基本思想是通过_______机制的支持,使得子类在继承父类界面定义的前提下,用适合于自己要求的实现去置换父类中的相应实现。A.静态绑定B.对象引用C.类型匹配D.动态绑定3、_____反映了类间的一种层次关系,而______反映了一种整体与部分的关系。A.继承 B.组合C.封装 D.多态A.继承B.组合C.封装D.多态ADBA面向对象方法在生存周期各个阶段所开发出来的“部件”是类,并且各个类的信息需要进行细化,因此,类成为软件分析、设计和实现的基本单位。面向对象的开发模型有:应用生存期:对整个应用的开发过程进行了模型化,广泛应用于结构化软件开发项目。类生存期:生存期步骤独立于任何一个特殊应用的开发,引导开发工作逐个阶段循序渐进。面向对象软件发展过程实例建立论域分析应用分析高层设计类开发信息系统描述组装测试维护客户输入求精和维护从废弃型开始既存类的复用从既存类演变渐增式的测试类的规格说明测试用例和测试开发实现渐增式的实现类的定义:一旦标识了一个类,就给出了它的规格说明,其中包括类的实例可执行的操作及其数据结构。类的设计与实现:类的规格说明可指导对存放既存类的软件库进行查找,这些既存类可用来提供为当前应用所需要的功能。既存类的复用从既存类进行演变从废弃型进行开发求精和维护:传统的维护活动是针对应用的,二求精过程则是针对类,以及把类链接在一起的系统结构的。概念的封装和实现的隐藏,使得类具有更大的独立性;为便于类的调整,应尽量做到定义与实现的分离。将应用生存期放在一起,给出面向对象的应用开发过程。分析阶段包括论域分析和应用分析,要标识问题论域中的抽象。高层设计应当把系统与类的设计分开。在高层设计阶段,设计应用的顶层视图相当于开发一个标识系统的类的界面。类的开发。应用设计阶段基本上上类的开发,类的开发独立于待开发的应用,但可以支持这个应用。实例的建立是对问题的最后解决,建立实例之间的通信通道,通道可以把引用从一个对象传递到另一个对象来建立。组装测试把系统组装成一个完整的应用来进行测试。维护包括在系统的操作中定位故障、在现有的系统加入新的行为等。多数维护活动发生在类的这一级,把类的实现与其规格说明分离可局部化修改的影响。然而,为了在系统中增加新的行为,偶尔改变界面的需求还是会有的。面向对象分析的一般步骤是:在客户和软件工程师之间沟通基本的用户要求,获取客户对系统的需求,包括标识场景(Scenario)和用例(UseCase),以及建造需求模型;以基本的需求为指南来选择和标识类与对象(包括定义属性和基本操作);定义类的结构和层次;表示类(对象)之间的关系,建立对象-关系模型;建立对象-行为模型;利用用例/场景来复审模型,递进地重复任务1~5,直至完成建模。面向对象分析面向对象分析的目的是开发一系列模型,这些分析模型用来描述满足客户需求的计算机软件,描述信息、功能和行为。OOA的基本内容包括:产生一种描述系统功能和问题论域基本特征的综合文档,在分析过程中识别的概念是高层的抽象,这些抽象成为一个灵活的可扩充软件的基本构件块。把问题看作一组相互作用的实体,并确定这些实体之间的关系,把系统看成一个能够以有控制的方式执行的模型。从分析客户需求的文件开始,抽象出目标系统的本质属性,并用分析模型准确地表示出来。通过建立分析模型,能纠正早期开发期对问题域的误解。面向对象技术的流行衍生出许多OOA方法,每个方法都引入一个产品或系统分析过程,一组随过程演化的模型,以及以一致的方法创建模型的符号体系。Booch方法Coad和Yourdon方法Jocobson方法Rambaugh方法Wirfs-Brock方法Booch方法包含“微开发”和“宏开发”两个过程,微开发定义了一组在宏开发过程中的每一步反复应用的分析任务。宏开发过程概述如下:标识类和对象标识类和对象的语义标识类和对象之间的关系进行一系列精化实现类和对象Coad和Yourdon方法建模符号简单,开发分析模型的指引直接明了,其OOA过程概述如下:使用“寻找什么”的标准来标识对象。定义对象之间的一般/特殊结构。定义对象之间的整体/部分结构。标识主题(子系统的构件标识)。定义属性及对象之间的实例连接。定义服务及对象Jocobson方法即OOSE(面向对象软件工程),特别强调使用用例来描述用户和产品或系统间如何交互的场景,OOA过程概述如下:标识系统的用户和他们的整体责任。建造需求模型。建造分析模型。Rambaugh方法是分析、系统设计和对象级设计的对象建模技术(Object-ModelingTechnique),分析活动创建对象模型、动态模型以及功能模型。OOA过程概述如下:开发对问题的范围陈述。建造对象模型。开发动态模型。构造系统的功能模型。Wirfs-Brock方法没有明确区分分析和设计任务,而是从对客户规约的估计到设计完成一个连续过程,与分析相关的任务概述如下:评价客户规约。使用语法分析从规约中抽取候选集。组合类以试图标识超类。为每个类定义责任。为每个类赋予责任。标识类之间的关系。定一类之间基于责任的协作。构造类的层次表示以显示继承关系。构造系统的协作图。面向对象分析(OOA)过程分为论域分析和应用分析。论域分析建立大致的系统实现环境,而应用分析则根据特定应用的需求进行分析。论域分析是基于特定应用领域,标识、分析和定义可复用于应用论域内多个项目的公共需求的技术,它的目标是发现和创建一组应用广泛的类,可以复用于其他系统的开发。论域分析是与任何软件项目都没有牵连的软件工程活动论域知识源论域分析论域分析模型技术文件已有应用客户考察目前/未来的需求专家审议类的分类复用标准论域语言功能模型应用分析的依据是在论域分析时建立起来的论域分析模型,并把它用于当前正在建立的应用中。客户对系统的需求可以当作限制来使用,用它们缩减论域的信息量。相应时间需求、用户界面需求和某些特殊的需求,如数据安全等,都在应用分析这一层分解抽出。语义数据模型(SemanticDataModels)是建立问题论域模型的一种技术,论域分析的输出和对应用分析和高层设计的输入构成了问题论域模型。语义数据模型源于关系数据模型和实体-联系模型,并对这类模型进行和扩充和一般化。语义数据模型可以表达问题论域的内涵,也可以表示复杂对象和对象之间的联系。语义数据模型由外部模型、概念模型和内部模型等3层模型构成,这三层模型可以映射到面向对象设计的3个层次。语义数据模型主要特征面向对象设计外部模型用户的数据视图类的定义(规格说明)概念模型实体及其联系之间的内涵类之间的应用联系内部模型数据的物理模型类的实现外部模型是来自应用的外部现实世界的视图,反映了用户对问题的理解。概念模型要考虑在外部模型层所标识的实体之间的关系,联系的重要属性是实例连接。内部模型考虑实体的物理模型,是生存期中类的设计阶段,物理模型包括数据和操作。语义数据模型中的一般联系在面向对象设计中起着核心的作用,通过它们给出了继承和实例化等概念的表达。泛化(Generalization)聚合(Aggregation)分类(classification)关联(Association)语义数据模型提供了对外部层和概念层的支持,从用户视图的角度出发,标识和描述实体,还提供了从这些视图到实际数据结构的映像,即内部层。一般化关系表示类与类之间的继承关系接口与接口之间的继承关系类对接口的实现关系。方向:与继承或实现的方向相反从子类指向父类从实现接口的类指向被实现的接口。关联关系是类与类之间的联接它使一个类知道另一个类的属性和方法。关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头。单向的关联有一个箭头,表示关联的方向,更为普遍,通常不鼓励使用双向的关联。在Java语言里,关联关系用实例变量实现每一个关联都有一个名字(Drives)每一个关联都有两个端点每个端点有角色名,显示出关联的本质关联的端点有基数表明该端类有几个实例关联关系可以进一步确定为聚合关系或者合成关系聚合关系(共享聚合)是关联关系的一种,是强的关联关系。是整体和个体之间的关系(汽车类与引擎类、轮胎类)关联关系往往可以进一步确定为聚合关系或者合成关系(如唐僧(师傅)与徒弟)仅仅从Java语法上难以分辨关联与聚合,需要考察所涉及的类之间的逻辑关系。如果不能确定,可以设置为关联关系。合成关系(组成聚合)比聚合关系强的关联关系。整体对象负责部分对象的生命周期。负责部分对象的存活或消亡整体对象可以将代表部分的对象传递给另一个对象,由后者负责此对象的生命周期。代表部分的对象在每一个时刻只能与一个对象发生合成关系,由后者排他地负责其生命周期。合成关系聚合关系依赖关系表示一个类依赖于另一个类的定义。与关联关系不同:Person类里没有Car和House类的属性,Car和House类的实例是以参量的方式传入到buy()方法中去的。人(Person)可以买车(Car〕和房子(House),Person类依赖于Car类和House类。因为Person类引用了Car类和House类分类在系统的设计中出现了一个类的各个实例间有共享信息时,常常要利用分类联系,建立泛化/特化类的继承层次结构。在一个解释性语言环境(像Smalltalk)中,类的每个实例都可具有该类的属性。提供了一冲借助于“黑板”系统开发各实例间通信的能力,在这个黑板系统中,可以把一个实例相关属性写到黑板上,该类其他实例可以从黑板上读取它。而在系统中的其他对象不能存取这个属性,它仅仅对该类的实例是可访问的。在分析阶段所标识的对象是应用级的对象,即它们对应于应用论域的用户视图。由它们产生的类是对用户视图的模型而不是对物理数据结构的模型化。计算机显示屏幕就是一个对象,它给出用户界面部分,可将其抽象成一个类显示器屏幕,以反映用户的想法。标识的实现级的类可以是一个特殊的位图存储结构,为了确定在屏幕上将要显示什么,就需要扫描这个结构。作为显示器屏幕类的实现部分,需要使用一个位图类。在分析阶段,特定应用适用于要标识的联系,这些联系表明了问题论域中实体之间的相互作用。在设计中,应用级联系用下面两种方式中的一种来表示:消息连接。两个对象之间的通信联系可以标识为两个对象之件的消息。交互对象实例连接。两个对象之间的联系可以通过一个不依赖于两个对象种的任一方的交互对象表示。有四种类型,表示在两个类中实例的对应关系,包括一对一、多对一、一对多和多对多。面向对象设计是将OOA所创建的分析模型转化成设计模型。OOD和OOA采用相同的符号表示,没有明显的分界线,往往反复迭代进行。在OOA中关心的是系统“做什么”,而在OOD中要解决的是系统如何做。因此,需要在OOA模型中为系统的实现补充新的类,或在原有类中补充新属性和操作。OOA是一个分类活动,即分析问题力图确定在开发解决方案时可应用的对象类,同时确定对象关系和行为。OOD使得软件工程师能够确定从类中导出的对象,以及这些对象的相互关联,此外,OOD描述了对象间的关系如何达到;行为如何实现;对象间通信如何实现。OOD同样遵循抽象、信息隐藏、功能独立和模块化等设计准则。面向对象设计面向对象设计一般步骤如下:系统设计将子系统分配到处理器。选择实现数据管理、界面支持和任务管理的设计策略。为系统设计合适的控制机制。复审并考虑权衡对象设计在过程级别设计每个操作。定义内部类。为类属性设计内部数据结构消息设计:使用对象间的协作和对象-关系模型,设计消息模型。复审:复审设计模型,并在需要时迭代。OOD通常分为高层设计和低层设计两个阶段,高层设计建立应用的体系结构,低层设计集中于类及关系的详细设计。高层设计阶段开发软件的体系结构,构造软件的总体模型。主要是标识在计算机环境中解决问题所需要的概念,并增加一批新类(可使应用软件与系统的外部世界交互的类)。此阶段的输出是适合应用软件要求的类、类之间的关系和应用的子系统视图规格说明。从OOD导出的系统结构图系统级的抉择将影响对应用软件各个子系统的任务分配,但不影响各个类的结构。客户/服务器(C/S)模型是一个典型的高层设计模型,这个模型导出的体系结构既可以在过程性系统中使用,又可在面向对象的系统中使用。建立高层设计模型旨在让系统的一个部分(服务器子系统)提供一组服务给另一个部分(客户子系统)。请求服务的对象都归于客户子系统,而接受请求提供服务的就是服务器。对一个应用进行高层设计时,可以遵守以下几个简单规则:最小化构件间的通信。子系统各个高层构件之间的通信量应当达到最小。一个用户界面应当能够自行处理交互、改正错误和控制硬件,而不需打扰主应用。隐藏复杂性:子系统应当把那些成组的类打包,形成高度的内聚。逻辑功能分组:虽然输入和输出设备可能相互间不通信,但逻辑上把它们归组到一个处理输入/输出的子系统中。这样就提供了一个单元,它很容易识别并定位问题论域中的事件。类与通过概念封装的子系统十分类似。事实上,每个子系统都可以被当作一个类来实现,这个类聚集了它的构件,提供了一组操作。高层设计标识在计算机环境中实现问题解决所需要的概念,并增加了一批必要的类。这些类包括那些可使应用软件与系统的外部世界交互的类。这些交互则包括与其他软件系统(如数据库管理系统、鼠标和键盘)的界面,与收集数据或者负责控制的硬件设备的界面。这个阶段的输出是适合应用软件要求的类、类间的联系以及应用的子系统视图规格说明。标识应用所需的概念是类设计的第一步。应用分析过程包括了对问题论域所需的类的模型化。但在最终实现应用时,还需要追加一些类。类设计的主要目标是:单一概念的模型。在分析与高层设计阶段,常常需要使用多个类来表示一个“概念”。可复用的“插接相容性”构件。所开发的构件可以在未来的应用中使用。可靠的构件。应用软件必须是可靠的(健壮的和正确定义的)软件。而这种可靠性与它的构件有关。每个构件必须经过充分的测试。标识应用所需的概念是类设计的第一步。应用分析过程包括了对问题论域所需的类的模型化。但在最终实现应用时,还需要追加一些类。类设计的主要目标是:可集成的构件。将类的实例用到其他类的开发和应用中,这要求类的界面应当尽可能小,表示一个类所需要的数据和操作都包含在类定义中。因此,类的设计应当尽量减少命名冲突。类结构提供的封装特性使得把概念集成到应用的工作变得很容易。封装特性保证了把一个概念的所有细节都组合在一个界面下,而信息隐蔽则保证了实现级的名字将不会同其他类的名字互相干扰。类的模块设计还有以下一些方针:信息隐蔽。软件设计通过信息隐蔽可增强抽象,并可保护类的存储表示不被数据类型实例的用户直接存取。对其表示的惟一存取途径只能是界面。消息限制。类的设计者应当为类的命令设计一个明确的界面,该类的实例的用户应当只使用界面提供的操作。狭窄界面。不是所有的操作都是公共的。只有对其他类的实例必要的操作才放到界面上,其他操作应是隐蔽实现的。强内聚。模块内部各个部分之间应有较强的关系,它们不能分别标识。类的模块设计还有以下一些方针:弱耦合。在面向对象方法中是最基本的对象,耦合主要指不同对象之间相互关联的紧密程度。耦合程度依赖于所使用的分解方法,“一般/特殊”的继承结构损害了弱耦合的概念。包括交互耦合和继承耦合。显式信息传递。除了依赖于最少的类外,还应该明确在这些类之间的信息流。在类之间全局变量的共享隐含了信息的传递,并且是一种依赖形式。因此,两个类之间的交互应当仅涉及显式信息传递。显式信息传递是通过参数表来完成的。类的模块设计还有以下一些方针:派生类当作派生类型。每个派生类应该当做基类的特殊化来开发,而基类所具有的公共界面成为派生类的共有界面的一个子集。C++允许设计者选择类的基类是共有的或私有的。如果基类是共有的,则其共有界面将成为新的派生类的共有界面部分,这表明基类的行为成为派生类的行为部分。如果基类是私有的,它的行为将不是继承类的公共行为部分而是实现部分。对基类的划分是为了实现新类中的服务。抽象类。某些语言提供了一个类,用它作为继承结构的开始点,所有用户定义的类都直接或间接以这个类为基类。因此,每个继承结构的根类应当是目标概念的一个抽象模型。这个抽象模型生成一个类,它不用于产生实例。它定义了一个最小的共有界面,许多派生类可以加到这个界面上以给出概念的一个特定视图。利用既存类来设计类有4种方式,即选择、分解、配置和演变,这是面向对象技术的一个重要优点。许多类的设计都基于既存类的复用。选择。设计类最简单的方法是从既存构件中简单地选择合乎要求的构件。一个面向对象开发环境应提供常用构件库,大多数语言环境都带有一个原始构件库(如整数、实数和字符),它是提供其他所有功能的基础层。任何基本构件库(如“基本数据结构”构件)都应建立在这些原始层上。例如,列表、集合、栈和队列等,都是一些一般的和可复用的类。原始层还包括一组提供其他应用论域服务的一般类,如窗口系统和图形图元等。利用既存类来设计类有4种方式,即选择、分解、配置和演变,这是面向对象技术的一个重要优点。许多类的设计都基于既存类的复用。分解。最初标识的“类”常常是几个概念的组合。在着手设计时,可能会发现所标识的操作落在分散的几个概念中,或者会发现,数据属性被分开放到模型中拆散概念形成的几个组内。这样就必须把一个类分成几个类,希望新标识的类容易实现,或者它们已经存在。利用既存类来设计类有4种方式,即选择、分解、配置和演变,这是面向对象技术的一个重要优点。许多类的设计都基于既存类的复用。配置。在设计类时,可能会要求由既存类的实例提供类的某些特性。通过把相应类的实例声明为新类的属性来配置新类。利用既存类来设计类有4种方式,即选择、分解、配置和演变,这是面向对象技术的一个重要优点。许多类的设计都基于既存类的复用。演变。要开发的新类可能与一个既存类非常类似,但不完全相同。此时,不适宜采用“选择”操作,但可以将一个既存类演变成一个新类,可以利用继承机制来表示泛化的关系。特殊化处理有3种可能的方式,例如由既存类建立子类、通过继承层次由既存类建立新类和建立既存类的父类等。类的设计描述包括两部分:协议描述
(protocoldescription)。协议描述定义了每个类可以接收的消息,建立一个类的界面。协议描述由一组消息及对每个消息的相应注释组成。实现描述
(implementationdescription)实现描述说明了每个操作的实现细节,这些操作应包含在类的消息中。实现描述的信息有:类名和对一个类引用的规格说明私有数据结构的规格说明,包括数据项和其类型的指示。每个操作的过程描述。实现描述必须包含充足的信息,以提供对协议描述中所描述的所有消息的适当处理。接受一个类所提供服务的用户必须熟悉执行服务的协议,即定义“什么”被描述;而服务的提供者(对象类本身)必须关心:服务如何提供给用户,即实现细节的封装问题。界面。类的界面构成了类的规格说明,定义了与其他类的交互。界面包括操作特征及先决条件和后置条件。操作特征包括它的名字和应归入参数的类。命名操作。操作的命名指示了设计人员所采取的视点。操作的目的是操纵一个类的实例(该操作定义在此类上),或者提供有关该实例状态的信息。操作名应反映这个目的。传送给操作的信息是操作的另一特征,要求数据量不要很多。操作发送消息给对象,这些对象必须在消息的参数中出现。因此,操作可能会引起其他对象改变它们的状态,并改变它自己对象的状态。界面的级别。类定义中有三种不同的存取级别:Public(共有界面):类A的共有界面的使用者是所有使用类A的实例的对象的集会。这个界面是该类操作的一个列表,它包括通常使用的算法运算和输入输出函数。这些操作的实现和类的数据元素的确切表示,对类的用户来说都是隐蔽的。Private(私有界面):类的私有界面是一些操作的集合,这些操作仅为该类的其他操作所使用。它们是依赖于实现的;同时它们进一步把实现的细节对外部世界隐蔽起来。subclass(子类):类A的子类界面是一个操作的集合,使用这些操作可存取类A子类的实例。,这些操作多少有点依赖于实现的。它们允许子类对类的细节进行特殊的存取。标准界面。在设计类的层次时,结构的根类提供了一个模型或标准界面,它们能够描述在子类中可找到的那些概念。根类是抽象的,且不必实现界面上的每个操作,但它应提供将在每个子类中实现的操作的标准特征。内部结构。在类的内部定义了两种类型的数据:数据模型的成员和支持信息。数据模型的成员提供了概念的表示;支持信息仅仅是为了帮助概念的实现。数据模型对象的标识和定义是分析与高层设计阶段的任务,而支持数据对象的标识是类设计和实现级的任务。消息模式。要根据功能模型及动态模型,以及实际情况设计对象的消息模式。对象之间相互传递消息的机制是:当一个对象接收了一条消息后,就在该对象中寻找消息指定的操作名。假如没有找到,就到它的父类中寻找,直到查找成功,或查找失败(找完根类对象)为止。如果找到了所需的操作,就执行这个操作,执行的过程中会有进一步的消息发送。消息发送的方法是完全一样的,不考虑具体的接收者。消息模式和处理能力共同构成对象的外部特性。确定各类之间的继承关系时,将各对象的公共性质放在较上层的类中描述,通过继承而共享对公共性质的描述。类又是一种分层结构,类的上层可以有父类,下层有子类。子类直接继承父类的全部描述,这也叫传递性。类可以有多个父类和多个子类,即多重继承;如果只限于一个父类,叫简单继承,在这种情况下,类的层次结构是树型结构。在实现时,利用继承性可把通用的类和专用的类存储于类库中,根据需要可以复用它们。面向对象方法把软件开发的分析、设计和实现自然地联系在一起。虽然面向对象设计原则上不依赖于特定的实现环境,但是实现的结果和成本却在很大程度上取决于实现环境。因此,直接支持面向对象设计范式的面向对象程序语言、开发环境及类库等,对于面向对象实现来说是非常重要的。面向对象编程(OOP)
是在完成面向对象分析、面向对象设计的基础上,利用一种或多种面向对象语言,具体实现软件各项功能的过程。面向对象的程序设计语言适合用来实现面向对象设计结果。事实上,具有方便的开发环境和丰富的类库的面向对象程序设计语言,是实现面向对象设计的最佳选择。面向对象编程不论采用何种面向对象语言进行编码,它们都有共性的一面,即符合面向对象编程的规范,具有面向对象的编程风格。面向对象的程序设计语言必须支持下面的概念:封装的对象类和实例的概念类的继承类的多态性面向对象编程中的基本构件是对象和类,基本机制是方法、消息和继承性,提高软件开发的抽象层次、提高软件的重用性,是面向对象编程的基本思想和手段。设计重点集中在类和类层次结构的设计、实现和重用上,是面向对象编程和传统程序设计的本质区别。详细的面向对象设计是与语言有关的。这样,可以有效地为过程型语言、面向软件包的语言、面向对象的语言所用。通常所有的语言都可以完成面向对象实现,但某些语言能够提供更丰富的语法,能够显式地描绘在面向对象分析和面向对象设计过程中所使用的表示法。面向对象设计与过程型语言面向对象设计与基本对象语言面向对象设计与面向对象的程序设计语言面向对象设计与面向对象数据库语言(OODBL)、面向对象数据库管理系统(OODBMS)及语言,是面向对象程序设计语言(OOPL)与数据管理能力的组合OODBMS有4种不同的体系结构:大属性。扩充关系型DBMS,能容纳大属性,如一个文档。松散耦合。一个OOPL与大量的DBMS组合在一起。紧密耦合。一个OOPL与某个专用的DBMS集成为一个系统。扩充关系型。扩充关系型DBMS,能容纳“过程”之类的属性。紧密耦合体系结构在程序设计和数据操纵中使用了同一种语言,它更能显式地表达面向对象分析和面向对象设计的语义。面向对象程序设计语言(OOPL,Object-Oriented
ProgrammingLanguages)是目前最为流行的一类高级语言,主要有Java、C++、VisualC++和Delphi等。OOPL以其内在机制体现了OOP的核心思想,同时为OOP的实际应用提供了有效的支持和规范化的约束。尽管使用传统编程语言也可以体现一些OOP风格,但传统编程语言中缺少像继承性这样的OOPL所独有的基本机制,所以OOPL更为规范、高效、易于重用和易于维护。纯OOPL为OOP的发展起到了奠基作用,混合式OOPL则使得OOP为软件产业所真正接受。在OOPL中广泛使用了动态联编、多态性、多重继承等技术,类库和程序设计环境则是决定一个OOPL是否适用的两个关键因素。OOPL的基本特征有七个,即:对象、类、继承性、信息隐藏、强类型化、并发性、持久性。但是,目前还没有哪一种语言能够同时具备这些特征。流行的OOPL都可以归入以下六类语言之一:基于对象的语言,支持对象。基于类的语言,对象属于类。面向对象的语言,类支持继承性。面向对象的数据抽象语言,类支持信息隐藏。面向对象的强类型化语言,类型可以在编译时确定。支持并发性与持久性的面向对象的强类型化语言。常用的面向对象软件的测试方法和技巧与过程软件相同,或者可以从传统的测试方法和技巧中演化而来,但实践和研究表明,它们之间还是存在许多不同。面向对象的软件测试要面对某些新的挑战。同时,作为增量开发过程的一部分,设计良好的面向对象软件为改善传统测试过程提供了机遇。在面向对象编程语言中,继承和多态的特征对测试者来说是一个新的技术难点。面向对象技术不仅给编程语言带来了变化,而且给软件开发的很多方面也带来了变化。面向对象测试对于面向对象的软件测试,使用了增量开发过程,重新调整并使用新的符号来分析和设计,并充分利用编程语言的新特性,这些变化提高了软件的可维护性、复用性和灵活性等等:面向对象技术中特有的封装、继承和多态机制,给面向对象测试带来了一些新的特点,增加了测试和调试的难度。在面向对象程序中,对象是属性和操作的封装体。对象彼此之间通过发送消息启动相应的操作,并且通过修改对象状态达到转换系统运行状态的目的。对象并没有明显地规定用什么次序启动它的操作才是合法的。因此在测试类的实现时,面对的不是一段顺序的代码,所以传统的测试方法(?)就不完全适用了。传统的编程中,复用无非是从已有的程序中复制一段代码,放到当前的程序中,或者调用标准的库函数。而面向对象程序中不仅要测试父类,对于继承的子类也需要展开进行测试。随着继承层次的加深,虽然可复用的构件越来越多,但是,测试的工作量和难度也随之增加。面向对象的开发是渐进的迭代开发,从分析设计到实现使用相同的语义结构,如类、属性、操作、消息等。复审对面向对象方法来说显得特别重要,面向对象的测试必须扩大到面向对象分析和面向对象设计阶段。正式的技术复审可用于检查分析和设计模型的正确性和一致性。为了保证分析和设计模型的正确性和—致性,分析人员和业务人员应该对分析和设计模型中的主要内容(类图、交互图、活动图和接口描述、构架描述、界面描述)进行仔细的讨论,确定正确的分析和设计模型。为了保持模型之间的一致性,应该检查每个类以及类之间的连接,如果一个类在模型的某一部分有表示,而在模型的其他部分没有正确的反映,则一致性是有问题的。检查一致性可以从分析模型开始,采用深度优先的策略,一直跟踪到设计模型,配合正确性检查,保持模型间的一致性。每次的开发迭代都要进行单元测试和集成测试,测试设计人员要规划每一次迭代需要的测试工作。迭代的每一个构造都需要做集成测试,迭代结束时进行系统测试。设计和实现测试采取的方法是创建测试规程和测试用例,测试规程说明如何执行一个测试。有时可能还需要创建使测试自动化的测试构件。按照测试规程执行测试,系统地处理每个测试的结果,当发现有缺陷的构造时,要重新测试,甚至可能要送回给其他核心工作流,以修复严重的缺陷。出于开发工作的迭代性,一些在早期创建的测试用例也可以在后续用做回归测试用例。在迭代中对回归测试的需要逐步增长,这意味着后期迭代将包括大量的回归测试。测试阶段具体包括如下几个活动:制定测试计划根据用况模型、分析模型、设计模型、实现模型以及构架描述和补充需求来制定测试计划,目的是为了规划一次迭代中的测试工作。包括描述测试策略、估计测试工作所需要的人力以及系统资源、制定测试工作的进度。在准备测试计划时应该考虑用况模型和补充性需求等制品,来辅助制定测试进度、预算测试的工作量。一般的测试设计准则是:所设计的测试用例和测试规程能以最小的代价来测试最重要的用况,并且对风险性最大的需求进行测试。测试阶段具体包括如下几个活动:设计测试用例设计集成测试用例。集成测试用例用于验证被组装成构造的构件之间能够正常交互。测试设计人员应设计一组测试用例,以便有效地完成测试计划中规定的测试目标。为此,测试设计人员应尽可能寻找一组互不重叠的测试用例,以尽可能少的测试用例,发现尽可能多的问题。设计系统测试用例。系统测试用于测试系统功能整体上是否正确,在不同条件下的用况组合的运行是否有效。这些条件包括不同的硬件配置、不同程度的系统负载、不同数量的参与者,以及不同规模的数据库。在设计系统测试用例时,还要考虑事件流和一些特殊需求。测试阶段具体包括如下几个活动:设计回归测试用例为了验证将迭代开发中产生的构件集成在一起是否有缺陷,除了添加一些必要的测试用例进行接口的验证外,充分利用前面已经使用过的测试用例来验证后续的构造是非常有效的。设计回归测试用例时,要注意灵活性,它要能够适应被测试软件的变化。测试阶段具体包括如下几个活动:实现测试:构件工程师根据测试用例、测试规程和被测软件的实现模型设计并实现测试构件,实现测试规程自动化。实现测试构件有两种方法:依赖于测试自动化工具。构件工程师根据测试规程,在测试自动化工具环境中执行测试规程所描述的动作,测试工具会自动记录这些动作,构件工程师整理这些记录,并做适当的调整,生成一个测试构件。这种构件通常是以脚本语言实现的,例如,VisualBasic的测试脚由构件工程师以测试规程为需求规格说明,进行分析和设计后,使用编程语言开发的测试构件。开发测试构件的工程师需要有更高超的编程技巧和责任心。测试阶段具体包括如下几个活动:实现集成测试:由集成测试人员根据测试用例、测试规程、测试构件和实现模型对一次迭代内创建的每个构造执行集成测试,并且将集成测试的结果返回给测试设计人员和相关的工作流负责人员,集成测试的工作步骤如下:对每一个测试用例执行测试规程(手工或自动),实现与构造相关的集成测试。将测试结果和预期结果相比较,研究二者的偏离原因。把缺陷报告给相关工作流的负责人员,对构件的缺陷进修改。把缺陷报台给测试设计人员,对测试结果和缺陷类型进行统计分析,评估整个测试的结果。执行系统测试测试阶段具体包括如下几个活动:执行系统测试:集成测试表明系统满足了当前迭代中所确定的集成质量目标后,开始进行系统测试。根据测试用例、测试规程、测试构件和实现模型对迭代开发的结果进行系统测试,并且将测试中发现的问题反馈给相关人员。评估测试:这是由测试设计人员根据测试计划、测试用例、测试规程、测试构件和测试执行者反馈的测试缺陷对一次迭代内的测试工作做出的评估。测试设计人员准备了一些度量标准,用来确定软件的质量水平,并确定还需要进一步做多少测试工作。测试设计人员尤其看重两条度量标准:
测试完全性。测试设计人员分析测试用例
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 个人车位购置合同范本
- 二手房租赁代理合同
- 临时停车场服务合同样本
- 中小企业劳动合同示范文本集
- 个人房屋交易合同样本
- 临街门面租赁合同协议
- 与供应商签订的产品采购合同范本
- 个人商业贷款质押合同范本书
- 二手车喷烤漆房改造合同
- 个体宝石采购合同范本
- 苏州2025年江苏苏州太仓市高新区(科教新城娄东街道陆渡街道)招聘司法协理员(编外用工)10人笔试历年参考题库附带答案详解
- 搞笑小品剧本《大城小事》台词完整版
- 物业服务和后勤运输保障服务总体服务方案
- 人大代表小组活动计划人大代表活动方案
- 《大模型原理与技术》全套教学课件
- 2023年护理人员分层培训、考核计划表
- 《销售培训实例》课件
- 2025年四川省新高考八省适应性联考模拟演练(二)地理试卷(含答案详解)
- 【经典文献】《矛盾论》全文
- Vue3系统入门与项目实战
- 2024年宁夏回族自治区中考英语试题含解析
评论
0/150
提交评论