1、面向对象方法概述v面向对象方法的组成v什么是面向对象v面向对象技术的发展历史v面向对象的基本概念v面向对象的软件工程方法 面向对象方法概览1 什么是面向对象什么是面向对象 面向对象(Object Oriented)技术是软件工程领域中的重要技术,这种软件开发思想比较自然地模拟了人类认识客观世界的方式,成为当前计算机软件工程学中的主流方法。应该特别强调的是,面向对象技术不仅仅是一种程序设计方法,更重要的是一种对真实世界的抽象思维方式。 1 什么是面向对象什么是面向对象v面向对象方法按照人类的自然思维方式,面对客观世界建立软件系统模型:v对象、类、继承、封装等基本概念符合人类的自然思维方式。v有利
2、于对业务领域和系统责任的理解。v有利于人员的交流1 什么是面向对象什么是面向对象 面向对象技术的基本观点如下:(1) 客观世界是由对象组成的,任何客观的事物或实体都是对象,复杂的对象可以由简单的对象组成。(2) 具有相同数据和相同操作的对象可以归并为一个类,对象是对象类的一个实例。(3) 类可以派生出子类,子类继承父类的全部特性(数据和操作),又可以有自己的新特性。子类与父类形成类的层次结构。(4) 对象之间通过消息传递相互联系。类具有封装性,其数据和操作等对外界是不可见的,外界只能通过消息请求进行某些操作,提供所需要的服务。 1 什么是面向对象什么是面向对象 软件工程学家Codd和Yourd
3、on认为: 面向对象对象类继承通信 如果一个软件系统采用这些概念来建立模型并予以实现,那么它就是面向对象的。2 面向对象技术的发展历史面向对象技术的发展历史 面向对象方法起源于面向对象程序设计语言,后来才逐步形成了面向对象的分析和设计方法,其发展过程大体上经历了初始阶段、发展阶段和成熟阶段等过程。2 面向对象技术的发展历史面向对象技术的发展历史 初始阶段60年代末挪威奥斯陆大学和挪威计算中心共同研制的Simula语言是面向对象语言发展历史上的第一个里程碑,它首先引入了类的概念和继承机制,后来的一些著名面向对象编程语言(如Smalltalk、C+、Eiffel)都受到Simula的启发。 KRI
4、STEN NYGAARD(Simula创始人)2 面向对象技术的发展历史面向对象技术的发展历史 初始阶段80年代,Xerox研究中心推出了Smalltalk语言和环境,它具备了面向对象语言的继承和封装的主要特征,使面向对象程序设计方法趋于完善,掀起了面向对象研究的高潮。2 面向对象技术的发展历史面向对象技术的发展历史 发展阶段从80年代中期到90年代,面向对象语言十分热门,大批比较实用的面向对象编程语言(Object Oriented Programming Language,OOPL)涌现出来,如C+、Objective-C、Object Pascal、CLOS(Common Lisp Ob
5、ject System)、Eiffel、Actor等,特别是C+语言已成为目前应用最广泛的OOPL。Bjarne Stroustrup(C+创始人)2 面向对象技术的发展历史面向对象技术的发展历史 发展阶段90年代中期,出现了JAVA语言。 JAMES GOSLING2 面向对象技术的发展历史面向对象技术的发展历史 发展阶段从80年代中期到90年代,面向对象语言十分热门,大批比较实用的面向对象编程语言(Object Oriented Programming Language,OOPL)涌现出来,如C+、Objective-C、Object Pascal、CLOS(Common Lisp Obj
6、ect System)、Eiffel、Actor等,特别是C+语言已成为目前应用最广泛的OOPL。面向对象编程语言的繁荣是面向对象方法走向实用的重要标志,也是面向对象方法在计算机学术界、产业界和教育界日益受到重视的推动力。 2 面向对象技术的发展历史面向对象技术的发展历史 成熟阶段在C+语言十分热门的时候,人们开始了对面向对象分析(Object Oriented Anlysis,OOA)的研究,进而延伸到面向对象设计(Object Oriented Design,OOD)。特别是90年代以后,许多专家都在尝试用不同的方法进行面向对象的分析与设计,其中比较著名的有Booch的方法、Rumbaug
7、h的OMT方法、Coad/Yourdon的方法、Wirtf-Brock的RDD方法、Shlear-Mellor的方法、Gibon的OBA方法、Jacobson的OOSE方法、Martin-Odell的方法、Fusion方法等,这些方法各有所长,力图解决复杂软件系统的开发问题。在这段时期,面向对象的分析和设计技术逐渐走向实用,最终形成了从分析、设计到编程、测试与维护一整套的软件工程体系。 3 面向对象的基本概念面向对象的基本概念 对象对象从不同的角度有不同的含义,我们针对系统开发来讨论对象的概念,其定义是:对象(Object)是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位,由一组
8、属性和对这组属性进行操作的一组服务组成。在这里,属性和服务是构成对象的两个基本要素,其定义是:属性是用来描述对象静态特征的一个数据项。服务是用来描述对象动态特征(行为)的一个操作序列。 3 面向对象的基本概念面向对象的基本概念 例子:面向对象的基本概念(例子)面向对象的基本概念(例子) What are the games objects? What do those objects knowhow to do? What properties do they have?面向对象的基本概念(例子)面向对象的基本概念(例子)What are the games objects?v piece,
9、boardCapabilities: What do those objects know how to do?v piece:v be createdv fallv rotatev stop at collisionv board:v be createdv remove rowsv check for end of game Properties: What attributes and components do they have?v piece:v orientationv positionv shapev colorv board:v sizev rows3 面向对象的基本概念面向
10、对象的基本概念 从一般意义上讲,对象是现实世界中的一个实际存在的事物,它可以是有形的,如车辆、房屋等,也可以是无形的,如国家、生产计划等。而人们在开发一个系统时,则在一定的范围(也称问题域)内考虑和认识与系统目标有关的事物,并用系统中的对象来抽象地表示它们。在这里,对象只描述客观事物本质的、与系统目标有关的特征,而不考虑那些非本质的、与系统目标无关的特征。同时,对象是属性和服务的结合体,对象的属性值只能由这个对象的服务来读取和修改。 3 面向对象的基本概念面向对象的基本概念类类(Class)是具有相同属性和服务的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和服务两
11、个主要部分。类好比是一个对象模板,用它可以产生多个对象。类所代表的是一个抽象的概念或事物,在客观世界中实际存在的是类的实例,即对象。 3 面向对象的基本概念面向对象的基本概念类举例:在学校教学管理系统中,“学生”是一个类,其属性具有姓名、性别、年龄等,可以定义“入学注册”、“选课”等操作。一个具体的学生“王平”是一个对象,也是“学生”类的一个实例。3 面向对象的基本概念面向对象的基本概念类 把众多的事物归纳并划分成一些类是人类在认识客观世界时经常采用的思维方法,分类的原则是抽象,从那些与当前目标有关的本质特征中找出事物的共性,并将具有共同性质的事物划分成一类,得出一个抽象的概念。例如:人、房屋
12、、树木等都是一些抽象的概念,它们是一些具有共同特征的事物的集合,称为类。类的概念使我们能对属于该类的全部个体事物进行统一的描述,树具有树根、树干、树枝和树叶,它能进行光合作用,这个描述适合所有树,而不必对每一棵具体的树进行描述。 3 面向对象的基本概念面向对象的基本概念 封装封装(Encapsulation)是把对象的属性和服务结合成一个独立的系统单位,并尽可能隐藏对象的内部细节。封装是面向对象方法的一个重要原则,系统中把对象看成是属性和对象的结合体,使对象能够集中而完整地描述一个具体事物。封装的信息隐蔽作用反映了事物的相对独立性,当我们从外部观察对象时,只需要了解对象所呈现的外部行为(即做什
13、么),而不必关心它的内部细节(即怎么做)。3 面向对象的基本概念面向对象的基本概念封装举例:电视机包括外形尺寸、分辨率、电压、电流等属性,具有打开、关闭、调谐频道、转换频道、设置图象等服务,封装意味着将这些属性和服务结合成一个不可分的整体,它对外有一个显示屏、插头和一些按钮等接口,用户通过这些接口使用电视机,而不关心其内部的实现细节。3 面向对象的基本概念面向对象的基本概念封装 与封装密切相关的概念是可见性,它是指对象的属性和服务允许对象外部存取和引用的程度。在软件上,封装要求对象以外的部分不能随意存取对象的内部数据(属性),从而有效地避免了外部错误对它的交叉感染,使软件错误能够局部化,大大减
14、少了查错和排错的难度。另外,当对象内部需要修改时,由于它只通过少量的服务接口对外提供服务,便大大减少了内部修改对外部的影响,即减少了修改引起的波动效应。3 面向对象的基本概念面向对象的基本概念封装 封装也有副作用,如果强调严格的封装,则对象的任何属性都不允许外部直接存取,因此就要增加许多没有其他意义、只负责读或写的服务,从而为编程工作增加了负担,增加了运行开销。为了避免这一点,语言往往采取一种比较灵活的做法,即允许对象有不同程度的可见性。 3 面向对象的基本概念面向对象的基本概念继承继承 继承(Inheritance)是指子类可以自动拥有父类的全部属性和服务。继承简化了人们对现实世界的认识和描
15、述,在定义子类时不必重复定义那些已在父类中定义过的属性和服务,只要说明它是某个父类的子类,并定义自己特有的属性和服务即可。 3 面向对象的基本概念面向对象的基本概念继承继承举例:考虑轮船和客轮两个类,轮船具有吨位、时速、吃水线等属性和行驶、停泊等服务,客轮具有轮船的全部属性和服务,又有自己的特殊属性(如载客量)和服务(如供餐),因此客轮是轮船的子类,轮船是客轮的父类。与父类/子类等价的其他术语有一般类/特殊类、超类/子类、基类/派生类等。3 面向对象的基本概念面向对象的基本概念继承继承一个类可以是多个父类的子类,它从多个父类中继承了属性与服务,这称为多继承(Multiple Inheritan
16、ce)。举例:客轮既是一种轮船,又是一种客运工具,它可以继承轮船和客运工具这两个类的属性和服务。3 面向对象的基本概念面向对象的基本概念继承继承继承对于软件复用是十分有益的,如果将OO方法开发的类作为可复用构件,那么在开发新系统时可以直接复用这个类,还可以将其作为父类,通过继承而实现复用,从而大大扩展了复用的范围。3 面向对象的基本概念面向对象的基本概念消息消息 消息(Message)是对象发出的服务请求,一般包含提供服务的对象标识、服务标识、输入信息和应答信息等信息。通常,一个对象向另一个对象发出消息请求某项服务,接收消息的对象响应该消息,激发所要求的服务操作,并将操作结果返回给请求服务的对
17、象。 3 面向对象的基本概念面向对象的基本概念消息消息 举例:使用电视机时,用户通过按钮或遥控器发出转换频道的消息,电视机变换对电视台的接收信号频率,并将结果显示给用户。在这里,用户发出的信息包括:接受者-电视机;要求的服务-转换频道;输入信息-转换后的频道序号;应答信息-转换后频道的节目。 3 面向对象的基本概念面向对象的基本概念消息消息 面向对象技术的封装机制使对象各自独立,各司其职,消息通信则为它们提供了唯一合法的动态联系途径,使它们的行为能够相互配合,构成一个有机的运动的系统。3 面向对象的基本概念面向对象的基本概念消息消息 面向对象技术的封装机制使对象各自独立,各司其职,消息通信则为
18、它们提供了唯一合法的动态联系途径,使它们的行为能够相互配合,构成一个有机的运动的系统。3 面向对象的基本概念面向对象的基本概念结构与连接结构与连接 任何事物之间都不是互相孤立,而是彼此联系的,并因此构成一个有机的整体。对象之间常见的联系包括: 分类关系,即一般与特殊结构; 组成关系,即整体与部分结构; 对象属性之间的静态联系,即实例连接; 对象行为之间的动态联系,即消息连接。 3 面向对象的基本概念面向对象的基本概念结构与连接结构与连接 (1) 一般与特殊结构 3 面向对象的基本概念面向对象的基本概念结构与连接结构与连接 (1) 一般与特殊结构又称分类结构(classification str
19、ucture),它是由一组具有一般与特殊关系(即继承关系)的类所组成的结构。其中,由一些单继承关系的类形成的结构称为层次结构,由一些多继承关系的类形成的结构称为网格结构,上图显示了一般与特殊的结构。3 面向对象的基本概念面向对象的基本概念结构与连接结构与连接 (2) 整体与部分结构又称组装结构(composition structure),它描述对象之间的组成关系,即一个(或一些)对象是另一个对象的组成或部分。例如,大学中的系由办公室、实验室、资料室等组成, 办公室、实验室、资料室 对象类与 系 对象类之间是部分与整体的关系。 。3 面向对象的基本概念面向对象的基本概念结构与连接结构与连接 (
20、3) 实例连接实例连接反映对象之间的静态联系,它是通过对象的属性来表现对象之间的依赖关系。在面向对象的术语中,对象之间的实例连接被称为链接(Link),而存在实例连接的对象类之间的联系称为关联(Association)。例如,教师与学生是独立的两个类,它们之间存在教学联系,这种联系是通过类中的教学课程、时间、地点等属性建立起来的。3 面向对象的基本概念面向对象的基本概念结构与连接结构与连接 (4) 消息连接消息连接描述了对象之间的动态联系,即如果一个对象在执行自己的服务时,需要通过消息请求另一个对象为它完成某个服务,那么就说第一个对象与第二个对象之间存在着消息连接。消息连接是有向的,从消息发送
21、者指向消息接收者。 一般与特殊结构、整体与部分结构、实例连接和消息连接都是面向对象的分析和设计阶段必须考虑的重要概念,只有在分析和设计阶段认清问题域中的这些结构与连接关系,编程时才能准确而有效地反映问题域。 3 面向对象的基本概念面向对象的基本概念多态性多态性 多态性(Polymorphism)是指在父类中定义的属性或服务被子类继承后,可以具有不同的数据类型或表现出不同的行为。在体现一般与特殊关系的一个类层次结构中,不同层次的类可以共享一个操作,但却有各自不同的实现。当一个对象接收到一个请求时,它根据其所属的类,动态地选用在该类中定义的操作。 3 面向对象的基本概念面向对象的基本概念多态性多态
22、性 举例:在父类几何图形中定义了一个服务绘图,但并不确定执行时绘制一个什么图形。子类椭圆和多边形都继承了几何图形类的绘图服务,但其功能却不相同:一个是画椭圆,一个是画多边形。当系统的其他部分请求绘制一个几何图形时,消息中的服务都是绘图,但椭圆和多边形接收到该消息时却各自执行不同的绘图算法。 3 面向对象的基本概念面向对象的基本概念多态性多态性 多态性机制不但为软件的结构设计提供了灵活性,减少了信息冗余,明显提高了软件的可复用性和可扩充性。多态性的实现需要OOPL提供相应的支持,与多态性实现有关的语言功能包括:重载(overload)、动态绑定(dynamic binding)、类属(gener
23、ic)。 3 面向对象的基本概念面向对象的基本概念主动对象主动对象 主动对象(Active Object)是一组属性和一组服务的封装体,其中至少有一个服务不需要接收消息就能主动执行(称为主动服务)。 主动对象的作用是描述问题域中具有主动行为的事物以及在系统设计时识别的任务,其主动服务描述相应任务所应完成的操作。在系统实现阶段,主动服务应该被实现为一个能并发执行的、主动的程序单位,如进程或线程。 除了具有主动服务外,主动对象的其他方面与被动对象没有什么不同,主动对象中也可以有一些在消息的驱动下执行的一般任务。 4 面向对象的软件工程方法 面向对象的软件工程方法是面向对象方法在软件工程领域的全面运
24、用,涉及到从面向对象分析(OOA)、面向对象设计(OOD) 、面向对象编程(OOP)、面向对象测试(Object Oriented Testing,OOT)到面向对象软件维护(Object Oriented Software Maintenance,OOSM)的全过程。 4 面向对象的软件工程方法 面向对象的分析面向对象的分析(OOA)就是运用面向对象的方法进行需求分析,其主要任务是分析和理解问题域,找出描述问题域和系统责任所需的类及对象,分析它们的内部构成和外部关系,建立OOA模型。 4 面向对象的软件工程方法 面向对象的设计面向对象的设计(OOD)就是根据已建立的分析模型,运用面向对象技术
25、进行系统软件设计。它将OOA模型直接变成OOD模型,并且补充与一些实现有关的部分,如人机界面、数据存储、任务管理等。OOA与OOD采用一致的表示法,使得从OOA到OOD不存在转换,只有局部的修改或调整,并增加了与实现有关的独立部分,因此,OOA与OOD之间不存在传统方法中分析与设计之间的鸿沟,成为面向对象方法的主要优势。4 面向对象的软件工程方法 面向对象的编程面向对象的编程(OOP)就是用一种面向对象的编程语言将OOD模型中的各个成分编写成程序,从OOAOODOOP的无缝连接和平滑过渡,提高了开发工作的效率和质量。4 面向对象的软件工程方法 面向对象的测试面向对象的测试(OOT)是指对于运用
26、OO技术开发的软件,在测试过程中继续运用OO技术进行以对象概念为中心的软件测试。它以类作为基本测试单位,集中检查在类定义之内的属性、服务和有限的对外接口,大大减少了错误的影响范围。 4 面向对象的软件工程方法 面向对象的软件维护软件维护的最大难点在于人们对软件的理解过程中所遇到的障碍,在面向对象方法中,各阶段采用的表示是一致的,从而大大降低了理解的难度,无论是从程序中的错误追溯到问题域,还是需求的变化需要从问题域追溯到程序,整个过程都是平坦的。另外,对象的封装性使得一个对象的修改对其他对象的影响很小,不至于牵一发而动全身。 5 面向对象方法的优点 面向对象方法与传统的软件开发方法相比,具有许多
27、显著的优点,其主要优点如下:(1) 按照人类的自然思维方式,面对客观世界建立软件系统模型,有利于对问题域和系统责任的理解,有利于人员交流。(2) 在整个开发过程中采用统一的概念和模型表示,填平了语言之间的鸿沟,使得开发活动之间平滑过渡,下图显示了传统的软件工程方法与面向对象方法的比较。在传统的结构化方法中,自然语言与编程语言之间存在差距,开发人员需要将自然语言表示的分析结果转换成计算机的编程语言,工作量巨大且容易出错。在面向对象的方法中,OOA、OOD和OOP采用统一的表示方法,不存在这样的鸿沟。 5 面向对象方法的优点 传统的开发方法与面向对象的开发方法 5 面向对象方法的优点 (3) 对象所具有的封装性和信息隐蔽等特性,使其容易实现软件复用。对象类可以派生出新类,类可以产生实例对象,从而实现了对象类的数据结构和操作代码的软构件的复用。另外,面向对象程序设计语言的开发环境一般预定义了系统动态连接库,提供大量公用程序代码,避免重复编写,提高了开发效率和质量。 (4) 在面向对象的方法中,系统由对象构成,对象是一个包含属性和操作两方面的独立单元,对象之间通过消息联系。这样的系统一旦出错,容易定位和修改,系统的可维护性好。