您好,欢迎访问三七文档
第九章面向对象方法学面向对象(Object-Oriented,缩写为OO)方法学的出发点和基本原则,是尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程,也就是使描述问题的问题空间(也称为问题域)与实现解法的解空间(也称为求解域)9.1面向对象方法学概述通常,客观世界中的实体既具有静态的属性又具有动态的行为。然而传统语言提供的解空间对象实质上却仅是描述实体属性的数据,必须在程序中从外部对它施加操作,才能模拟众所周知,软件系统本质上是信息处理系统。数据和处理原本是密切相关的,把数据和处理人为地分离成两个独立的部分,会增加软件开发的难度。与传统方法相反,面向对象方法是一种以数据或信息为主线,把数据和处理相结合的方法。面向对象方法把对象作为由数据及可以施加在这些数据上的操作所构成的统一体。对象与传统的数据有本质区别,它不是被动地等待外界对它施加操作,相反,它是进行处理的主体。必须发消息请求对象主动地执行它的某些操作,处理它的私有数据,而不能从外界直接对它面向对象方法学所提供的“对象”概念,是让软件开发者自己定义或选取解空间对象,然后把软件系统作为一系列离散的解空间对象的集合。应该使这些解空间对象与问题空间对象尽可能一致。这些解空间对象彼此间通过发送消息而相互作用,从而得出问题的解。也就是说,面向对象方法是一种新的思维方法,它不是把程序看作是工作在数据上的一系列过程或函数的集合,而是把程序看作是相互协作而又彼此独立的对象的集合。每个对象就像一个微型程序,有自己的数据、操作、功能和目的。这样做就向着减少语义断层的方向迈了一大步,在许多系统中解空间对象都可以直接模拟问题空间的对象,解空间与问题空间的结构十分一致,因此,这样的程序易于理解和维护。面向对象方法学的主要优点1.面向对象的软件技术以对象(Object)为核心,用这种技术开发出的软件系统由对象组成。对象是对现实世界实体的正确抽象,它是由描述内部状态表示静态属性的数据,以及可以对这些数据施加的操作(表示对象的动态行为),封装在一起所构成的统一体。对象之间通过传递消息互相联系,以模拟现实世界中面向对象的设计方法与传统的面向过程的方法有本质不同,这种方法的基本原理是,使用现实世界的概念抽象地思考问题从而自然地解决问题。它强调模拟现实世界中的概念而不强调算法,它鼓励开发者在软件开发的绝大部分过程中都用应用领域的概念去思考。在面向对象的设计方法中,计算机的观点是不重要的,现实世界的模型才是最重要的。面向对象的软件开发过程从始至终都围绕着建立问题领域的对象模型来进行:对问题领域进行自然的分解,确定需要使用的对象和类,建立适当的类等级,在对象之间传递消息实现必要的联系,从而按照人们习惯的思维方式2.面向对象方法基于构造问题领域的对象模型,以对象为中心构造软件系统。它的基本作法是用对象模拟问题领域中的实体,以对象间的联系刻画实体间的联系。因为面向对象的软件系统的结构是根据问题领域的模型建立起来的,而不是基于对系统应完成的功能的分解,所以,当对系统的功能需求变化时并不会引起软件结构的整体变化,往往仅需要作一些局部性的修改。例如,从已有类派生出一些新的子类以实现功能扩充或修改,增加或删除某些对象等。总之,由于现实世界中的实体是相对稳定的,因3.事实上,离开了操作数据便无法处理,而脱离了数据的操作也是毫无意义的,我们应该对数据和操作同样重视。在面向对象方法所使用的对象中,数据和操作正是作为平等伙伴出现的。因此,对象具有很强的自含性,此外,对象所固有的封装性和信息隐藏机理,使得对象的内部实现与外界隔离,具有较强的独立性。由此可见,对象类提供了比较理想的模块化机制和比较理想面向对象的软件技术在利用可重用的软件成分构造新的软件系统时,有很大的灵活性。有两种方法可以重复使用一个对象类:一种方法是创建该类的实例,从而直接使用它;另一种方法是从它派生出一个满足当前需要的新类。继承性机制使得子类不仅可以重用其父类的数据结构和程序代码,而且可以在父类代码的基础上方便地修改和扩充,这种修改并不影响对原有类的使用。由于可以像使用集成电路(IC)构造计算机硬件那样,比较方便地重用对象类来构造软件系统,因此,有人把对象类称为“软件IC”面向对象的软件技术所实现的可重用性是自然的和准确的,4.当开发大型软件产品时,组织开发人员的方法不恰当往往是出现问题的主要原因。用面向对象范型开发软件时,可以把一个大型产品看作是一系列本质上相互独立的小产品来处理,这就不仅降低了开发的技术难度,而且也使得对开发工作的管理变得容易多了。这就是为什么对于大型软件产品来说,面向对象范型优于结构化范型的原因之一。许多软件开发公司的经验都表明,当把面向对象技术用于大型软件开发时,软件成本明显地降低了,软件的整体质量也提高了。2.1.由于下述因素的存在,使得用面向对象····9.1面向对象的概念概括地说,面向对象方法具有下述四个要点。认为客观世界是由各种对象组成的,任何事物都是对象,复杂的对象可以由比较简单的对象以某种方式组合而成。按照这种观点,可以认为整个世界就是一个最复杂的对象。因此,面向对象的软件系统是由对象组成的,软件中的任何元素都是对象,复杂的软由此可见,面向对象方法用对象分解取代了传统方法的功能分解。把所有对象都划分成各种对象类(简称为类,Class),每个对象类都定义了一组数据和一组方法。数据用于表示对象的静态属性,是对象的状态信息。因此,每当建立该对象类的一个新实例时,就按照类中对数据的定义为这个新对象生成一组专用的数据,以便描述该对象独特的属性值。例如,荧光屏上不同位置显示的半径不同的几个圆,虽然都是Circle类的对象,但是,各自都有自类中定义的方法,是允许施加于该类对象上的操作,是该类所有按照子类(或称为派生类)与父类(或称为基类)的关系,把若干个对象类组成一个层次结构的系统(也称为类等级)。在这种层次结构中,通常下层的派生类具有和上层的基类相同的特性(包括数据和方法),这种现象称为继承(Inheritance)。但是,如果在派生类中对某些特性又做了重新描述,则在派生类中的这些特性将以新描述为准,也就是说,低层的特性将屏蔽高层的同名特性。对象与传统的数据有本质区别,它不是被动地等待外界对它施加操作,相反,它是进行处理的主体,必须发消息请求它执行它的某个操作,处理它的私有数据,而不能从外界直接对它的私有数据进行操作。也就是说,一切局部于该对象的私有信息,都被封装在该对象类的定义中,就好像装在一个不透明的黑盒子中一样,在外界是看不见的,更不能直接使用,这就是“封装性”。OO=Objects+Classes+Inheritance+Communicationwithmessages也就是说,面向对象就是既使用对象又使用类和继承等机制,9.1.1对象在应用领域中有意义的、与所要解决的问题有关系的任何事物都可以作为对象(Object),它既可以是具体的物理实体的抽象,也可以是人为的概念,或者是任何有明确边界和意义的东西。例如,一名职工、一家公司、一个窗口、一座图书馆、一本图书、贷款和借款等,都可以作为一个对象。总之,对象是对问题域中某个实体的抽象,设立某个对象就反映了软件1.对象的特性是:(1)每一个对象必须有一个名字以区别于其它对象;(2)用属性(或叫状态)来描述它的某些特征;(3)有一组操作,每一个操作决定对象的一种行为。图9.1对象的形象表示2.(1)定义1这个定义主要是从面向对象程序设计的角度看“对象”。(2)定义2对象是对问题域中某个东西的抽象,这种抽象反映了系统保存有关这个东西的信息或与它交互的能力。也就是说,对象是这个定义着重从信息模拟的角度看待“对象”(3)定义3对象∷=ID,MS,DS,MI其中,IDMSDSMI是对象受理的消息名集合(即对外接口)这个定义是一个形式化的定义。总之,对象是封装了数据结构及可以施加在这些数据结构上的操作的封装体,这个封装体有可以唯一地标识它的名字,而且向外界提供一组服务(即公有的操作)。对象中的数据表示对象的状态,一个对象的状态只能由该对象的操作来改变。每当需要改变对象的状态时,只能由其他对象向该对象发送消息。对象响应消息时,按照消息模式找出与之匹配的方法,并执行该方法。从动态角度或对象的实现机制来看,对象是一台自动机。具有内部状态S,操作fi(i=1,2,…,n),且与操作fi对应的状态转换函数为gi(i=1,2,…,n)的一个对象,可以用图所示的自动机来模拟。用自动机模拟对象3.·以数据为中心。·对象是主动的。·实现了数据封装。·本质上具有并行性。·易维护性(模块独立性好)。9.1.2消息(Message)和方法(Method)消息,所谓消息,就是向对象发出的服务请求。消息用来请求对象执行某一处理或回答某些信息的要求,某一对象在执行相应的处理时,如果需要,它可以通过传递消息请求其他对象完成某些处理工作或回答某些信息;其他对象在执行所要求的处理活动时,同样可以通过传递消息与别的对象联系。··消息选择符(也称为消息名)·零个或多个变元。消息具有三个性质:(1)同一个对象可以接收不同形式的多个消息,做出不同的响应;(2)相同形式的消息可以传递给不同的对象,所做出的响应可以是不同的;(3)消息的发送可以不考虑具体的接受者,对象可以响应消息,也可以不响应。方法,就是对象所能执行的操作,也就是类中所定义的服务。方法描述了对象执行操作的算法,响应消息的方法。在C++语言中把方法称为成员函数。9.1.3类(Class)在面向对象的软件技术中,“类”就是对具有相同数据和相同操作的一组相似对象的定义,也就是说,类是对具有相同属性和行为的一个或多个对象的描述,通常在这种描述中也包括对怎样创建该类的新对象的说明。属性,就是类中所定义的数据,它是对客观世界实体所具有的性质的抽象。类的每个实例都有自己特有类的形式消息模式1处理能力1……消息模式n处理能力n内部状态的表现形式消息模式1处理能力1的实现……消息模式n处理能力n的实现外部特征内部特征类名属性服务对象名属性服务图9.1.3类与对象的关系抽象具体9.1.4继承性继承所表达的是对象类之间相关的关系。这种关系使得某类对象可以继承另外一类对象的所有特征和能力,并加入若干新的内容。如图9.1.4所示。若类之间具有继承关系,则它们之间具有下列几个特性:(1)类间具有共享特征(包括数据和程序代码的共享);(2)类间具有差别或新增部分(包括非共享的数据和程序代码)。(3)类间具有层次结构。实现继承机制的原理9.1.2.1.封装(Encapsulation)从字面上理解,所谓封装就是把某个事物包起来,使外界不知道该事物的具体内容。封装的定义为:1.一个清楚的边界,所有的对象的内部软件的范围被限定在这个边界内;2.一个接口,这个接口描述这个对象和其他的对象之间相互的作用;3.受保护的内部实现,这个实现给出了由软件对象提供的功能的细节,实现细节能在定义这个对象的类的外面访问。对象将私有元素和实现操作的内部细节隐藏起来,并能管理自己的内部状态。外部只能从对象所表示的具体概念、对象提供的服务和对象提供的外部接口来认识对象。通过向对象发送消息来激活对象的自身动作,达到施加特定操作的目的。封装的信息隐蔽作用反映了事物的相对独立性。当我们站在对象以外的角度观察一个对象时,只需要注意它对外呈现什么行为,而不必关心它的内部细节。规定了它的职责之后,就不应该随意从外部插手去改动它的内部信息或干预它的工作。封装的原则在软件上的反映是:要求使对象以外的部分不能随意存取对象的内部数据(属性),从而有效地避免了外部错误对它的波动效应,使软件错误能够局部化。9.1.6多态性(Polymorphism)多态性意思是“有许多形态”。一个名字可具有多种语义。多态性是指允许不同类的对象对同一消息
本文标题:面向对象方法(一)
链接地址:https://www.777doc.com/doc-1960737 .html