1、第6章 面向对象方法学引论,本章主要内容:面向对象方法学的优缺点;面向对象的基本概念:对象、类、实例、消息、方法、封装、继承、多态性、重载等;面向对象的软件工程:OOA、OOD、OOP、OOT;面向对象的建模及对象模型、动态模型、功能模型;面向对象的开发方法。 本章重点:面向对象的基本概念:对象、类、实例、消息、方法、封装、继承、多态性、重载等;面向对象的软件工程:OOA、OOD、OOP、OOT;面向对象的建模及对象模型、动态模型、功能模型;面向对象的开发方法。 本章难点:面向对象的概念及特征和面向对象的模型 。,第6章 面向对象方法学引论,本章结构: 6.1 面向对象方法学概述 6.2 面向
2、对象的基本概念 6.3 面向对象的基本特征 6.4 面向对象的软件工程 6.5 面向对象的建模 6.6 面向对象的开发方法,6.1 面向对象方法学概述,6.1.1面向对象方法的发展历程 6.1.2 面向对象方法学优点 优点:(1)与人类习惯的思维方法一致 (2)稳定性好 (3)可重用性好 (4)可扩展性 (5)可维护性,6.1 面向对象方法学概述,不足之处: (1)面向对象需要更关注于需求、分析和设计 (2)面向对象需要完全改变每个人的思想 (3)面向对象需要改变软件开发文化 (4)面向对象不仅仅是编程 (5)面向对象许多优点是长期的 (6)面向对象要求先在培训、教育和工具上投资 (7)面向对
3、象技术不能保证能构造出正确的系统 (8)面向对象要求更多的测试工作 (9)面向对象仅是解决方案的一部分,6.2 面向对象的基本概念,6.2.1 对象(object) 对象是指一个实体,它能够保存一个状态(或称信息或数据),并且它能提供一系列操作(或称行为),这些操作或能检查或能影响对象的状态。 对象具有封装性(encapsulation) 对象具有自治性(autonomy) 对象具有通信性。 对象具有被动性。 对象具有暂存性。 对象可具有持久性(persistence),6.2 面向对象的基本概念,6.2.2 类(class)和实例(instance) 1.类(class) 类的定义是具有相同
4、属性和服务的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分。一个类的上层可以有超类,下层可以有子类,形成一种层次结构。 类分为一般类和特殊类 类的作用有两个:一是作为对象的描述机制,刻画一组对象的公共属性和行为;二是作为程序的基本单位,它是支持模块化设计的设施,并且类上的分类关系是模块划分的规范标准。 2.类和型的区别 型(type)的说明是指概念上、逻辑上的问题。数据的值都有型。 3. 类的实例(instance),6.2 面向对象的基本概念,6.2.2 类(class)和实例(instance) 在面向对象的系统中,每个对象都属于一个类,属于某
5、个类的对象称为该类的一个实例(instance) 。 在面向对象的程序设计语言中,类的实例既可静态地产生也可动态地产生。 6.2.3 消息(message)和方法(method) 1. 消息(message) 消息的定义:消息就是向对象发出的服务请求, 它应含有提供服务的对象标识、服务标识、 输入信息和回答信息。 2. 方法(method) 方法也称作行为(behavior),指定义于 某一特定类上的操作与法则。,人类原始语言-面向对象语言,6.3 面向对象的基本特征,面向对象的各种特征: 6.3.1 继承性(inheritance)继承是一种使用户得以在一个类的基础上建立新的类的技术。 新的
6、类自动继承旧类的属性和行为特征,并可具备某些附加的特征或某些限制。 继承性是面向对象程序设计语言不同于其它语言的最主要特点,是其它语言所没有的。 已存在的类通常称作超类,新的类通常称作子类。 类间的继承关系是可以传递的 。 继承可分为单继承和多继承,如果一个类只有一个直接超类,则这种继承叫做单继承,如果一个类有多于一个的直接超类,这种继承叫做多继承。,6.3 面向对象的基本特征,面向对象的各种特征: 6.3.2 封装性(encapsulation) 封装是面向对象方法的一个重要原则,它有两个含义: 第一个含义是,把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位(即对象)。第二个
7、含义也称作信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界,只保留有限的对外接口使之与外部发生联系。 封装的定义为: (1)一个清楚的边界,所有的对象的内部软件的范围被限定在这个边界内。 (2)一个接口,这个接口描述这个对象和其他的对象之间相互的作用。 (3)受保护的内部实现,这个实现给出了由软件对象提供的功能的细节,这些只能通过定义这个对象的类所提供的方法进行访问。,6.3 面向对象的基本特征,面向对象的各种特征: 6.3.3 多态性(polymorphism)和重载(overloading) 在收到消息时对象要予以响应,不同的对象收到同一消息可以产生完全不同的结果,这一现象叫做多态。
8、 多态主要有如下内容: (1)运算符重载: 同一运算符可用于不同的变量类型,称作运算符重载。 (2)即席多态(ad hoc polymorphism):即席多态也称操作名重载。同一操作名可作用于不同对象上并产生不同的结果。 (3)类属软件(generic software)的重用:类的继承与多态密切相关,作用于超类实例的方法同样也可以作用于其子类的实例。,6.4 面向对象的软件工程,传统的软件工程方法学曾经给软件产业带来过巨大的进步,缓解了软件危机,使用这种方法学开发的许多中、小规模的软件项目都获得了一定的成功。但人们也发现当把这种方法学应用于大型软件产品的开发时,似乎很少能取得成功。在传统的
9、软件工程方法中,由于软件工程各阶段表示方法不连续等原因,并没有完全填平语言之间的鸿沟,如图6.3所示。而在面向对象的软件工程方法中,从面向对象的分析到面向对象的设计,再到面向对象的编程、面向对象的测试都是紧密衔接的,从而填平了语言之间的鸿沟,如图6.4所示。,面向对象软件开发的十大原则,问题域,面向对象 分析面向对象 设计面向对象 编程面向对象 测试,计算机,图6.4 面向对象的软件工程方法,6.4 面向对象的软件工程,1面向对象的分析(OOA) OOA强调直接针对问题域中客观存在的各种事物建立OOA模型中的对象。用对象的属性和服务分别描述事物的静态特征和行为。 2面向对象的设计(OOD) O
10、OD则是针对系统的一个具体的实现运用面向对象的方法。其中包括两方面的工作,一是把OOA模型直接搬到OOD(不经过转换,仅作某些必要的修改和调整),作为OOD的一个部分;二是针对具体实现中的人机界面、数据存储、任务管理等因素补充一些与实现有关的部分。 3面向对象的编程(OOP) 面向对象的编程(OOP)又称作面向对象的实现(OOI)。 OOP工作就是用一种面向对象的编程语言把OOD模型的每个成分书写出来。,6.4 面向对象的软件工程,4面向对象的测试(OOT) 面向对象的测试(OOT)是指:对于用面向对象的技术开发的软件,在测试过程中继续运用面向对象的技术,进行以对象概念为中心的软件测试。 5面
11、向对象的软件维护 面向对象的软件工程方法为改进软件维护提供了有效的途径。 程序与问题域一致,各个阶段的表示一致,从而大大降低了理解的难度。 系统中最容易变化的因素(功能)作为对象的服务封装在对象内部,对象的封装性使一个对象的修改对其他影响小,从而避免了波动效应。,6.5 面向对象的建模,6.5.1 面向对象的建模概述 所谓模型,就是为了理解事物而对事物做出的一种抽象,是对事物的一种无歧义的书面描述。 面向对象方法基本的原则,是按照人们习惯的思维方式,用面向对象观点建立问题域的模型,开发出尽可能自然地表现求解方法的软件。 用面向对象方法开发软件,通常需要建立三种形式的模型 :对象模型 、动态模型
12、 、功能模型 6.5.2 对象模型 对象模型表示静态的、结构化的系统的“数据”性质。它是对模拟客观世界实体的对象以及对象征此间的关系的映射,描述了系统的静态结构。 为了建立对象模型,需要定义一组图形符号,并且规定一组组织这些符号以表示特定语义的规则。,6.5 面向对象的建模,6.5.3 动态模型 。 动态模型表示瞬时的、行为化的系统的“控制”性质,它规定了对象模型中的对象的合法变化序列。 通常,用状态图来描绘对象的状态、触发状态转换的事件、以及对象的行为(对事件的响应)。 6.5.4 功能模型 功能模型表示变化的系统的“功能”性质,它指明了系统应该“做什么”,因此更直接地反映了用户对目标系统的
13、需求。 UML提供的用例图也是进行需求分析和建立功能模型的强有力工具。在UML中把用用例图建立起来的系统模型称为用例模型。,6.5 面向对象的建模,三种模型之间的关系: (1)针对每个类建立的动态模型,描述了类实例的生命周期或运行周期。 (2)状态转换驱使行为发生,这些行为在数据流图中被映射成处理,它们同时与对象模型中的服务相对应。 (3)功能模型中的处理(或用例)对应于对象模型中的类所提供的服务。通常,复杂的处理(或用例)对应于复杂对象提供的服务,简单的处理(或用例)对应于更基本的对象提供的服务。有时一个处理对应多个服务,也有个服务对应多个处理的时候。 (4)数据流图中的数据存储,以及数据的
14、源点终点,通常是对象模型中的对象。 (5)数据流图中的数据流,住往是对象模型中的对象的属性值,也可能是整个对象。 (6)用例图中的行为者,可能是对象模型中的对象。 (7)功能模型中的处理(或用例)可能产生动态模型中的事件。 (8)对象模型描述了数据流图中的数据流、数据存储以及数据源点/终点的结构。,6.6 面向对象的开发方法,6.6.1 Booch方法 Booch方法的过程包括以下步骤: 在给定的抽象层次上识别类和对象; 识别这些对象和类的语义; 识别这些类和对象之间的关系; 实现类和对象。 6.6.2 Coad方法 Coad方法是1989年Coad和Yourdon提出的面向对象的开发方法,该方法严格区分了面向对象分析(OOA)和面向对象设计(OOD)。该方法利用五个层次和活动定义记录系统行为、输入和输出。,6.6 面向对象的开发方法,6.6.3 OMT方法 OMT方法从三个视角描述系统,相应地提供了三种模型:对象模型,动态模型和功能模型。 该方法将开发过程分为四个阶段:分析 、系统设计 、对象设计 、实现 。 6.6.4 Jacobsom方法 Jacobson方法与上述三种方法有所不同,它涉及到整个软件生命周期,包括需求分析、设计、实现和测试等四个阶段。 在该方法中的一个关键概念就是用例(use case)。,面向对象软件开发的敏捷过程,