第六章面向对象设计•6.1面向对象方法•6.2面向对象的分析•6.3面向对象设计6.1面向对象方法6.1.1面向对象方法概述6.1.2面向对象的软件工程(OOSE)6.1.3面向对象的基本概念和特征6.1面向对象方法6.1.1面向对象方法概述•面向对象不仅是一些具体的软件开发技术与策略,而且是一整套关于如何看待软件系统与现实世界的关系,以什么观点来研究问题并进行求解,以及如何进行系统构造的软件方法学。•面向对象方法的基本思想是从现实世界中客观存在的事物出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式。6.1面向对象方法6.1.1面向对象方法概述1.面向对象方法的主要特点(1)从问题域中客观存在的事物出发来构造软件系统,用对象作为对这些事物的抽象表示,并以此作为系统的基本构成单位。(2)事物的静态特征是可以用一些数据来表达的特征,可以用对象的属性表示,事物的动态特征(即事物的行为)用对象的服务(或操作)表示。(3)对象的属性与服务结合为一个独立的实体,对外屏蔽其内部细节,称作封装。6.1面向对象方法6.1.1面向对象方法概述1.面向对象方法的主要特点(4)把具有相同属性和相同服务的对象归为一类,类是这些对象的抽象描述,每个对象是它的类的一个实例。(5)通过在不同程度上运用抽象的原则,可以得到较一般的类和较特殊的类。特殊类继承一般类的属性与服务,面向对象方法支持对这种继承关系的描述与实现,从而简化系统的构造过程及其文档。6.1面向对象方法6.1.1面向对象方法概述1.面向对象方法的主要特点(6)复杂的对象可以用简单的对象作为其构成部分,称作聚合。(7)对象之间通过消息进行通信,以实现对象之间的动态联系。(8)通过关联表达对象之间的静态关系。6.1面向对象方法6.1.1面向对象方法概述2.面向对象的定义(1)一种使用对象(它将属性与操作封装为一体)、消息传送、类、继承、多态和动态绑定来开发问题域模型之解的范型。(2)一种基于对象、类、实例和继承等概念的技术。(3)用对象作为建模的原子。6.1面向对象方法6.1.2面向对象的软件工程面向对象的软件工程学是面向对象方法在软件工程领域的全面运用。它包括面向对象的分析、面向对象的设计、面向对象的编程、面向对象的测试和面向对象的软件维护等主要内容。6.1面向对象方法6.1.2面向对象的软件工程(1)面向对象的分析面向对象分析(OOA)强调直接针对问题域中客观存在的各项事物建立OOA模型中的对象。6.1面向对象方法6.1.2面向对象的软件工程(2)面向对象的设计OOD则是针对系统的一个具体的实现运用OO方法。其中包括两方面的工作,一是把OOA模型直接搬到OOD(不经过转换,仅作某些必要的修改和调整),作为OOD的一个部分;二是针对具体实现中的人机界面、数据存储、任务管理等因素补充一些与实现有关的部分。6.1面向对象方法6.1.2面向对象的软件工程(3)面向对象的编程面向对象的编程(OOP)又称作面向对象的实现(OOI)。OOP工作就是用同一种面向对象的编程语言把OOD模型中的每个成分书写出来。6.1面向对象方法6.1.2面向对象的软件工程(4)面向对象的测试面向对象的测试(OOT)是指:对于用OO技术开发的软件,在测试过程中继续运用OO技术,进行以对象概念为中心的软件测试。6.1面向对象方法6.1.2面向对象的软件工程(5)面向对象的软件维护•面向对象的软件工程方法为改进软件维护提供了有效的途径。程序与问题域一致,各个阶段的表示一致,从而大大降低了理解的难度。•将系统中最容易变化的因素(功能)作为对象的服务封装在对象内部,对象的封装性使一个对象的修改对其他影响也小,从而避免了波动效应。6.1面向对象方法6.1.3面向对象的基本概念和特征1.对象对象是问题域或实现域中某些事物的一个抽象,它反映该事物在系统中需要保存的信息和发挥的作用;它是一组属性和有权对这些属性进行操作的一组服务的封装体。●属性是用来描述对象静态特征的一个数据项;●服务是用来描述对象动态特征(行为)的一个操作序列。6.1面向对象方法6.1.3面向对象的基本概念和特征2.消息和方法(1)消息消息就是向对象发出的服务请求,它应含有提供服务的对象标识、服务标识、输入信息和回答信息。•消息的接收者是提供服务的对象。•消息的发送者是要求提供服务的对象或其他系统成分。•消息的形式用消息模式表示,一个消息模式定义了一类消息,它可以对应内容不同的消息。6.1面向对象方法6.1.3面向对象的基本概念和特征2.消息和方法(2)方法把所有对象分成各种对象类,每个对象类都有一组所谓的方法,它们实际上是类对象上的各种操作。6.1面向对象方法6.1.3面向对象的基本概念和特征3.类和类层次(1)类在OO方法中,类的定义是具有相同属性和服务的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分。6.1面向对象方法6.1.3面向对象的基本概念和特征3.类和类层次(2)类层次结构一个类的上层可以有超类,下层可以有子类,形成一种层次结构。这种层次结构的一个重要特点是继承性,一个类继承其超类的全部描述。6.1面向对象方法6.1.3面向对象的基本概念和特征4.继承性•继承性是自动地共享类、子类和对象中的方法和数据的机制。•特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。继承意味着自动地拥有,或隐含地复制。6.1面向对象方法6.1.3面向对象的基本概念和特征5.封装性•封装是一种信息隐蔽技术,用户只能见到对象封装界面上的信息,对象内部对用户来说是隐蔽的。•封装的目的在于将对象的使用者和对象的设计者分开,使用者不必知道行为实际的细节,只须用设计者提供的消息来访问该对象。6.1面向对象方法6.1.3面向对象的基本概念和特征5.封装性封装的定义为:①一个清楚的边界,所有的对象的内部软件的范围被限定在这个边界内;②一个接口,这个接口描述这个对象和其他的对象之间相互的作用;③受保护的内部实现,这个实现给出了由软件对象提供的功能的细节,实现细节能在定义这个对象的类的外面访问。6.1面向对象方法6.1.3面向对象的基本概念和特征6.结构与连接(1)一般/特殊结构一般/特殊结构又称作分类结构,是一组有一般/特殊关系的类所组成的结构。(2)整体/部分结构整体/部分结构又称为组装结构,它描述对象之间的组成关系,即一个对象是另一个对象的组成部分。6.1面向对象方法6.1.3面向对象的基本概念和特征6.结构与连接(3)实例连接实例连接反映了对象与对象间的静态关系。(4)消息连接消息连接描述对象之间的动态联系,即若一个对象在执行服务时,需要通过消息请求另一个对象为它完成某个服务,则说第一个对象与第二个对象之间存在着消息连接。6.1面向对象方法6.1.3面向对象的基本概念和特征7.多态性•对象的多态性是指在一般类中定义的属性或服务被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。•支持多态性的实现的语言应具有下述功能:(1)重载:在特殊类中对继承来的属性或服务进行重新定义。(2)动态绑定:在运行时根据对象接收的消息动态地确定要连接哪一段服务代码。(3)类属:服务参量的类型可以是参数化的。6.1面向对象方法6.1.3面向对象的基本概念和特征8.主动对象•主动对象是一组属性和一组服务的封装体,其中至少有一个服务不需要接收消息就能主动执行(称作主动服务)。•主动对象的作用是描述问题域中具有主动行为的事物以及在系统设计时识别的任务,主动服务描述相应的任务所应完成的操作。•在系统实现阶段,主动服务应该被实现为一个能并发执行的、主动的程序单位,例如进程或线程。6.2面向对象的分析6.2.1面向对象分析基本过程及原则6.2.2确定对象与类6.2.3确定属性6.2.4定义服务6.2.5对象间通信6.2面向对象的分析6.2.1面向对象分析基本过程及原则1.分析问题的层次面向对象分析大体上按照下列顺序进行:①主题层(也称为范畴层)②类&对象层结构层③属性层④服务层6.2面向对象的分析6.2.1面向对象分析基本过程及原则2.OOA主要概念的表示法及OOA主要原则(1)OOA主要概念①对象、类:必要时可区分主动对象并用不同的类符号表示。②属性:必要时可区分类属性和对象属性。③服务:对于主动对象,应标出主动服务。④结构:分为一般/特殊结构和整体/部分结构。⑤连接:包括实例连接和消息连接。⑥主题:指导读者理解大型而复杂的对象模型。6.2面向对象的分析6.2.1面向对象分析基本过程及原则2.OOA主要概念的表示法及OOA主要原则(2)OOA的主要原则①抽象:OOA中的类就是抽象得到的。②分类:分类就是把具有相同属性和服务的对象划分为一类。③聚合:聚合的原则是把一个复杂的事物看成若干比较简单的事物的组装体④关联:关联又称为组装6.2面向对象的分析6.2.1面向对象分析基本过程及原则2.OOA主要概念的表示法及OOA主要原则(2)OOA的主要原则⑤消息通信:这一原则要求对象之间只能通过消息进行通信⑥粒度控制:面对一个复杂的问题域时,不可能在同一时刻既能纵观全局,又能洞察秋毫。⑦行为分析:现实世界中事物的行为是复杂的。6.2面向对象的分析6.2.2确定对象与类1.确定对象(1)问题域和系统责任问题域和系统责任是发现对象的根本出发点。(2)正确地运用抽象原则紧紧围绕系统责任这个目标去进行抽象。(3)策略与启发从问题域、系统边界和系统责任三个方面,考虑各种能启发自己发现对象的因素。6.2面向对象的分析6.2.2确定对象与类2.对象分类、建立类图的对象层(1)异常情况的检查和调整①类的属性或服务不适合该类的全部对象②属性和服务相似的类③对同一事物的重复描述6.2面向对象的分析6.2.2确定对象与类2.对象分类、建立类图的对象层(2)类的命名①类的名字应恰好符合这个类(和它的特殊类)所包含的每一个对象。②类的名字,应该反映每个对象个体,而不是整个群体。③采用名词,或带有定语的名词;使用规范的词汇;使用专家及用户惯常使用的词汇。④使用适当的语言文字。6.2面向对象的分析6.2.2确定对象与类2.对象分类、建立类图的对象层(3)建立类图的对象层①类图基本概念:•对象层:给出系统中所有反映问题域与系统责任的对象。•特征层:给出每一个类(及其所代表的对象)的内部特征。•关系层:给出各个类(及其所代表的对象)彼此之间的关系。6.2面向对象的分析6.2.2确定对象与类2.对象分类、建立类图的对象层(3)建立类图的对象层②建立步骤:•用类符号表示每个类(对于主动对象,在类名之前增加主动标记“@”),把它们画出来•在类描述模板中填写关于每个类的详细说明。•在发现对象的活动中能够认识的属性和服务均可随时加入类符号,能够认识的结构和连接,均可随时在类符号之间画出6.2面向对象的分析6.2.3确定属性1.对象的属性和服务•事物的静态特征和动态特征分别用对象中的一组属性和一组服务来表达。•按照面向对象方法的封装原则,一个对象的属性和服务是紧密结合的,对象的属性只能由这个对象的服务存取。6.2面向对象的分析6.2.3确定属性2.定义属性•首先考虑利用以往的OOA结果,看看相同或相似的问题域是否有已开发的OOA模型,尽可能复用其中同类对象的属性定义。•然后,主要的工作是研究当前的问题域和系统责任,针对本系统应该设置的每一类对象,按照问题域的实际情况,以系统责任为目标进行正确的抽象,从而找出每一类对象应有的属性。6.2面向对象的分析6.2.4定义服务1.对象的状态与状态转换图(1)对象状态①对象或者类的所有属性的当前值。②对象或者类的整体行为(例如响应消息)的某些规则所能适应的(对象或类的)状况、情况、条件、形式或生存周期阶段。6.2面向对象的分析6.2.4定义服务1.对象的状态与状态转换图(2)状态转换图状态转换图是对整个对象的状态/行为关系的图示,它附属于该对象的类描述模板。过程:①找出对象的各种状态。②分析在不同的状态下,对象的行为规则有何不同。如果发现在开始所认识