资源预览内容
第1页 / 共93页
第2页 / 共93页
第3页 / 共93页
第4页 / 共93页
第5页 / 共93页
第6页 / 共93页
第7页 / 共93页
第8页 / 共93页
第9页 / 共93页
第10页 / 共93页
亲,该文档总共93页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第9章 面向对象方法学引论,9.1 面向对象方法学概述 9.2 面向对象的概念 9.3 面向对象建模 9.4 对象模型 9.5 动态模型 9.6 功能模型 9.7 3种模型之间的关系 9.8 小结,9.1 面向对象方法学概述,在20世纪60年代后期出现的面向对象编程语言。 自20世纪80年代中期起,逐步形成了面向对象方法学。 20世纪90年代,面向对象方法学已经成为人们在开发软件时首选的范型。,面向对象方法学的出发点和基本原则,是尽可能模拟人类习惯的思维方式。 客观世界的问题都是由客观世界中的实体及实体相互间的关系构成的。 客观世界中的实体抽象为问题域的对象(object)。 对象是不固定的。一个雇员可以作为一个对象,一家公司也可以作为一个对象,9.1.1 面向对象方法学的要点,9.1.1 面向对象方法学的要点,面向对象方法具有下述4个要点: (1) 认为客观世界是由各种对象组成的,任何事物都是对象,复杂事物是由多个简单事物复合而成。 (2) 把所有对象都划分成各种对象类,每个对象类都定义了一组数据和一组方法。数据用于表示其静态属性,是其状态信息。方法是允许施加于该类对象上的操作,是该类所有对象共享的,并不需要为每个对象都复制操作的代码。,9.1.1 面向对象方法学的要点,(3) 按照子类(派生类)与父类(基类)的关系,把若干个对象类组成一个层次结构的系统(类等级)。下层的派生类具有和上层的基类相同的特性,即继承(inheritance)。但是,如果在派生类中对某些特性又做了重新描述,则在派生类中的这些特性将以新描述为准,低层的特性将屏蔽高层的同名特性(如C+中的纯虚函数)。,9.1.1 面向对象方法学的要点,(4) 对象彼此之间仅能通过传递消息互相联系。对象必须发消息请求它执行它的某个操作,处理它的私有数据,而不能从外界直接对它的私有数据进行操作。对象就像一个不透明的黑盒子,在外界是看不见的,更不能直接使用,这就是“封装性”。,9.1.1 面向对象方法学的要点,面向对象的方法学用下列方程来概括: OO=objects+classes+inheritance+communication with messages 面向对象就是既使用对象又使用类和继承等机制,而且对象之间仅能通过传递消息实现彼此通信。,9.1.1 面向对象方法学的要点,仅使用对象和消息,则这种方法称为基于对象的(object-based)方法,而不是面向对象方法; 进一步要求把所有对象都划分为类,则这种方法可称为基于类的(class-based)方法,但仍然不是面向对象的方法。只有同时使用对象、类、继承和消息的方法,才是真正面向对象的方法。,9.1.2 面向对象方法学的优点,1. 与人类习惯的思维方法一致 传统的面向过程的设计方法以算法为核心,把数据和过程作为相互独立的部分。 2. 稳定性好 传统的软件系统的结构紧密依赖于系统所要完成的功能,当功能需求发生变化时将引起软件结构的整体修改。 事实上,用户需求变化大部分是针对功能的,因此,这样的软件系统是不稳定的。,9.1.2 面向对象方法学的优点,3. 可重用性好 用已有的零部件装配新的产品,是典型的重用技术。 有两种方法可以重复使用一个对象类:一种方法是创建该类的实例,从而直接使用它;另一种方法是从它派生出一个满足当前需要的新类。 继承性机制使得子类不仅可以重用其父类的信息,而且可以在父类代码的基础上方便地修改和扩充。,9.1.2 面向对象方法学的优点,4. 较易开发大型软件产品 用面向对象方法学开发软件时,构成软件系统的每个对象就像一个微型程序,有自己的数据、操作、功能和用途。 一个大型软件产品可分解成一系列本质上相互独立的小产品来处理,这就不仅降低了开发的技术难度,而且也使得对开发工作的管理变得容易多了。,9.1.2 面向对象方法学的优点,5. 可维护性好 (1) 面向对象的软件稳定性比较好 当对软件的功能或性能的要求发生变化时,通常不会引起软件的整体变化,往往只需对局部作一些修改。 (2) 面向对象的软件比较容易修改 类是理想的模块机制,它独立性好,修改一个类通常很少会牵扯到其他类。,举个例子,继承和多态,9.1.2 面向对象方法学的优点,(3) 面向对象的软件比较容易理解 维护软件的时候,首先需要深入理解软件。 面向对象的软件技术符合人们习惯的思维方式。,类的引用,9.1.2 面向对象方法学的优点,(4) 易于测试和调试 如果测试过程中发现了错误,还必须通过调试改正过来。 对面向对象的软件进行维护,主要通过从已有类派生出一些新类来实现。 对类的测试通常比较容易实现,如果发现错误也往往集中在类的内部,比较容易调试。,9.1.3 喷泉模型,迭代是软件开发过程中普遍存在的一种内在属性。经验表明,软件过程各个阶段之间的迭代或一个阶段内各个工作步骤之间的迭代。 右图是面向对象软件设计中常用的“喷泉模型”,9.2 面向对象的概念 9.2.1 对象,应用领域中有意义的、与所要解决的问题有关系的任何事物都可以作为对象,它既可以是具体的物理实体的抽象,也可以是人为的概念,或者是任何有明确边界和意义的东西。 对象是对问题域中某个实体的抽象,设立某个对象就反映了软件系统具有保存有关它的信息并且与它进行交互的能力。,9.2.1 对象,1. 对象的形象表示 为有助于读者理解对象的概念,图9.2形象地描绘了具有3个操作的对象。,9.2.1 对象,2. 对象的定义 人们从不同角度给出对象的不同定义。这些定义虽然形式不同,但基本含义是相同的。 (1) 定义1: 对象是具有相同状态的一组操作的集合。 (2) 定义2: 对象是对问题域中某个东西的抽象,这种抽象反映了系统保存有关这个东西的信息或与它交互的能力。也就是说,对象是对属性值和操作的封装。 (3) 定义3: 对象=ID,MS,DS,MI。ID是对象的标识或名字,MS是对象中的操作集合,DS是对象的数据结构,MI是对象受理的消息名集合。,9.2.1 对象,3. 对象的特点 (1) 以数据为中心。操作围绕对其数据所需要做的处理来设置,操作的结果往往与当时所处的状态(数据的值)有关。 (2) 对象是主动的。它是进行处理的主体。为了完成某个操作,不能从外部直接加工它的私有数据,而是必须通过它的公有接口向对象发消息,请求它执行它的某个操作,处理它的私有数据。,9.2.1 对象,(3) 实现了数据封装。为了使用对象内部的私有数据,只需知道数据的取值范围和对该数据施加的操作。因此,一个对象类型也可以看作是一种抽象数据类型。,(4) 本质上具有并行性。对象是描述其内部状态的数据及可以对这些数据施加的全部操作的集合。不同对象各自独立地处理自身的数据,彼此通过发消息传递信息完成通信。,9.2.1 对象,(5) 模块独立性好。对象是面向对象的软件的基本模块,为了充分发挥模块化简化开发工作的优点,希望模块的独立性强。具体来说,也就是要求模块的内聚性强,耦合性弱。,面向对象方法可以满足,9.2.2 其他重要概念,1. 类(class) 现实世界中的客观事物有些是彼此相似的,例如,张三、李四、王五虽说每个人职业、性格、爱好、特长等各有不同,但是,他们的基本特征是相似的,都是黄皮肤、黑头发、黑眼睛,于是人们把他们统称为“中国人”。类是对具有相同属性和行为的一个或多个对象的描述。,9.2.2 其他概念,2. 实例(instance) 实例就是由某个特定的类所描述的一个具体的对象。类是对具有相同属性和行为的一组相似的对象的抽象。 类在现实世界中并不能真正存在。 类可以理解为“样板”,按照这个样板可以建立一个个具体的实例。,9.2.2 其他概念,3. 消息(message) 消息就是要求某个对象执行在定义它的那个类中的某个操作的规格说明。通常,一个消息由下述3部分组成: 接收消息的对象; 消息选择符(也称为消息名); 零个或多个变元。,9.2.2 其他概念,4. 方法(method)方法就是对象所能执行的操作,也就是类中所定义的服务。方法描述了对象执行操作的算法,响应消息的方法。,9.2.2 其他概念,5. 属性(attribute) 属性就是类中所定义的数据,它是对客观世界实体所具有的性质的抽象。 6. 封装(encapsulation) 所谓封装就是把某个事物“包”起来,使外界不知道该事物的具体内容。,9.2.2 其他概念,对象具有封装性的条件如下: (1) 有一个清晰的边界。所有私有数据和实现操作的代码都被封装在这个边界内。 (2) 有确定的接口。这些接口就是对象可以接受的消息。 (3) 受保护的内部实现。实现对象功能的细节不能在定义该对象的类的范围外访问。 (4)封装也就是信息隐藏,通过封装对外界隐藏了对象的实现细节。,9.2.2 其他概念,7. 继承(inheritance) 继承是指能够直接获得已有的性质和特征,而不必重复定义它们。在面向对象的软件技术中,继承是子类自动地共享父类中定义的数据和方法的机制。,人的例子,9.2.2 其他概念,9.2.2 其他概念,当一个类只允许有一个父类时,类的继承是单继承; 当允许一个类有多个父类时,类的继承是多重继承。 低层的性质将屏蔽高层的同名性质。,9.2.2 其他概念,8. 多态性(polymorphism) 多态性的意思是“有许多形态”。 多态性是指子类对象可以像父类对象那样使用,同样的消息既可以发送给父类对象也可以发送给子类对象。 在类等级的不同层次中可以共享一个行为的名字,然而不同层次中的每个类却各自按自己的需要来实现这个行为。 当对象接收到发送给它的消息时,根据该对象所属于的类动态选用在该类中定义的实现算法。,9.2.2 其他概念,9. 重载(overloading) 函数重载是指在同一作用域内的若干个参数特征不同的函数可以使用相同的函数名字; 运算符重载是指同一个运算符可以施加于不同类型的操作数上面。,9.3 面向对象建模,所谓模型,就是为了理解事物而对事物作出的一种抽象,它是对事物的一种无歧义的书面描述。 模型由一组图示符号和组织这些符号的规则组成。 模型也是一种思考工具,利用这种工具可以把知识规范地表示出来。 面向对象建模主要讨论对象模型、动态模型和功能模型。,9.4 对象模型,对象模型表示静态的、结构化的 “数据”性质。它是对模拟客观世界实体的对象以及对象彼此间的关系的映射,描述了系统的静态结构。 为了建立对象模型,需要定义一组图形符号,并且规定一组组织这些符号以表示特定语义的规则。 需要用适当的建模语言来表达模型,建模语言由记号和使用记号的规则组成。,9.4.1 类图的基本符号,类图描述类及类与类之间的静态关系。类图是一种静态模型,它是创建其他UML图的基础。 1. 定义类 UML中类的图形符号为长方形,用两条横线把长方形分成上、中、下3个区域(下面两个区域可选),3个区域分别放类的名字、属性和服务,如下图所示。,Unified model Language,9.4.1 类图的基本符号,类名是一类对象的名字。为类命名时应该遵守的几条准则: (1) 使用标准术语。应该使用在应用领域中人们习惯的标准术语作为类名,不要随意创造名字。例如,“交通信号灯”比“信号单元”这个名字好,“传送带”比“零件传送设备”好。 (2) 使用具有确切含义的名词。尽量使用能表示类的含义的日常用语作名字,不要使用空洞的或含义模糊的词作名字。例如,“库房”比“房屋”或“存物场所”更确切。,9.4.1 类图的基本符号,(3) 必要时用名词短语作名字。为使名字的含义更准确,必要时用形容词加名词或其他形式的名词短语作名字。例如,“最小的领土单元”、“储藏室”、“公司员工”等都是比较恰当的名字。 (4) 名字要准确而简要。,9.4.1 类图的基本符号,2. 定义属性 UML描述属性的语法格式如下: 可见性 属性名: 类型名=初值性质串 属性的可见性有3种: 公有的(public) (+) 私有的(private) (-) 保护的(protected) (#) 如果未声明可见性,则该属性的可见性尚未定义。注意,没有默认的可见性。类型名表示该属性的数据类型,它可以是基本数据类型,也可以是用户自定义的类型。,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号