面向对象设计第八章.ppt
2023/7/9,共130页 第1页,第八章 面向对象设计(OOD),OOD与结构化设计有何不同?OOD的过程是什么?如何完成系统及子系统各部分的设计?,2023/7/9,共130页 第2页,从面向对象的分析到面向对象设计(通常写为OOD),是一个逐渐扩充模型的过程。然而在实际的开发过程中二者的界限是模糊的。,2023/7/9,共130页 第3页,8.1.面向对象设计的准则,模块化抽象 过程抽象 数据抽象信息隐藏,2023/7/9,共130页 第4页,8.1.面向对象设计的准则(续),弱耦合 交互耦合(通过消息连接实现)继承耦合(一般化类与特殊类)强内聚 服务内聚(一个服务仅完成一个功能)类内聚(一个类只有一个用途)一般-特殊内聚可重用 尽量使用已有的类 如果确实需要创建新类,2023/7/9,共130页 第5页,8.2 启发规则,设计结果应该清晰易懂 用词一致 使用已有的协议 减少消息模式的数目 避免模糊的定义一般特殊结构的深度应适当设计简单的类 避免包含过多的属性 有明确定义 尽量简化对象之间的合作关系 不要提供太多服务,2023/7/9,共130页 第6页,8.2 启发规则(续),使用简单的协议 使用简单的服务设计变动减至最小,2023/7/9,共130页 第7页,面向对象设计继续做面向对象分析阶段的工作,建立软件的结构。系统的主要组成部分称为子系统,一般来说,子系统的数目应该与系统规模基本匹配。各子系统之间应该具有尽可能简单、明确的接口,尽量减少子系统彼此间的依赖性。,8.3 系统分解,2023/7/9,共130页 第8页,在设计阶段中,五个层次用于建立系统的四个组成成份。问题论域部分 人机交互部分 任务管理部分 数据管理部分,2023/7/9,共130页 第9页,问题论域部分包括与应用问题直接有关的所有类和对象。识别和定义这些类和对象的工作在OOA中已经开始,在OOA阶段得到的有关应用的概念模型描述了我们要解决的问题。在OOD阶段,应当继续OOA阶段的工作,对在OOA中得到的结果进行改进和增补。,8.4 问题域子系统,2023/7/9,共130页 第10页,1、问题论域部分的设计(调整需求),在OOA阶段得到的概念模型描述了要解决的问题在OOD阶段,继续OOA阶段的工作,对在OOA中得到的结果进行改进和增补。对OOA模型中的某些类与对象、结构、属性、操作进行组合与分解。要考虑对时间与空间的折衷、内存管理、开发人员的变更、以及类的调整等。,2023/7/9,共130页 第11页,2.复用设计,根据问题解决的需要,把从类库或其它来源得到的既存类增加到问题解决方案中去。,2023/7/9,共130页 第12页,3、把问题论域相关的类关联起来,在设计时,从类库中引进一个根类,做为包容类,把所有与问题论域有关的类关联到一起,建立类的层次。把同一问题论域的一些类集合起来,存于类库中。,2023/7/9,共130页 第13页,4、加入一般化类以建立类间协议,有时,某些特殊类要求一组类似的服务。此时,应加入一个一般化的类,定义为所有这些特殊类共用的一组服务名,这些服务都是虚函数。在特殊类中定义其实现。,2023/7/9,共130页 第14页,5、调整继承支持级别,在OOA阶段建立的对象模型中可能包括有多继承关系,但实现时使用的程序设计语言可能只有单继承,甚至没有继承机制,这样就需对分析的结果进行修改。多继承模式有两种:狭义的菱形 广义的菱形,2023/7/9,共130页 第15页,2023/7/9,共130页 第16页,针对单继承语言的调整,把特殊类的对象看做是一个一般类对象所扮演的角色,通过实例连接把多继承的层次结构转换为单继承的层次结构。把多继承的层次结构平铺,成为单继承的层次结构。在这种情况下,有些属性或操作在同层的特殊类中会重复出现。,2023/7/9,共130页 第17页,2023/7/9,共130页 第18页,针对无继承语言的调整,当使用无继承的程序设计语言时,必须把具有继承关系的类层次结构平铺开来,成为一组类和对象。一般可利用命名惯例,把这些类或对象关联起来。,2023/7/9,共130页 第19页,6、改进性能,提高执行效率和速度是系统设计的主要指标之一。有时,必须改变问题论域的结构以提高效率。如果类之间经常需要传送大量消息,可合并相关的类以减少消息传递引起的速度损失。增加某些属性到原来的类中,或增加低层的类,以保存暂时结果,避免每次都要重复计算造成速度损失。,2023/7/9,共130页 第20页,7、加入较低层的构件,在做面向对象分析时,分析员往往专注于较高层的类和对象,避免考虑太多较低层的实现细节。在做面向对象设计时,设计师在找出高层的类和对象时,必须考虑到底需要用到哪些较低层的类和对象。,2023/7/9,共130页 第21页,在 OOA 阶段给出了所需的属性和操作,在设计阶段必须根据需求把交互细节加入到用户界面设计中,包括人机交互所必需的实际显示和输入。用户界面部分设计主要由以下几个方面组成。,8.5 设计人-机交互子系统,2023/7/9,共130页 第22页,1、用户分类,按技能层次分类:外行初学者熟练者专家按组织层次分类:行政人员管理人员专业技术人员其它办事员按所属集团分类:顾客职员按职务分类:总经理经理职员,2023/7/9,共130页 第23页,2、描述人及其任务的脚本,对以上定义的每一类用户,列出对以下问题做出的考虑:什么人、目的、特点、成功的关键因素、熟练程度以及任务脚本。例子:什么人分析员 目的要求一个工具来辅助分析工作(摆脱繁重的画图和检查图的工作)。,2023/7/9,共130页 第24页,特点年龄:42岁;教育水平:大学;限制:不要微型打印,小于9个点的打印太小。成功的关键因素工具应当使分析工作顺利进行;工具不应与分析工作冲突;工具应能捕获假设和思想,能适时做出折衷;应能及时给出模型各个部分的文档,这与给出需求同等重要。熟练程度专家。,2023/7/9,共130页 第25页,任务脚本 主脚本:识别“核心的”类和对象;识别“核心”结构;在发现了新的属性或操作时随时都可以加进模型中去。检验模型:打印模型及其全部文档。,2023/7/9,共130页 第26页,3、设计命令层,研究现行的人机交互活动的内容和准则:这些准则可以是非形式的,如“输入时眼睛不易疲劳”,也可以是正式规定的;建立一个初始的命令层:可以有多种形式,如一系列 Menu Screens、或一个Menu Bar、或一系列Icons.细化命令层:考虑以下几个问题。,2023/7/9,共130页 第27页,排列命令层次。把使用最频繁的操作放在前面;按照用户工作步骤排列。通过逐步分解,找到整体局部模式,以帮助在命令层中对操作分块。根据人们短期记忆的“72”或“每次记忆3块每块3项”的特点,把深度尽量限制在三层之内。减少操作步骤:把点取、拖动和键盘操作减到最少,并为高级用户提供简捷的操作方法,2023/7/9,共130页 第28页,4、设计详细的交互,用户界面设计有若干原则,包括:一致性:采用一致的术语、一致的步骤和一致的活动。操作步骤少:减少敲键和鼠标点取的次数,减少完成某件事所需的下拉菜单的距离。不要“哑播放”:每当用户等待系统完成一个活动时,要给出一些反馈信息。,2023/7/9,共130页 第29页,Undo:在操作出现错误时,要恢复或部分恢复原来的状态。减少人脑的记忆负担:不应在一个窗口使用在另一个窗口中记忆或写下的信息;需要人按特定次序记忆的东西应当组织得容易记忆。学习的时间和效果:提供联机的帮助信息。趣味性:尽量采取图形界面,符合人类习惯.,2023/7/9,共130页 第30页,任务,是进程的别称,是执行一系列活动的一段程序。当系统中有许多并发行为时,需要依照各个行为的协调和通信关系,划分各种任务,以简化并发行为的设计和编码。任务管理主要包括任务的选择和调整,它的工作有以下几种。,8.6 任务管理部分设计,2023/7/9,共130页 第31页,识别事件驱动任务:一些负责与硬件设备通信的任务是事件驱动的,也就是说,这种任务可由事件来激发。识别时钟驱动任务:以固定的时间间隔激发这种事件,以执行某些处理。某些人机界面、子系统、任务、处理机或与其它系统需要周期性的通信,因此时钟驱动任务应运而生。,2023/7/9,共130页 第32页,识别优先任务和关键任务:根据处理的优先级别来安排各个任务。识别协调者:当有三个或更多的任务时,应当增加一个追加任务,起协调者的作用。它的行为可以用状态转换矩阵来描述。评审各个任务:对各任务进行评审,确保它能满足选择任务的工程标准事件驱动?时钟驱动?优先级/关键任务?协调者?,2023/7/9,共130页 第33页,定义各个任务,定义任务的工作主要包括:它是什么任务、如何协调工作及如何通信。(1)它是什么任务为任务命名,并简要说明这个任务。(2)如何协调工作定义各个任务如何协调工作。指出它是事件驱动还是时钟驱动。,2023/7/9,共130页 第34页,(3)如何通信定义各个任务之间如何通信。任务从哪里取值,结果送往何方。(4)一个模版任务的定义如下:Name(任务名)Description(描述)Priority(优先级)Servicesincluded(包含的操作)、Communication Via(经由谁通信)。,2023/7/9,共130页 第35页,确定资源需求:为了满足高性能需求,设计者必须通过计算系统载荷(即每秒处理的业务数及处理一个业务所花费的时间),来估计所需要CPU(或其它固件)的处理能力。(1)现有的硬件完全能满足某些方面的需求;(2)专用硬件比通用的CPU性能更高。,2023/7/9,共130页 第36页,数据管理部分提供了在数据管理系统中存储和检索对象的基本结构,包括对永久性数据的访问和管理。是系统存储或检索对象的基本设施。它建立在某种数据存储管理系统之上,分离了数据管理机构所关心的事项,包括文件、关系型DBMS或面向对象DBMS等。,8.7 数据管理部分的设计,2023/7/9,共130页 第37页,1、数据存储管理方法,数据管理方法主要有3种:文件管理、关系数据库管理和面向对象库数据管理。文件管理文件管理系统是操作系统的一个组成部分,提供基本的文件处理能力。,2023/7/9,共130页 第38页,关系数据库管理系统 优点:提供了各种基本数据管理功能;为多种应用提供了一致的接口;标准化的语言。,2023/7/9,共130页 第39页,面向对象数据库管理系统通常,面向对象的数据库管理系统以两种方法实现:一是扩充的RDBMS,二是扩充的面向对象程序设计语言。扩充的RDBMS主要对RDBMS扩充了抽象数据类型和继承性,再加一些一般用途的操作创建和操纵类与对象。扩充的OOPL在面向对象程序设计语言中嵌入了在数据库中长期管理存储对象的语法和功能。,2023/7/9,共130页 第40页,8.8 设计类中的服务,确定类中应有的服务设计实现服务的方法 设计实现服务的算法 选择数据结构 定义内部类和内部操作,2023/7/9,共130页 第41页,关联的遍历 单向遍历 双向遍历(原型开发时使用可以快速地 扩充和修改原型)单向关联的实现(指针)双向关联的实现 只用属性实现一个方向的关联 两个方向的关联都用属性实现 用独立的关联对象实现双向关联链属性的实现,8.9 设计关联,2023/7/9,共130页 第42页,确定优先级 在效率与清晰性之间寻求适当的折衷方案提高效率 增加冗余关联以提高访问效率 调整查询次序 保留派生属性调整继承关系 抽象与具体(先生成具体类,再归纳)为提高继承程度而修改类定义(抽取公共属 性和行为放到一个共同的祖先类中)利用委托实现行为共享,8.10 设计优化,2023/7/9,共130页 第43页,例:简化的C+类库管理系统一、面向对象分析 1、需求*管理用C+语言定义的类*用户能够方便地向类库中添加新的类,并能建立新类与库中原有类的关系*用户能够通过类名从类库中查询(修改)出指定的类的信息*用户能够从类库中删除指定的类*用户能够方便地浏览当前类及其父类和子类*具有“联想”功能*能够查看或修改类的源代码*多用户系统*能提示用户误操作的信息*系统易学易用,用户界面是GUI的,8.11 面向对象设计与分析实例,2023/7/9,共130页 第44页,2、建立对象模型(1)确定类-&-对象 组成该系统的基本对象是“类库”和“类”,这里可把“父类”、“成员函数”和“数据成员”作为对象,类提供的服务主要是:设置或更新类名;添加、删除和更改父类、成员函数、数据成员(2)分析类-&-对象之间的关系 一个用户拥有多个类库,每个类库由0或多个类条目组成,每个类条目由0或多个父类,0或多个数据成员及0或多个成员函数组成,2023/7/9,共130页 第45页,2023/7/9,共130页 第46页,二、面向对象设计 1、设计类库结构 有两种数据结构可以把类组织成类库:二叉树 优点:二叉树直接反映类的继承关系;容易查找当前类的子类和兄弟类 缺点:二叉树遍历开销大,插入删除算法比较复杂,不易表示多继承 链表 优点:结构简单插入删除算法简单;容易遍历;缺点:这种结构不反映继承关系,2023/7/9,共130页 第47页,2、设计问题域子系统(1)类条目 用“父类链表头指针”、“成员函数链表头指针”和“数据成员链表头指针”分别取代原来比较抽象的“父类列表”、“成员函数列表”和“数据成员列表”(2)类库(ClassEntryLink)类库的数据成员“类条目列表”具体化为“类链头指针”类库应该提供的服务有:取得库中类条目的个数;读文件并在内存中建立类链表;把内存中的类链表写到文件中;插入类条目;删除一个类条目;按类名查找类条目并把内容复制到指定地点,2023/7/9,共130页 第48页,(3)父类(ClassBase),成员函数(ClassFun)和数据成员(ClassData)在ClassBase,ClassFun和ClassData这三个类需要重新增加数据成员“指向下一个父类的指针”、“指向下一个数据成员的指针”(4)类条目缓冲区 当用户查看或编辑有关指定类的信息时,就把这个类条目从类库中取到类条目缓冲区中。用户所做的操作在“确认”前不送回类库。,2023/7/9,共130页 第49页,3、设计人机交互子系统(1)窗口 登陆窗口 主窗口 创建窗口 选择浏览方式窗口 类名浏览窗口 类关系浏览窗口(2)重用,4、设计其它类,