《面向对象的方法.ppt》由会员分享,可在线阅读,更多相关《面向对象的方法.ppt(80页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第七章第七章 面向对象的方法面向对象的方法高 毅Shanghai Jiao Tong University主要内容结构化的开发方法按功能分解问题、按模块构建系统。这种方法是在传统的编程语言环境下诞生的,用这种方法构建的系统结构使得开发人员在面对用户需求频繁变更的开发环境时,吃尽了苦头。相比之下,面向对象的语言和方法,使开发人员如释重负,他们看到了摆脱困境的一线曙光。首先,面向对象编程方法带来了高效、可靠、易维护、易扩充的效果。其次,运用面向对象的思维模式来认识和理解系统的构成,更接近于人们对客观世界的认知习惯。最重要的是,运用面向对象的方法构建的设计方案能够灵活自如地应对用户的需求变更,而这种
2、变更对使用结构化方法构建的系统往往是一种致命的挑战。因此,面向对象的方法逐渐发展成为主流的管理信息系统开发方法。Shanghai Jiao Tong University主要内容本章重点理解结构化方法面临的挑战、面向对象的思想和面向对象方法的优势,以及面向对象的基本概念和范型。Shanghai Jiao Tong University7.1 从结构化到面向对象7.2 回顾面向对象的范型7.3 面向对象的重要方法7.4 面向对象的术语及其关系Shanghai Jiao Tong University7.1.1 结构化方法面临的挑战与结构化方法相比,面向对象的方法具有先天的优势,也正是具备了这种先
3、天的优势,面向对象的方法才逐步发展为管理信息管理系统开发的一种主流方法。充分认识和了解结构化设计方法遇到的诸多挑战才能看到面向对象设计方法的优点,从而更好地理解面向对象的思想、机制和范型。开发管理信息系统首先要对现实系统进行调查和分析,被调查和分析的项目范围常被称为问题域。无论有没有运用计算机等现代化的设备进行信息处理,现实中的信息系统总是客观存在的,它也许是一个手工的管理信息系统,也有可能是一个早期的比较落后的管理信息系统。管理信息系统的现代化程度要跟企业的基础管理水平相适应,当手工的或早期的管理信息系统不能满足企业管理的需要时,企业就会提出开发新的管理信息系统的需求。7.1 从结构化到面向
4、对象Shanghai Jiao Tong University现实系统是一个复杂的系统,我们开发计算机化的管理信息系统,本质上讲是对现有的管理信息系统的改造,是在原有管理信息系统的基础上,引入了现代化的信息处理工具和现代化的科学管理方法。这一过程能否成功,取决于对现实系统的认识和构建新系统的思维模式上。然而,结构化的方法和面向对象的方法在认识现实系统并构造新的管理信息系统的过程中,采取了两种截然不同的认知与构建的思维模式。Shanghai Jiao Tong University软件是管理信息系统的重要组成部分,结构化方法是按功能分解的规律组织软件系统结构的,即为完成一个任务需要构造一个软件系
5、统,这个系统是具有能完成这个任务的功能的。为了实现这个功能,可能需要将其进一步分解为多个更具体的子功能,最后每个子功能又可能再被分解为若干个功能模块。然后,编程实现每个功能模块就是最终得到的软件系统。很显然,这种软件结构源于用户提出来的功能需求。根据最初提出的功能需求,经过分解设计,得到的软件结构是依赖于功能需求的。如果事后发现当初的需求定义或描述不正确、需要变更的话,这种变更足以摧毁按当初提出的需求而建立起的软件结构。这就是结构化方法的先天性缺陷。Shanghai Jiao Tong University如图7.1所示,需求的频繁变更会把一个管理信息系统开发项目推向死亡之旅。图7.1 结构化
6、方法的缺陷Shanghai Jiao Tong University除了上面提到的用结构化方法得到的软件结构在面对需求变更时显得束手无策的缺陷以外,另外一个先天性缺陷就是,按功能分解得到的模块是低内聚的和强耦合的,这恰恰是违背系统设计原则的。现实生活中,实现某个功能是由若干个参与者协作完成的,而结构化方法则相当于把这些参与者“肢解”了,把每个参与者所具备的具有强大生命力的能力分散到一个个模块中,拼成了一个“死”的结构。正因为如此,这样拼出来的结构是“死”的,这样拼出来的模块是“低内聚”的。Shanghai Jiao Tong University由于具有上述先天性的缺陷,结构化方法为了保证设计
7、与编码工作有效,就要求对管理信息系统的需求分析做到一步到位,完整、准确的需求定义是必须的,而且分析活动结束后,需求就不能再进行变更了。只要需求有变更,就意味着按当初理解的需求而进行的设计和编码都将是徒劳的。越是到开发的后期,这种需求的变更越是致命的。出于同样的原因,系统交付使用以后,对管理信息系统的维护也是困难的。面向对象的方法则是以对象为核心来构造软件框架的,在框架不需要变化的前提下,通过对象的协作和参与,就能够协作实现更多的系统功能。如果完成某项任务要求有特殊的对象能力,只需要增强对象的能力就可以实现。因此,这样的结构所具备的应对需求变更的能力是与生俱来的。每个对象封装起来的操作具有强内聚
8、性。Shanghai Jiao Tong University7.1.2 面向对象方法的优势20世纪80年代,面向对象的程序设计语言趋于成熟,作为一种新的程序设计模式,面向对象的程序设计模式逐渐被更多的人所理解和接受。面向对象的程序设计模式导致了软件开发的高效率、高质量和软件复用,这一成果促使研究者把一部分注意力转向更广、更深层次的研究。首先把面向对象的思想用于设计阶段,于是有了面向对象的设计,进一步又把面向对象的思想用于分析阶段,产生了面向对象的分析,因而在面向对象的系统开发方面不断取得进展时,一种新的管理信息系统开发方法面向对象的开发方法产生了,并逐渐成为了主流的开发方法。Shanghai
9、 Jiao Tong University与结构化方法对比,面向对象的方法显现出了绝对的优势,并且这种优势同样是先天性的。面向对象的思想尽可能按照人类认识世界的方法和思维方式来分析和解决问题。假设我们把现实系统中参与完成某项任务的多个“人”看做“对象”的话,按照面向对象的思想构造的管理信息系统中的软件结构与现实系统的结构是极其相似的。Shanghai Jiao Tong University现实系统中,少数不变的“人”之间,通过协作可以完成许多功能,即便是需要完成一种新的功能,也许只用原有的“人”相互协作就可以实现。如果不能实现,我们可以通过增强“人”的能力的办法或者再添加“人力”来完成。这种
10、修改只是对原有系统进行扩充,使软件结构演化为能满足新需求的结构,而原来由“人”组成的系统结构并没有受到冲击。Shanghai Jiao Tong University与此类似,如图7.2所示,用面向对象的思想构建的软件,则是由“对象”组成的结构。对象是有“责任”、有“特征”、有“行为能力”的实体,我们通过向对象赋于“行为能力”、通过对象之间的协作就能够实现用户的各种需求。如果需求有了变化,我们只需要改变对象之间的协作关系即可应对。软件设计的任务就是寻找能够担当重任的“对象”,你精心培育的“对象”会不辞辛劳地为你工作。如果用户有了新的功能需求,那你就再赐予你的对象以“新的能力”,再也不会担心自己
11、的设计和编码工作会变得徒劳了。Shanghai Jiao Tong University面向对象的软件结构具有天然的高内聚和低耦合特征。对象本身所具有的代码都是为了实现对象本身“行为能力”的必须,只有具备了这些“方法”或“操作”,对象才能不辱使命,参与到协作之中,担负起你交给它的责任,因此对象是高内聚的。对象封装了它自身应有的数据和增强“行为能力”而实现的算法,对象之间的协作都是通过方法调用和消息传递来实现的,因此对象之间的联系是低耦合的。高内聚与低耦合正是软件设计必须遵循的设计原则。Shanghai Jiao Tong University图7.2 面向对象方法的优势Shanghai Jia
12、o Tong University7.1.3 两种方法解决问题的思维模式比较下面我们进一步来讨论,从结构化到面向对象的转变过程中解决问题的思想模式发生了什么变化。我们先来考察日常生活中人们是如何做事的。假设你开了一个讲座,听讲座的人在结束后还要分别去听其他讲座,但他们不知道自己下面要听什么讲座和下一讲座分别在什么地点。领导交给你一项任务,在你的讲座结束后,确保大家知道下一讲座去哪里听。Shanghai Jiao Tong University按照结构化方法的思路,可以这样做:(1)获得听课人的名单。(2)对于名单上的每个人,都重复做以下工作:获知他(或她)要听什么讲座;找到他(或她)要听的下一
13、讲座的地点;找到从你的讲座地点到他(或她)要听的下一讲座的地点怎么走;告诉这个人怎样去下一个听讲座地点。Shanghai Jiao Tong University为了完成以上工作,你可能需要实现如下的功能模块:(1)获得听讲人的名单的方法;(2)获得每个人听讲座的安排表;(3)编一个告诉某个人如何从你开讲座的教室到其他教室的程序;(4)编写一个控制程序,它可以为每个人完成所需要服务的步骤。Shanghai Jiao Tong University最后得到的结构化的模块化程序结构可能如图7.3所示。你会遵循这种方法吗?如果有100个人,你需要重复做100遍;如果是1000个人,你需要重复做100
14、0遍;如果是10000个人呢?如果是让计算机去做,你可能就这么编程序了。如果是让你亲自去做呢,我很怀疑是否有人真的会按这样的方法去做。图图7.3 面向过程的方法解决问题的思路面向过程的方法解决问题的思路Shanghai Jiao Tong University相反,你可能会把从这个教室到其他教室的方向路线贴出来,然后告诉听你讲座的所有人:“我已经把你们要听的下一讲座的地点和教室的位置都贴在教室后面了。请根据它找到你们各自要听的下一讲座的教室。”可以预期每个人都知道自己下一讲要听的是什么讲座,而且他们都能从你提供的列表中查到正确的教室,然后按照指示找到它。如图7.4所示,这样程序结构简单多了,你
15、也轻松多了是不是?图7.4 面向对象的方法解决问题的思路Shanghai Jiao Tong University这两种方法之间的区别何在呢?第一种方法,分别给每个人都提供指示,你必须密切关注大量细节,除你之外没有其他人负责。这样你会疯掉的!这种方法的思维模式是,只关注要解决的问题是什么,把本该许多人协作完成的事情交织在一起,按照处理问题的逻辑过程来综合部署程序流程、划分模块。所有的事情都由一个超人(软件)来完成。这样一来,其他人都没有事情可做了,也没有责任了。而要把交织在一起的事情,事无巨细、统盘考虑处理得有条不紊,这个程序的结构就会设计得非常复杂。Shanghai Jiao Tong Un
16、iversity第二种方法中,你只给出通用的提示,然后期待每个人能自己承担起自己的责任,弄清怎样完成本该自己完成的任务。其中最大的区别就是这种“责任的转移”。在第一种情况下,你要对一切负责;在第二种情况下,学生对自己的行为负责。两种情况下,要实现的目标相同,但组织方式差异很大。其中的奥妙就在于:责任从你转移到了每个人。这种方法的思想模式是,关注要解决的问题可以归纳或划分为哪些责任,找到这些负有责任的人(在面向对象的分析中,找到或设置类或对象),研究他们在解决这一问题的过程中各自都应该负有什么责任(通过类和对象的交互场景,归纳每个对象应该负有的责任),然后通过消息传递,让他们各自承担起自己的责任
17、就行了。Shanghai Jiao Tong University第二种方案除了责任明确、解决问题简单以外,还具有能够应对需求变更的先天优势。为了看到这种责任重新安排带来的影响,我们考虑一下在有了新的需求变化时,情况会怎样。假设,你被告知需要给听讲的学生中的研究生一些特殊指示。他们可能需要在听完你的讲座之后,要给本讲座一个书面评价,并交到教务处。Shanghai Jiao Tong University在上面的第一种情况下,我们将不得不对控制程序进行结构修改,以区别研究生和本科生,然后给研究生特殊指示。而在每个人各司其责的第二种情况下,我们只需要从“学生”中再派生出一个“研究生”这样一个特殊的
18、对象,赋予它相应的责任就行了,而作为一个特殊对象的你,除了需要说“找到你们下一个听讲的教室”外,只需再多说一句话:“请研究生对讲座进行书面评价,并交到教务处”。每个人仍然只需按此指示行事即可,程序的结构无须改动,只是为你添加了责任和新创建了一个研究生对象。Shanghai Jiao Tong University这表示在控制程序的责任发生了明显变化时,在第一种情况下,每次需要增加一类新的学生时,控制程序本身必须做修改,要负责告诉新的一类学生如何去做;而在第二种情况下,新一类的学生不会影响控制程序,由学生自己负责弄清自己如何去做。显然,面向对象的思维模式接近现实生活,符合人的认识习惯,在就对需求
19、变更方面有着先天的优势。Shanghai Jiao Tong University7.1.4 学会用三个视角看问题在“听讲座的问题”中,为什么会有这种区别呢?这是因为第二种方法有三方面的特性:(1)人们对自己的行为负责,而不再由一个中央控制程序负责决定他们的行为。(2)控制程序可以与不同类型的人交流,本例中有研究生和普通学生,也许还有可能会有其他类型的学生。对控制程序来讲,这些学生没什么区别,只是学生自己知道自己是什么类型的学生。(3)控制程序不需要知道学生从此教室到下一教室可能需要采取的特殊步骤。学生自己有能力会找到去下一听讲教室的路线。Shanghai Jiao Tong Universi
20、ty为了完整理解上面第二种方法的本质,运用Martin Fowler在UML Distilled一书中描述的软件开发过程中的三个不同视角(perspective)是非常有效的,如图7.5所示。图7.5 软件开发过程中的视角Shanghai Jiao Tong University我们再来看看前面那个“听讲座”的例子。请注意,作为讲师的你,是在“概念层”上与人交流的。换句话说,你告诉学生的是“你要他们做什么”,而非“如何去做”。至于他们如何去下一个教室这不用担心,因为他们应该自己担负起这个责任,应该具有这样的行为能力。而赋予他们这样的行为能力,是在“实现层”讨论的问题。Shanghai Jiao
21、 Tong University在一个层次(概念层)上交流,而在另一个层次(实现层)上执行,这样请求者(作为讲师的你)就无须准确知道具体操作细节了。这一点的效力可能非常大:只要讨论问题的“概念”不变,请求者就与实现细节的变化隔离开了。这就是这种方法为什么能够应对需求变更的原因。举一个不是很恰当的例子,对一个国家来讲,“中央政策”和“地方执行政策的具体措施”是处在两个不同层面上的,国家“支持农村建设的政策”可以三十年不变,但各地执行国家政策的具体措施可以不同,根据地区不同、时期不同,都可以灵活变更。Shanghai Jiao Tong University7.2.1 什么是对象面向对象的范型以对
22、象概念为核心,焦点集中在对象上,在需求分析时寻找对象,在系统设计中构造对象,在编写代码时实现对象。图7.6 对象的概念7.2 回顾面向对象的范型Shanghai Jiao Tong University我们最早接触对象的概念是在学习面向对象编程的课程中,因此,一般提到对象时就会有如下的感性认识,如图7.6所示。Student是一个对象,它具有表示其特征的私有数据“姓名”、“学号”、“专业”、“班级”等,这些数据都表示了Student这个对象的某方面的特征,在编程语言环境中,我们称之为对象的“属性”。另外,对象还有一些“操作”或“方法”,如Student对象拥有的“注册”、“选课”、“查成绩”和
23、“评教”等操作。每一个操作都是用一段代码或函数实现的。每个操作又都有一个名称,可以通过操作名访问Student对象,以完成某项任务。Shanghai Jiao Tong University如果从“视角”来看,我们在学习编程时接受的“对象”概念是站在如何实现一个对象的层次上认识对象的。但这样的认识不适合在系统分析与设计中讨论问题,因为在分析与设计活动中,更多地会用到“概念”和“规约”视角来讨论问题。为了便于从更高层次上讨论问题,我们应该对“对象”概念有一个更加人性化的理解。准确地讲,对象是一个具有明确边界和唯一标识的、封装了行为和状态的实体。这样的实体在问题域中的表现和人很相似,为完成它所参与
24、的一项任务,它肩负着明确的责任。我们就是根据责任的划分找到它的。在系统分析与设计活动中,开发人员的任务就是要找出这样的对象,根据它所参与的协作场景,把它应担负的全部责任完整地归纳出来,然后,通过编程(实现)赋予它相应的操作,让它具有肩负起自己责任的行为能力。软件的功能就靠它和其他对象的协作来实现的。Shanghai Jiao Tong University使用对象的优点在于,可以定义自己负责自己的事物。对象天生就了解自己,对象中的数据能够告诉自己的状态如何,而对象中的代码能够使它正常工作。对象及其责任如表7.1所示。Shanghai Jiao Tong University在这种情况下,对象是
25、通过在问题域中寻找负有责任的实体而被发现的。然后,再查看这些实体还应该做什么,为每个对象明确责任。实现对象的最佳方式是将其看成“具有责任的东西”。有一条好的设计原则:对象应该自己负责自己,对象有明确的责任。还可以用Martin Fowler的视角框架来观察和理解对象:在概念层次上,对象是一组责任;在规约层次上,对象是一组可以被其他对象或对象自己调用的方法(也称接口)。在实现层次上,对象是代码和数据,以及它们之间的交互。需要再次强调的是,为了便于在分析和设计活动中、在更高层次讨论问题,我们对“对象”概念的理解不能只停留在实现层次上。Shanghai Jiao Tong University7.2
26、.2 对象的接口因为对象具有责任,而且自己负责自己,所以必须有办法告诉对象要做什么。还记得吗?对象含有说明自己状态的数据,还有实现必要功能的方法。对象的很多方法都可以被其他对象调用。这些方法的集合就称为对象的公开接口(Interface)。其他对象就是通过这个公开的接口,告诉对象要做什么的。Shanghai Jiao Tong University例如,在“听讲座”的例子中,可以为Student对象编写一个gotoNextClassroom()方法。可以直接用student.gotoNextClassroom()调用这个方法,这就是通过对象的接口调用。在调用过程中,不需要向这个方法传递任何参数
27、,因为每个Student对象都自己负责自己,即Student对象知道:(1)为了能够找到下一个教室,它需要什么;(2)怎样为完成这个任务获取所需的其他信息。Shanghai Jiao Tong University7.2.3 围绕类组织对象刚开始只有一个学生(普通学生)需要从一个教室到另一个教室去。请注意,在我们的教室中可能有很多这样的“普通学生”。当然可以每个学生都有一个对象对应,从而能够容易地和分别地跟踪每个学生的状态。但是,要求每个Student对象都有自己的一组方法,告诉他能做什么和怎么做,显然效率太低了,尤其是在对所有学生都是一样的情况。聪明的人是不会那样做的。一种效率更高的办法是,
28、让所有学生与一组方法关联起来,每个学生都可以根据自己的需要使用或修改这些方法。我们希望定义一个“一般学生”来包含这些公共方法的定义。然后,可以有各种各样的特殊的学生,每个特殊的学生都必须掌握自己的私有的信息。Shanghai Jiao Tong University在面向对象的术语中,这种“一般学生”被称为类(Class)。类就是对对象的定义,或者理解为类是对象的模子,它包括以下内容的完整描述。(1)对象所包含的数据元素。(2)对象能够操作的方法。(3)访问这些数据元素和方法的方式。Shanghai Jiao Tong University因为对象所包含的数据元素可以不同,所以同一类型的对象可
29、以含有不同数据,但它们都具有相同的功能。需要一个对象时,系统就会根据“模子”生成某个类型(type,也就是对象所属的类)的一个新对象,这个新对象就是类的一个实例(Instance)。创建类实例的过程称为类实例化(Instantiation)。Shanghai Jiao Tong University使用面向对象方法为“听讲座”的例子编程比以前的方法简单多了,步骤如下所示:(1)开始控制程序。(2)实例化教室中学生的集合。(3)告诉此集合,让学生自己去下一个听讲座的教室。(4)集合让每个学生自己去下一个该去的教室。(5)每个学生都:找到自己下面该去的教室在哪儿;决定怎么走;走过去;(6)完成。S
30、hanghai Jiao Tong University在需要引入另一个学生类型时,如要增加一个研究生类型的学生,这一方式还能很好地工作。这种情况下,看看如何解决?有点小麻烦了,看来我们必须允许任何类型的学生加入到这个集合,原来只有普通学生,现在又来了一个研究生,也许将来还会有其他学生种类。我们面临的问题是,怎样让集合包容其他元素呢?因为我们是在讨论如何用代码实现,这时集合实际上将是包含某个类型对象的数组或其他容器。如果集合是使用了名为regularStudent(普通学生)的类,我们就不能将graduateStudent(研究生)类型的对象放入集合了。Shanghai Jiao Tong U
31、niversity解决方案直截了当。我们需要能包容多种具体类型的一般类型。在本例中,我们需要一个包含regularStudent对象和graduateStudent对象的student类型。在面向对象的术语中,我们称Student类为抽象类(abstract class)。Shanghai Jiao Tong University本例中,student就是抽象类。具体类regularStudent和graduateStudent则代表了两种特殊类型的student。regularStudent是一种Student,graduateStudent也是一种Student。编程实现时,可以赋于stu
32、dent一些公性的属性和方法,再从student特化出regulaStudent和graduateStudent,让他们继承student所共有的东西,然后再添加少量自己特有的东西就可以了。Shanghai Jiao Tong UniversityregularStudent和graduateStudent都是一种student,这种关系叫做is-a(是一个/种)的关系,是我们称之为继承(inheritance)关系。在这种继承层次中,从下往上看,我们说regularStudent类继承自student类。其他类似的说法还有:graduateStudent派生自student类;graduat
33、eStudent特化(specialize)了student类;或者说student是父类,graduateStudent和regularStudent是student的子类。同样的继承关系,从上往下看,我们称student类是graduateStudent和regularStudent的基类,student类乏化(generalize)了二者,或者student类是graduateStudent类和regularStudent的超类(superclass)。Shanghai Jiao Tong University7.2.4 关于抽象类可以使用父类来统一定义子类必须实现的方法,子类在继承了父
34、类共有的东西以后,还可以定义自己特有的东西。子类是使用抽象类的默认行为还是使用自己的特有行为,由子类自己决定,这与“对象自己负责自己”的要求是一致的。这就意味着,我们可以在控制程序中编写一些对象,它们的引用类型都是student。编译器能够检查student引用所指向的是否真的是一种student。这种机制使我们能够实现鱼和熊掌兼得受益,同时获得了三方面的优点:Shanghai Jiao Tong University(1)集合只需处理student对象(从而使Instructor对象也只需要处理student对象);(2)但是类型检查仍然存在(只有能够“去下一讲座教室”的student对象会
35、包含进来);(3)而且每一种student都可以按自己的方式实现功能。在概念层次,抽象类(父类)为我们提供了一种方法,它使我们能够给一组相关的类赋于一个名字,这使我们能够将这一组相关类看成一个概念。在面向对象范型中,必须总是从概念、规约和实现所有三个视角层次思考问题。Shanghai Jiao Tong University7.2.5 类的可见性与接口因为对象都自己负责自己,所以有很多东西不需要暴露给其他对象。前面我们曾提到公开接口是可以被其他对象访问的方法的概念。在面向对象系统中,可访问性主要分为以下几种类型:公开(public)任何对象都能够看见;保护(protected)只有这个类及其派
36、生类的对象能够看见;私有(private)只有这个类的对象能够看见。Shanghai Jiao Tong University7.2.6 封装与多态类的可见性与封装(Encapsulation)的概念相关。封装经常被简单地描述成“数据隐藏”。一般而言,对象不应该将内部数据成员暴露给外界,也就是说其可见性是protected或private。但不能把封装简单地理解为数据隐藏,封装一般意味着各种隐藏。在本例中,讲师不知道哪些是普通学生,哪些是研究生。所以学生的类型对讲师隐藏了。也就是说,我们封装了学生的类型。在面向对象语言中,抽象类student将隐藏从其派生的类的类型。Shanghai Jiao
37、 Tong University封装产生了一种多态(Polymorphism)的效果。在面向对象的语言中,我们经常用抽象类类型的引用来引用对象。但是,我们真正引用的是从抽象类派生的类的具体实例。因此,当我们通过抽象引用概念性地要求对象做什么时,将得到不同的行为,具体行为取决于派生对象的具体类型。“多态”这个词来源于“poly”(意为“很多”)和“morph”(意为“形态”)。因此,这里的意思是“很多形态”。这个名称非常合适,因为同一个调用能够获得很多不同形态的行为。在本例中,讲师告诉学生“去下一个听讲座的教室”,但是根据学生类型的不同,他们会采取不同的行为,这就是多态的具体形式。Shangha
38、i Jiao Tong University7.3 面向对象的重要方法7.3.1 抽象 7.3.2 封装7.3.3 层次Shanghai Jiao Tong University7.3.1 抽象 抽象(Abstraction)的结果反映出事物的重要的本质和显著的特征,言外之意是忽略那些次要的、非本质的和分散注意力的特征。抽象的过程强调被抽象事物的重要共性,而忽略不重要的差异。在面向对象方法中,抽象活动主要抽取事物的结构特征和行为特征,两方面特征是有机的整体。关于抽象的方法的特点和意义,可以从以下几方面加以理解。(1)抽象的结果有赖于特定的领域,即被抽象者所处的上下文环境,具有客观针对性。同样一
39、个事物,处在不同的环境中其发挥的作用可以大为不同,或者说它可能会有不同的职责或表现。Shanghai Jiao Tong University(2)抽象的结果有赖于特定的视角,即做出抽象动作的主体,具有主观针对性。假设你去餐馆用餐。对你而言,一道菜可以抽象为色、香、味和售价;对于厨师而言,抽象的结果除了色、香、味之外可能还要包括配料、工艺流程;对于餐馆的老板而言,抽象的结果可能是成本和售价;对于跑堂的服务员而言,抽象的结果可能就是点这道菜的客人、桌位等等,不同的人会从不同的角度得到抽象的结果。由于抽象具有客观的和主观的针对性,所以即便是讨论同一个被抽象的事物,针对不同的抽象者和上下文环境,抽象
40、的结果也有可能不同。Shanghai Jiao Tong University(3)抽象是我们在认识复杂现象的本质的过程中最强有力的思维工具。抽象对认知求解过程的最大贡献,在于帮助我们获取问题和方案的相同的本质。这样使得我们能够更好地管理复杂的系统。只有经过抽象,才能在一个特定的上下文环境之中将注意力集中于事物最本质的部分,或者说是一个事物能和其他事物区别开的部分。Shanghai Jiao Tong University(4)抽象活动所得结果的质量,直接影响问题求解过程中参与者之间的沟通效率。根据面向对象的基本思想,对问题领域中关键事物的抽象会相对稳定地延续到求解领域中。如果在问题领域得到的
41、关键抽象中,有很多无关的细枝末节,意味着在解决方案中将会出现大量没用的代码,它们有可能分散问题求解过程中所有参与者的注意力,并造成沟通的负担甚至是障碍。比如,你要开发一个用户使用的订菜系统,就没必要将“工艺流程”作为“菜”的特征加以抽象。Shanghai Jiao Tong University在概念上,面向对象的方法最核心的抽象内容是对象(Object)。准确地讲,对象是一个具有明确边界和唯一标识的、封装了行为和状态的实体。这里的实体是广义的概念,可以是代表一个具有物理意义的实体,也可以是一个纯粹软件意义上的实体,甚至可以是一个概念上的实体(如两个实体之间的某种关联关系)。类(Class)是
42、对具有相同属性、操作、关系和其他语义特征的一组对象的静态描述。笼统地讲,在面向对象的分析和设计中,抽象的结果表现为对各种系统构成要素的可视化描述。Shanghai Jiao Tong University7.3.2 封装封装将对象特征的实现方式(包括相关的设计决定)隐藏在一个公共接口之后的黑盒之中。封装概念的关键点在于被封装对象的消息接口,所有与该对象进行的沟通都要通过响应消息的操作来完成。除了对象本身,其他任何对象都没有可能改变它的属性。封装在很多时候也被称做“信息隐藏”,信息有两个层面的含义,一方面,是接口中操作的具体实施方法,另一方面是对象内部的状态信息。对于和某对象沟通的其他对象而言,
43、只需了解它的消息接口,即可顺利地与该对象进行沟通。Shanghai Jiao Tong University封装带给软件设计的直接好处,是得到了尽可能低的耦合。汽车的刹车脚踏板是一个很好的封装例子。如果将汽车的刹车系统看做一个对象,对于使用刹车系统的驾驶员而言,只要知道刹车脚踏板踩下去之后汽车就会减速,就等于会使用刹车系统了,没有必要了解刹车系统是如何工作的,以及刹车系统内部的状态。驾驶员使用任何一辆汽车的刹车系统都是一样的,即便它们的内部结构可能大不相同;反过来,即便汽车的刹车系统内部采用了新技术,也无须去调整驾驶员使用刹车系统的方法。换言之,汽车生产厂商制造刹车系统的工作,和驾驶学校训练驾
44、驶员使用刹车系统的内容是互不影响的。有了“脚踏板”这个接口,就可以使这两项工作很好地解耦。原因是双方都有一个共识“刹车脚踏板踩下去之后汽车就会减速”,这即是逻辑上的接口的概念。Shanghai Jiao Tong University封装起到两个方面的作用,一方面,对象内部的状态被保护起来,不会被与该对象沟通的对象直接篡改;另一方面,对象内部特征的变化不会改变与其他对象的沟通方式,即封装为面向对象系统带来一种叫做“多态”(Polymorphism)的能力,即呈现在一个接口后面的多种实施形态,不会影响接口的使用方式。Shanghai Jiao Tong University封装使得系统具有更明显
45、的高内聚、低耦合特征,进而使整个系统的构架变得更加具有延展性。封装对认知求解过程的最大贡献在于帮助我们控制变化的影响范围,从而更好地管理复杂系统:对于一个局部进行良好封装的系统而言,需求的变化系统中的影响将只可能在一个较小的范围内传播,而不至于产生严重的连锁反应。概念上,接口是封装原则的准确描述手段。接口用于声明类或者构件能够提供的服务。所谓服务就是响应消息的能力。该定义中的类是广义的,既可以是一个简单的类,也可以是一个子系统。所谓的子系统是一组要素的集合,其中一部分要素提供由另一部分要素声明要做的事情。笼统地讲,在面向对象的分析与设计中,封装往往表现为多种要素的可见度。Shanghai Ji
46、ao Tong University7.3.3 层次层次(Hierarchy)的基本含义是不同级别的抽象组成一个树形的结构。层次的种类是多种多样的,可以是集合的层次、类属的层次、包含的层次、继承的层次、分区的层次、专业化的层次等等。简单地讲,层次就是一个描述分类的结构。层次的典型例子是生物中的门、纲、属、种、科等。注意,层次化的思维活动建立在抽象思维活动的基础之上。在某种意义上,不同的层次反映了抽象主体关注被抽象客体的概括程度。Shanghai Jiao Tong University举一个通俗的例子,我们在上班之前对天气的了解通常仅限于下雨或者不下雨,我们只关注要不要带一把雨伞;对于水利部门
47、的人士而言,为了预防洪涝灾害,则需要了解究竟是大雨、中雨还是小雨或者是没雨。层次的本质目的是表述并使用事物之间的相似性,同时事物之间的区别可以显著暴露。这带来了两个方面的益处,一方面,对同层次事物之间所具有的相同特征,没有必要在这个层次内分别(重复)描述,可以将这部分内容放到更高一个层次中去描述;另一方面,主体理解客体的概括程度是可选择的,主体可以根据实际的需要决定采用较高层次的描述或者是较低层次的描述来认识客体。Shanghai Jiao Tong University不同层次之间的描述不存在重复和冗余,而是自上而下的重复使用。在得到必要的技术支撑之后,层次概念带来的直接价值是提升事物特征描
48、述的可复用能力。Shanghai Jiao Tong University7.4 面向对象的术语及其关系Shanghai Jiao Tong University 所谓“面向对象”是一种认识客观世界的世界观,从结构组织角度模拟客观世界的一种方法,人们在认识和理解现实世界的过程中,普遍运用以下三个构造法则:(1)区分对象及其属性,如区分车和车的大小;(2)区分整体对象及其组成部分,如区分车和车轮;(3)不同对象类的形成及区分,如所有车的类和所有船的类。因而,客观世界可以看成由许多不同种类的对象构成,每个对象都有自己的内部状态和运动规律,不同对象间的相互联系和相互作用构成了完整的客观世界。面向对象
49、的基本概念及特征Shanghai Jiao Tong University 1、对象:是一种对客观事物的抽象,它由状态(属性)和行为(方法)组成。下面,我们就使用一个图,来帮助大家认识对象。正如图1所示,我们使用一个大圆来表示一个对象,中间的一个小圆圈定义了这个对象的各种状态信息,外面则是各种各样的行为,通过执行这个对象的行为,就会改变这个对象的状态。面向对象的基本概念 Shanghai Jiao Tong University 图1 木头对象示意图 面向对象的基本概念及特征Shanghai Jiao Tong University 2、类:是对象的集合也就是由所有相似对象的状态变量(属性变量
50、)与行为(方法)所构成的模板或原型。我们首先定义了“笔店”这个类,它拥有4个属性:1)铅笔;2)钢笔;3)圆珠笔;4)其它笔 同时还定义了三个行为:1)卖出:将属性的值减少,表示卖出;2)进货:将属性的值增加,表示进货;3)盘点:打印出属性的值;面向对象的基本概念及特征Shanghai Jiao Tong University3、消息传递 在前面,我们说到在面向对象的世界中,一切变化都是对象自身、或对象间的协调而产生的。那么它们是如何进行协商的呢?在面向对象的程序设计中,我们采用一种叫消息传递(Message Passing)的机制来实现。消息从一个对象发到另一个对象,使另一个对象完成某一个行