390 likes | 607 Views
第 9 章 面向对象方法学 ( 一 ). 主要内容. 9.1 面向对象方法概述 9.2 面向对象的基本概念 9.3 面向对象的分析 9.4 面向对象的设计 9.5 典型的面向对象方法. 9.1 面向对象方法概述. 面向对象的开发方法 OOSD(Object-Oriented Software Development )是一种新的软件工程方法,其基本思想就是尽可能按照人类认识世界的方法和思维方式来分析和解决问题,这种方法能够提供更加清晰的需求分析和设计。 面向对象的方法已成为当今软件开发的主流方法。. 面向对象方法概述.
E N D
主要内容 9.1 面向对象方法概述 9.2 面向对象的基本概念 9.3 面向对象的分析 9.4 面向对象的设计 9.5 典型的面向对象方法
9.1 面向对象方法概述 • 面向对象的开发方法OOSD(Object-Oriented Software Development)是一种新的软件工程方法,其基本思想就是尽可能按照人类认识世界的方法和思维方式来分析和解决问题,这种方法能够提供更加清晰的需求分析和设计。 • 面向对象的方法已成为当今软件开发的主流方法。
面向对象方法概述 • 但是至今在面向对象的领域,大多数工作都集中在编程语言上,而面向对象的开发方法,贯穿整个软件生命期,因此,本章主要讨论面向对象的需求分析(OOA)与面向对象的设计(OOD)。
设计算法 构造系统 领域分析 解空间 复杂转换 问题空间 逻辑模型 一、什么是面向对象方法 • 传统的软件工程方法是面向过程的,将数据和处理过程分离,增加了软件开发的难度。其开发过程如下: 由于问题空间与解空间的模型、描述方式的不同,它们之间存在着复杂的转换过程,尤其对于复杂系统及普遍存在的需求变化,就更难适应。
什么是面向对象方法(续) • 面向对象的方法将软件系统看做一系列离散的解空间对象的集合,问题空间与解空间的结构、描述模型一致,减少了软件系统开发的复杂度。 • 究竟什么是面向对象 根据Coad 和 Yourdon 的定义,按照以下4个概念设计和实现的系统,称为是面向对象的。 面向对象=对象+类+继承+通信
二、面向对象方法的主要特点 1、按照人类习惯的思维方法,对软件开发过程所有阶段进行综合考虑。 以对象为核心,强调模拟现实世界中的概念而不是算法,尽量用符合人类认识世界的思维方式来渐进地分析、解决问题。 2、软件生存期各阶段所使用的方法、技术具有高度的连续性。 使用喷泉模型作为其工作模型,软件生存期各阶段没有明显的界限,开发过程回溯重叠,使用相同的描述方法和模型。
面向对象方法的主要特点(续) 3、软件开发各个阶段有机集成,有利于系统的稳定性。 将OOA(Object-Oriented Analysis)、OOD(Object-Oriented Design)、OOP(Object-Oriented Program)有机地集成在一起。 4、具有良好的重用性。 由于对象所具有的封装性和信息隐蔽,使得对象的内部实现与外界隔离,具有较强的独立性,易于实现可重用性。
9.2 面向对象的基本概念 理解面向对象的主要基本概念,对于学习和掌握面向对象的开发方法是十分重要的。 • 对象(Object) • 类(Class) • 继承 • 封装(encapsulation) • 消息(Information) • 多态性(Polymorphism)与动态绑定 • 永久对象(Persistent object) • 结构与连接
一、对象与类 1.对象 对象(Object)是客观事物或概念的抽象表述,每个对象都存在一定的状态(state),内部标识(identity),可以给对象定义一组运算(operation),对象通过其运算所展示的特定行为称为对象行为(behavior),对象本身的性质称为属性(attribute),对象将它自身的属性及运算“包装起来”,称为“封装”(encapsulation)。
对象与类(续) 2.类(Class) 类又称对象类(Object Class)是指一组具有相同属性和运算的对象的抽象,一组具有相同数据结构和相同操作的对象的集合。在一个类中,每个对象都是类的实例(instance),它们都可以使用类中提供的函数。 类具有属性,用数据结构来描述类的属性,类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法(method),即操作实现的过程来描述。
对象与类(续) 3.对象和类的描述 对象和类一般采用“对象图” 和 “类图” 来描述,例如图,“人”是类名,包含两个属性:姓名和年龄,包含有两个运算:改变工作和改变地址。这里“人”只是一个抽象的概念,并不代表某个具体的人。图4.2描述了两个人对象的实例。
几何对象 颜色 位置 移动(delta:矢量) 选择(P:指针型):布尔型 旋转(角度) 人 姓 名:字符串 年 龄: 整 型 改换工作 改换地址 文件 文件名 文件大小 最近更新日期 打印 类名 属性 运算 (人) 张红兵 28 绘图员 人民路8号 (人) 李军 24 程序员 无 对象的描述 对象与类(续) 类图 对象类的描述 对象图
二、继承 • 继承(Inheritance)是使用现存的定义作为基础,建立新定义的技术。是父类和子类之间共享数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新内容。 • 继承性通常又称为概括,表示基类与子类的关系。子类的公共属性和操作归属于基类,并为每个子类共享,子类继承了基类的特征。
单重继承:一个子类只有一个父类,即子类只继承一个父类的数据结构和方法。单重继承:一个子类只有一个父类,即子类只继承一个父类的数据结构和方法。 多重继承:一个子类可有多个父类,继承多个父类的数据结构和方法。 继承性分 父类 子类B 子类A 继承(续) 继 承 现存类定义 父类(基类) 新类定义 子类(派生类) 继承性 继承性描述
图 形 颜 色 中心位置 笔的浓度 笔 型 移 动 选 择 旋 转 显 示 二 维 0 维 定位 填充类型 一 维 定位 比例尺 比例尺 填充 点 显示 多边形 边数 点数 显示 圆 直径 显示 旋转 弧 半径 起始角 弧度角 显示 线 端点 显示 样条 控制点 显示 继承性的实例
三、多态性 • 对象、类、消息表征面向对象的开发模式,多态性(Polymorphism)在结构方面提供了灵活性。 • 多态性是指相同的操作、函数或过程作用于多种类型的对象上并获得不同的结果。即不同的对象,收到同一消息产生完全不同的结果,这种现象称为多态性。
多态性(续) • 例如,在父类“几何图形”中,定义了一个操作“绘图”,它的子类“椭圆”和“矩形”都继承了几何图形的绘图操作。同是“绘图”操作,分别作用在“椭圆”和“矩形”上,却画出不同的图形。 • 多态性增强了软件的灵活性和重用性,允许用更为明确、易懂的方式去建立通用软件,多态性和继承性相结合使软件具有更广泛的重用性和可扩充性。
四、消息 • 消息(Message)是指对象之间在交互中所传送的通信信息。一个消息应该包含以下信息:消息名、接收消息对象的标识、服务标识 、消息和方法、输入信息、回答信息。使对象之间互相联系、协同工作,实现系统的各种服务。 • 通常一个对象向另一个对象发送信息请求某项服务,接受对象响应该消息,激发所要求的服务操作,并将操作结果返回给请求服务的对象。 • 注意:在并发系统中,多个控制线程(Thread of Control)并发执行,情况就复杂得多,消息可以是发出服务请求、提交数据、发布事件信息或是传递同步控制信息。
数据结构 数据值 抽象 实例 执行的 操作 操作:调工资 评职称 受 聘 行为:调工资 评职称 受 聘 抽象 类:教师 对象:李红 属性: 姓名、年龄 单位、职称、工资 状态: 李红、25 计算机系、讲师、800 方法名(参数) 方法:调工资 (计算公式) 评职称 (步骤、条件) 人事处向对象发消息 方法体 李红:调工资(…) 消息(续) 对象、类及消息传递
五、方法(method) • 类中的操作实现的过程称为方法(method),方法描述了类与对象的行为。 • 每一个对象都封装了数据和算法两个方面,数据由一组属性表示,而算法即是当一个对象接收到一条消息后,它所包含的方法决定对象如何动作。 • 通常是在某种编程语言(如Java、C++)下实施的运算。一个方法包括方法名、参数及方法体。
六、永久对象(Persistent object) • 永久对象是当前OO领域的一个技术热点。 • 所谓永久对象是指生存期可以超越程序的执行时间而长期存在的对象。 • 目前,大多数OOPL不支持永久对象,如果一个对象要长期保存,必须依靠于文件系统或数据库管理系统实现,程序员需要作对象与文件系统或数据库之间数据格式的转换,以及保存和恢复所需的操作等烦琐的工作。 • 为了实现永久对象,使上述烦琐工作由系统自动完成,需要较强的技术支持;需要一个基于永久对象管理系统OMS(object management system),能够描述和处理永久对象的编程语言。
交通工具 轮船 客运工具 客轮 一般-特殊结构 七、结构与连接 • 1、一般-特殊的结构 又称为分类结构(classification structure),由一组具有“一般-特殊”关系(继承关系)的类构成。是一个以类为结点,以继承关系为边的连通有向图。 单重继承构成的类之间的关系是层次结构(hierarchy structure)是一棵树。 多重继承构成的类之间的关系称为网格结构(lattice structure),是半序的连通有向图。
汽车 车身 发动机 气缸 整体-部分结构 结构与连接(续) 2、整体-部分结构 整体-部分的关系有两种: ⑴ 一个部分对象只隶属于惟一的整体对象。部分与整体对象同时存在。 ⑵ 一个部分对象可属于多个整体对象。部分与整体对象之间的的关系比较松散
结构与连接(续) 3、实例连接 反映对象之间的静态联系。 4、消息连接 描述对象之间的动态联系,连接是有向的。
9.3 面向对象的分析 • 面向对象的分析OOA(Object-Oriented Analysis)是软件开发过程中的问题定义阶段。 • 面向对象的分析过程分为论域分析和应用分析,该阶段的目标是获得对问题论域的清晰、精确的定义。产生描述系统功能和问题论域的基本特征的综合文档。
一、需求分析中的问题 各种需求分析方法,都面临着以下问题: 1.明确问题域和系统责任 问题域(problem domain)是指被开发系统的应用领域,即拟建立系统进行处理的业务范围。 系统责任(system responsibilities)即所开发系统应该具备的职能。 2.充分交流的问题 在软件开发过程中,各类人员的充分交流是获得准确分析结果的关键,其中以软件开发人员与领域专家之间的交流尤为重要。
需求分析中的问题(续) 3.需求的不断变化 在分析过程中的一个严峻问题是需求总是在不断的变化。需求的变化要求分析员去修改分析,甚至重新作分析,而反复的修补常常会将系统搞乱和引入新的错误。 4.考虑复用要求 要实现分析的复用,要求分析结果中的基本成分具有较强的独立性。
二、面向对象分析的特点 OOA在解决上述分析中的问题有较强的能力。 1.有利于对问题及系统责任的理解 在OOA中,构成系统的对象和类都与问题域有良好的对应关系,因此十分有利于对问题及系统责任的理解。 2.有利于对人员之间的交流 由于OOA中,用符合人类的思维方式来认识和描述问题域,即软件开发人员和应用领域的专家具有共同的思维方式,有利于交流。
面向对象分析的特点(续) 3.对需求变化有较强的适应性 对象是构成系统最基本的元素,而对象的基本特征是封装性,将容易变化的成分(如操作及属性)封装在对象中,将系统中最容易变化的因素隔离起来,对象的稳定性使系统具有宏观上的稳定性。 4.支持软件复用 OOA方法的继承性本身就是一种支持复用的机制,类所具有的完整性、独立性 ,是实现软件复用的重要条件。
三、面向对象分析的基本任务与分析过程 1.OOA的基本任务 OOA是软件开发过程中的问题定义阶段,目标是完成对所求解问题的分析,确定系统“作什么”,并建立系统的模型。 2. OOA的分析过程 ⑴论域分析(domain analysis) 抽取和整理用户需求并建立问题域精确模型的过程。主要任务是充分理解领域业务问题和投资者及用户的需求,提出高层次的问题解决方案。 应具体分析应用领域的业务范围、业务规则和业务处理过程,确定系统范围、功能、性能,完善用户需求,抽象出目标系统的本质属性,建立问题论域模型。
面向对象分析的基本任务与分析过程 ⑵应用分析(application analysis) 应用分析是将论域分析建立起来的问题论域模型,用某种基于计算机系统的语言来表示。响应时间需求,用户界面需求和数据安全等特殊的需求都在这一层分解抽出。
OOA分析过程的具体步骤 常用用例(User case)来收集和描述用户的需求。 获取用户基本需求 标识类及类的属性和操作。 标识类和对象 类的结构有:一般与特殊结构,整体与部分结构。构成类图的元素所表达的模型信息,通常分为对象层、特征层、关系层三个层次。 定义类的结构和层次 表示类(对象)间的关系 描述了系统的静态结构。 为对象行为建模 描述系统的动态行为。 OOA分析过程
9.4 面向对象的设计 • 面向对象设计OOD(Object-Oriented Design),是面向对象方法在软件设计阶段应用与扩展的结果。 • 面向对象的设计通过对象的认定和对象层次结构的组织,确定解空间中应存在的对象和对象层次结构,并确定外部接口和主要的数据结构。 • 面向对象的设计主要目标是提高生产效率,提高质量和提高可维护性。
分而治之,分解子系统。 弱耦合、强内聚的子系统和类,能够有效地提高所设计部件的可重用性。 抽象是指强调实体的本质、内在的属性,而忽略了一些无关紧要的属性。 模块化 可重用 抽象 设计 准则 信息隐藏 强内聚 弱耦合 在面向对象的方法中也即“封装性”,是保证软件部件具有优良的模块性的基础。 是指子系统内部是由一些关系密切的类构成,构成具有强内聚性的子系统。 弱耦合是指子系统之间的联系应该尽量的少。 一、面向对象设计的准则
二、面向对象设计的基本任务 面向对象的设计可分为系统设计和对象设计。 1.系统设计 系统设计的任务包括:将分析模型中紧密相关的类划分为若干子系统(也称为主题),子系统应该具有良好的接口,子系统中的类相互协作。
面向对象设计的基本任务(续) 2.对象设计 面向对象的设计通过对象的认定和对象层次结构的组织,确定解空间中应存在的对象和对象层次结构,并确定外部接口和主要的数据结构。 面向对象设计的具体内容有: 1)设计问题域组元(problem domain component) 2)设计人机交互组元(human interaction component) 3)设计任务管理组元(task management component) 4)设计数据管理组元(data management component)
面向对象设计的基本任务(续) 面向对象设计的主要内容包括以下4类活动: ⑴ 设计问题域组元(problem domain component) 从实现的角度,对通过分析所建立的问题域模型作一些修改和补充,例如对类、对象、结构、属性及服务进行增加、修改或完善。 ⑵ 设计人机交互组元(human interaction component) 人机交互组元,即用户与系统的交互命令及系统反馈的信息。在分析的基础上进一步分析用户,确定交互的细节;包括指定窗口、设计窗口及设计报表形式等。
面向对象设计的基本任务(续) ⑶ 设计任务管理组元(task management component) 要确定各类任务,并把任务分配到硬件或软件上去执行。常见的任务有事件驱动型任务、时钟驱动型任务、优先任务、关键任务和协调任务等。 ⑷ 设计数据管理组元(data management component) 设计数据管理部件,既需要设计数据格式,又需要设计相应的服务。