资源描述
,单击此处编辑母版标题样式,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第九章 面向对象方法学,面向对象(,Object-Oriented,缩写为,OO),方法学的出发点和基本原则,是尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程,也就是使描述问题的问题空间(也称为问题域)与实现解法的解空间(也称为求解域)在结构上尽可能一致。,9.1 面向对象方法学概述,通常,客观世界中的实体既具有静态的属性又具有动态的行为。然而传统语言提供的解空间对象实质上却仅是描述实体属性的数据,必须在程序中从外部对它施加操作,才能模拟它的行为。,面向对象方法学所提供的“对象”概念,是让软件开发者自己定义或选取解空间对象,然后把软件系统作为一系列离散的解空间对象的集合。应该使这些解空间对象与问题空间对象尽可能一致。这些解空间对象彼此间通过发送消息而相互作用,从而得出问题的解。也就是说,面向对象方法是一种新的思维方法,它不是把程序看作是工作在数据上的一系列过程或函数的集合,而是把程序看作是相互协作而又彼此独立的对象的集合。每个对象就像一个微型程序,有自己的数据、操作、功能和目的。这样做就向着减少语义断层的方向迈了一大步,在许多系统中解空间对象都可以直接模拟问题空间的对象,解空间与问题空间的结构十分一致,因此,这样的程序易于理解和维护。,面向对象方法学的主要优点,1.与人类习惯的思维方法一致,面向对象的软件技术以对象(,Object),为核心,用这种技术开发出的软件系统由对象组成。对象是对现实世界实体的正确抽象,它是由描述内部状态表示静态属性的数据,以及可以对这些数据施加的操作(表示对象的动态行为),封装在一起所构成的统一体。对象之间通过传递消息互相联系,以模拟现实世界中不同事物彼此之间的联系。,面向对象的设计方法与传统的面向过程的方法有本质不同,这种方法的基本原理是,使用现实世界的概念抽象地思考问题从而自然地解决问题。它强调模拟现实世界中的概念而不强调算法,它鼓励开发者在软件开发的绝大部分过程中都用应用领域的概念去思考。在面向对象的设计方法中,计算机的观点是不重要的,现实世界的模型才是最重要的。面向对象的软件开发过程从始至终都围绕着建立问题领域的对象模型来进行:对问题领域进行自然的分解,确定需要使用的对象和类,建立适当的类等级,在对象之间传递消息实现必要的联系,从而按照人们习惯的思维方式建立起问题领域的模型,模拟客观世界。,2.稳定性好,面向对象方法基于构造问题领域的对象模型,以对象为中心构造软件系统。它的基本作法是用对象模拟问题领域中的实体,以对象间的联系刻画实体间的联系。因为面向对象的软件系统的结构是根据问题领域的模型建立起来的,而不是基于对系统应完成的功能的分解,所以,当对系统的功能需求变化时并不会引起软件结构的整体变化,往往仅需要作一些局部性的修改。例如,从已有类派生出一些新的子类以实现功能扩充或修改,增加或删除某些对象等。总之,由于现实世界中的实体是相对稳定的,因此,以对象为中心构造的软件系统也是比较稳定的。,面向对象的软件技术在利用可重用的软件成分构造新的软件系统时,有很大的灵活性。有两种方法可以重复使用一个对象类:一种方法是创建该类的实例,从而直接使用它;另一种方法是从它派生出一个满足当前需要的新类。继承性机制使得子类不仅可以重用其父类的数据结构和程序代码,而且可以在父类代码的基础上方便地修改和扩充,这种修改并不影响对原有类的使用。由于可以像使用集成电路(,IC),构造计算机硬件那样,比较方便地重用对象类来构造软件系统,因此,有人把对象类称为“软件,IC”。,面向对象的软件技术所实现的可重用性是自然的和准确的,在软件重用技术中它是最成功的一个。,2.1.可维护性好,由于下述因素的存在,使得用面向对象方法所开发的软件可维护性好。,面向对象的软件稳定性比较好。,面向对象的软件比较容易修改。,面向对象的软件比较容易理解。,易于测试和调试。,把所有对象都划分成各种对象类(简称为类,,Class),,每个对象类都定义了一组数据和一组方法。数据用于表示对象的静态属性,是对象的状态信息。因此,每当建立该对象类的一个新实例时,就按照类中对数据的定义为这个新对象生成一组专用的数据,以便描述该对象独特的属性值。例如,荧光屏上不同位置显示的半径不同的几个圆,虽然都是,Circle,类的对象,但是,各自都有自己专用的数据,以便记录各自的圆心位置、半径等等。,类中定义的方法,是允许施加于该类对象上的操作,是该类所有对象共享的,并不需要为每个对象都复制操作的代码。,按照子类(或称为派生类)与父类(或称为基类)的关系,把若干个对象类组成一个层次结构的系统(也称为类等级)。在这种层次结构中,通常下层的派生类具有和上层的基类相同的特性(包括数据和方法),这种现象称为继承(,Inheritance)。,但是,如果在派生类中对某些特性又做了重新描述,则在派生类中的这些特性将以新描述为准,也就是说,低层的特性将屏蔽高层的同名特性。,对象彼此之间仅能通过传递消息互相联系。,对象与传统的数据有本质区别,它不是被动地等待外界对它施加操作,相反,它是进行处理的主体,必须发消息请求它执行它的某个操作,处理它的私有数据,而不能从外界直接对它的私有数据进行操作。也就是说,一切局部于该对象的私有信息,都被封装在该对象类的定义中,就好像装在一个不透明的黑盒子中一样,在外界是看不见的,更不能直接使用,这就是“封装性”。,综上所述,面向对象的方法学可以用下列方程来概括:,OO=Objects+Classes+Inheritance+Communication with messages,也就是说,面向对象就是既使用对象又使用类和继承等机制,而且对象之间仅能通过传递消息实现彼此通信。,9.1.1 对象,在应用领域中有意义的、与所要解决的问题有关系的任何事物都可以作为对象(,Object),,它既可以是具体的物理实体的抽象,也可以是人为的概念,或者是任何有明确边界和意义的东西。例如,一名职工、一家公司、一个窗口、一座图书馆、一本图书、贷款和借款等,都可以作为一个对象。总之,对象是对问题域中某个实体的抽象,设立某个对象就反映了软件系统保存有关它的信息并具与它进行交互的能力。,1.对象的特性是:,(1)每一个对象必须有一个名字以区别于其它对象;,(2)用属性(或叫状态)来描述它的某些特征;,(3)有一组操作,每一个操作决定对象的一种行为。,2.对象的定义,(1)定义1,对象是具有相同状态的一组操作的集合。,这个定义主要是从面向对象程序设计的角度看“对象”。,(2)定义2,对象是对问题域中某个东西的抽象,这种抽象反映了系统保存有关这个东西的信息或与它交互的能力。也就是说,对象是对属性值和操作的封装。,这个定义着重从信息模拟的角度看待“对象”。,(3)定义3,对象=,其中,,ID,是对象的标识或名字,MS,是对象中的操作集合,DS,是对象的数据结构,MI,是对象受理的消息名集合(即对外接口),这个定义是一个形式化的定义。,用自动机模拟对象,3.对象的特点,以数据为中心。,对象是主动的。,实现了数据封装。,本质上具有并行性。,易维护性(模块独立性好)。,通常,一个消息由下述三部分组成:,接收消息的对象;,消息选择符(也称为消息名);,零个或多个变元。,消息具有三个性质:,(1)同一个对象可以接收不同形式的多个消息,做出不同的响应;,(2)相同形式的消息可以传递给不同的对象,所做出的响应可以是不同的;,(3)消息的发送可以不考虑具体的接受者,对象可以响应消息,也可以不响应。,方法,就是对象所能执行的操作,也就是类中所定义的服务。方法描述了对象执行操作的算,法,响应消息的方法。,在,C+,语言中把方法称为成员函数。,类的形式,消息模式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),多态性意思是“有许多形态”。,一个名字可具有多种语义,。,多态性是指允许不同类的对象对同一消息作出响应。,在面向对象的软件技术中,多态性是指子类对象可以像父类对象那样使用,同样的消息既可以发送给父类对象也可以发送给子类对象。也就是说,在类等级的不同层次中可以共享(公用)一个行为(方法)的名字,然而不同层次中的每个类却各自按自己的需要来实现这个行为。当对象接收到发送给它的消息时,根据该对象所属于的类动态选用在该类中定义的实现算法。,9.2 面向对象建模,为了更好地理解问题,人们常常采用建立问题模型的方法。所谓模型,就是为了理解事物而对事物作出的一种抽象,是对事物的一种无歧义的书面描述。通常,模型由一组图示符号和组织这些符号的规则组成,利用它们来定义和描述问题域中的术语和概念。更进一步讲,模型是一种思考工具,利用这种工具可以把知识规范地表示出来。,用面向对象方法开发软件,通常需要建立三种形式的模型,它们分别是描述系统数据结构的对象模型,描述系统控制结构的动态模型和描述系统功能的功能模型。这三种模型都涉及到数据、控制和操作等共同的概念,只不过每种模型描述的侧重点不同。这三种模型从三个不同但又密切相关的角度模拟目标系统,它们各自从不同侧面反映了系统的实质性内容,综合起来则全面地反映了对目标系统的需求。一个典型的软件系统组合了上述三方面内容:它使用数据结构(对象模型),执行操作(动态模型),并且完成数据值的变化(功能模型)。,9.2.1 对象模型,对象模型表示静态的、结构化的系统的“数据”性质。它是对模拟客观世界实体的对象以及,对象彼此间的关系的映射,描述了系统的静态结构。,9.2.1.1 表示类&对象的图形符号,1.类&对象,“类&对象”是一个专用术语,它的含义是“一个类及由它创建的对象”。图9.5是表示类&对象的图形符号,,图9.5 表示符号,类名,2.命名,类名是一类对象的名字。命名是否恰当对系统的可理解性影响相当大,因此,命名时应该遵守以下几条准则。,(1)使用标准术语,(2)使用具有确切含义的名词,(3)必要时用名词短语作名字,总之,名字应该是富于描述性的、简洁的而且无二义性的。,9.2.1.2 表示结构和连接,在任何一个较为复杂的问题域中,事物之间并不是互相孤立、各不相关的,而是具有一定的关系,并因此构成一个有机的整体。为了使系统能够有效地映射问题域,系统开发者需认识并描述对象之间的以下几种关系:,对象的分类关系;,对象之间的组成关系;,对象属性之间的静态联系;,对象行为之间的动态联系。,OO,方法利用一般特殊结构、整体部分结构、实例连接和消息连接描述对象之间的以上四种关系。,1.,一般特珠,它反映了一个类与若干个互不相容的子类之间的分类关系。高层类(即基类)说明一般性的属性,低层类(即派生类)说明特殊属性和服务。低层类对象“即是(,IS A)”,某种特殊的高层类对象,它继承了在高层类中定义的属性和服务。,它是一个以类为结点、以继承关系为边的连通有向图。,表示,一般特珠,关系的图形符号(图9-6),。,一般特珠,关系,2.整体部分关系,“整体部分”关系就是组合(组装)关系,它反映了对象之间的构成关系。,通过它可以看出某个类的对象以另外一些类的对象作为其组成部分,表示组合关系的图形符号(图9-7)。,组合关系具有的最重要的性质是传递性。如果,A,是,B,的一部分,,B,是,C,的一部分,则,A,也是,C,的一部分。,当组合关系有多个层次时,可用一棵简单的聚集树来表示它。聚集树是多级组合关系的一,种简化表示形式。,整体部分关系,描绘教材结构的聚集树,3.,实例连接,关联关系反映对象之间相互依赖、相互作用的静态关系。通常把两类对象之间的二元关系再细分为一对一(11)、一对多(1,M),和多对多(,MN),等三种,基本类型,类型的划分依据参与关联的对象的数目。,(1)表示符号(图9-8,(2)阶:,是参与关联的对象的个数。,教师与属于他的书之间的实例连接,(4)消息连接,消息连接描述对象之间的动态联系。即若一个对象在执行服务时,需要通过消息请求另一个对象为它完成某个服务,则说第一个对象与第二个对象之间存在着消息连接。消息连接是有向的,从消息发送者指向消息接收者。,消息连接的表示符号,是从消息发送者指向消息接收者的箭头线,如图9-9所示。,消息连接的表示符,9.2.1.3 对象模型之例,图9-10 一家公司的对象模型,与图9-10对应的ER图,9.2.2 动态模型,动态模型表示瞬时的、行为化的系统的“控制”性质,它规定了对象模型中的对象的合法变化序列。,通常,用状态图来描绘对象的状态、触发状态转换的事件、以及对象的行为(对事件的响应)。,每个类的动态行为用一张状态图来描绘,各个类的状态图通过共享事件合并起来,从而构成系统的动态模型。也就是说,动态模型是基于事件共享而互相关联的一组状态图的集合。,9.2.2.1概念,1.事件,事件是某个特定时刻所发生的事情,它是对引起对象从一种状态转换到另一种状态的现实世界中的事件的抽象。事件没有持续时间,是瞬间完成的。,2.状态,状态就是对象在其生命周期中的某个特定阶段所具有的行为模式,它是对影响对象行为的属性值的一种抽象。,状态规定了对象对输入事件的响应方式。,3.行为,所谓行为,是指对象达到某种状态时所做的一系列处理操作。这些操作是需要耗费时间的。,9.2.2.2 符号,状态图中使用的主要表示符号如下所述(图9-11):,状态用圆形框或椭圆框表示,框内可标上状态名也可以不给状态起名字,行为在框内用关键字,do(,后接冒号)标明。,从一个状态到另一个状态的转换用箭头线表示,线上标以事件名。必要时可在事件名后面加一个方括号,括号内写上状态转换的条件。也就是说,仅当方括号内所列出的条件为真时,,该事件的发生才引起箭头所示的状态转换。,9.2.3 功能模型,功能模型表示变化的系统的“功能”性质,它指明了系统应该“做什么”,因此更直接地反映了用户对目标系统的需求。,功能模型描述系统内的计算,它是面向对象模型支撑的第三条腿,补充对象模型和动态模型。功能模型详细说明发生了什么,动态模型详细说明什么时候发生的,而对象模型详细说明了对象本身是什么。,功能模型表示了在计算中按对象的操作刻划出从输入值如何导出输出值,而无需考虑被计算值的时序。,功能模型是由多个数据流图组成的,这些数据流图描述从外部输入数据流,经过操作和内部数据存储,再向外部输出的过程。功能模型也包含了对象模型内的值之间的约束,数据流图不表示控制和对象结构的信息,这些是属于动态模型和对象模型的事。功能模型详细说明了计算的结果,不必指明它们如何或什么时候计算的,功能模型不但说明了在对象模型中操作的意义和在动态模型中的动作,而且说明了在对象模型中的约束。,9.2.3.2 三种模型之间的关系,在面向对象方法学中,对象模型是最基本最重要的,它为其他两种模型奠定了基础,我们依靠对象模型完成三种模型的集成。,下面扼要地叙述三种模型之间的关系。,针对每个类建立的动态模型,描述了类实例的生命周期或运行周期。,状态转换驱使行为发生,这些行为在数据流图中被映射成处理,它们同时与对象模型中的服务相对应。,功能模型中的处理,对应于对象模型中类&对象所提供的服务。通常,在顶层数据流图中的处理,对应于复杂对象提供的服务;在低层数据流图中的处理,对应于更基本的对象(基本对象是复杂对象的组成部分)的服务。有时一个处理对应多个服务,也有一个服务对应多个处理的时候。,功能模型中的数据存储,以及数据的源点/终点(在功能模型中称为动作对象),通常是对象模型中的对象。,功能模型中的数据流,往往是对象模型中的属性值,也可能是整个对象。,功能模型中的处理可能产生动态模型中的事件。,对象模型描述了功能模型中的动作对象、数据存储以及数据流的结构。,小结,近年来,面向对象方法学日益受到人们的重视,特别是在用这种方法开发大型软件产品时,可以把该产品看作是一系列本质上相互独立的小产品,这就不仅降低了开发工作的技术难度,而且也使得对开发工作的管理变得容易了。因此,对于大型软件产品来说,面向对象范型明显优于结构化范型。此外,使用面向对象范型能够开发出稳定性好、可重用性好和可维护性好的软件,这些都是面向对象方法学的突出优点。,面向对象方法学比较自然地模拟了人类认识客观世界的思维方式,它所追求的目标和遵循的基本原则,就是使描述问题的问题空间和在计算机中解决问题的解空间,在结构上尽可能一致。,面向对象方法学认为,客观世界由对象组成。任何事物都是对象,每个对象都有自己的内部状态和运动规律,不同对象彼此间通过消息相互作用、相互联系,从而构成了我们所要分析和构造的系统。系统中每个对象都属于一个特定的对象类。类是对具有相同属性和行为的一组相似对象的定义。应该按照子类、父类的关系,把众多的类进一步组织成一个层次系统,这样做了之后,如果不加特殊描述,则处于下一层次上的对象可以自动继承位于上一层次的对象的属性和行为。,用面向对象观点建立系统的模型,能够促进和加深对系统的理解,有助于开发出更容易理解、更容易维护的软件。通常,人们从三个互不相同然而又密切相关的角度建立起三种不同的模型。它们分别是描述系统静态结构的对象模型、描述系统控制结构的动态模型、以及描述系统计算结构的功能模型。其中,对象模型是最基本、最核心、最重要的。,的面向对象方法及定义的概念和表示符号,可以适用于整个软件开发过程。软件开发人员无须像用结构分析、设计技术那样,在开发过程的不同阶段转换概念和表示符号。实际上,用面向对象方法开发软件时,阶段的划分是十分模糊的,通常在分析、设计和实现等阶段间多次迭代。,
展开阅读全文