收藏 分享(赏)

面向对象程学设计部分课件OO设计.ppt

上传人:dzzj200808 文档编号:3349916 上传时间:2018-10-17 格式:PPT 页数:60 大小:710.50KB
下载 相关 举报
面向对象程学设计部分课件OO设计.ppt_第1页
第1页 / 共60页
面向对象程学设计部分课件OO设计.ppt_第2页
第2页 / 共60页
面向对象程学设计部分课件OO设计.ppt_第3页
第3页 / 共60页
面向对象程学设计部分课件OO设计.ppt_第4页
第4页 / 共60页
面向对象程学设计部分课件OO设计.ppt_第5页
第5页 / 共60页
点击查看更多>>
资源描述

1、第三部分 面向对象的设计,2,8.1 什么是面向对象设计,第8章 面向对象的设计(OOD)概述,OOA与OOD的关系:,1、从OOA到OOD不是转换;是调整和增补,问题域 部分,OOA 模型,将OOA模型搬到OOD; 进行必要的调整, 作为OOD模型的问题域部分;,构件部署,3,OOA与OOD的关系:,1、从OOA到OOD不是转换;是调整和增补,问题域 部分,OOA 模型,将OOA模型搬到OOD; 进行必要的调整, 作为OOD模型的问题域部分;,构件部署,4,2、采用一致的概念和表示法 不存在分析与设计之间的鸿沟3、有不同的侧重点和不同的策略OOA主要针对问题域,识别有关的对象以及它们之间的关

2、系,产生一个映射问题域,满足用户需求,独立于实现的OOA模型。OOD主要解决与实现有关的问题,基于OOA模型,针对具体的软、硬件条件(如机器、网络、OS、GUI、DBMS等)产生一个可实现的OOD模型。4、OOA与OOD可适合不同的生命周期模型 瀑布模型、螺旋模型、增量模型、喷泉模型,5,分析 (OOA),设计 (OOD),编程 (OOP),演化,集成,测试,编程 (OOP),设计 (OOD),分析 (OOA),测试,维护,瀑布模型,喷泉模型,不同过程模型中的OOD,6,OOD按实现条件对OOA模型进行调整,并补充几个新的组成部分(也是由对象构成)与实现有关的因素: 图形用户界面系统 硬件、操

3、作系统及网络 数据管理系统 其他编程语言、可复用构件库,7,做 什 么,怎 么 做,问题域与 系统责任,与实现有 关的因素,分析,设计,第 一 种 观 点,分 析,设 计,第二种观点,第二种观点的理由:(1)在各种分析/设计方法中“做什么”和“怎么做”实际上没有严格的划分”。(2)过分强调“分析不考虑怎么做”将使某些必须在OOA考虑的问题得不到完整的认识。(3)由于OO方法表示形式的一致,不存在把细化工作留给设计人员的必然理由。(4)避免重复地认识同一事物,并有利于分析结果的复用。,关键问题:对象的特征细节(如属性的数据类型和服务流程图),是在分析时定义还是在设计时定义?,两种不同的观点,OO

4、D模型 从两个侧面来描述,8.2 OOD模型和过程,从另一侧面观察 OOD模型每个部分 如何用OO概念表达 采用OOA的概念及 模型组织方式,从一个侧面观察 OOD模型包括几个主要部分 一个核心部分加几个外围部分,在辅助模型中要增加分别用于描述构件模型和部署模型的构件图和部署图,9,OOD过程: 设计OOD模型的五个部分问题域部分的设计 人机交互部分的设计 控制流管理部分的设计 数据管理部分的设计 构件部署设计,前4项不强调次序每个部分均采用与OOA一致的概念、表示法及活动, 但具有自己独特的策略。进行构件部署设计要在其前面四个部分完成后进行。,10,对OOA结果按实现条件进行补充与调整就是问

5、题域部分。进行问题域部分设计,要继续运用OOA的方法,包括概念、表示法及一部分策略。不但 要根据实现条件进行OOD设计,而且由于需求变化或新发现了错误,也要对OOA的结果进行修改。本章的重点是对OOA结果进行补充与调整,要强调的是这部分工作主要不是细化,但OOA未完成的细节定义要在OOD完成。,第9章 问题域部分的设计,11,(1)为复用设计与编程的类而增加结构 (2)增加一般类以建立共同协议 (3)按编程语言调整继承 (4)提高性能 (5)为数据存储管理增补属性与服务 (6)为编程方便增加底层成分(7) 决定关系的实现方式(8)对例外的处理(9)编程语言限制了可用的属性类型(10)构造或优化

6、算法 (11)调整服务 (12)决定对象间的可访问性 (13) 考虑采用设计模式 (14)其它,12,(1)为复用设计与编程的类而增加结构,OOA识别和定义的类是本次开发中新定义的,需要进行编程。如果已存在一些可复用的类,而且这些类既有分析、设计时的定义,又有源程序,那么,复用这些类即可提高开发效率与质量。可复用的类可能只是与OOA模型中的类相似,而不是完全相同,因此需对二者进行修改。目标:尽可能使复用成分增多,新开发的成分减少,13,不同程度的复用,当前所需的类的信息 比 可复用类定义的信息, 直接复用 通过继承复用 删除可复用类的多余信息 删除多余信息,通过继承而复用,14,第四种情况的做

7、法:把要复用的类加到问题域, 标以 “复用” 划掉(或标出)不用的属性与服务建立从复用类到问题域原有的类之间的泛化关系由于问题域的类继承了“复用”类的特征, 所以有些属性和服务不需要了划掉。修改问题域原有类的结构和连接,必要时移到“复用”类,15,例:,16,(2)增加一般类以建立共同协议增加根类:将所有的具有相似协议的类组织在一起提供通用的协议例:提供创建、删除、复制等服务增加其他一般类:提供局部通用的协议例:提供永久存储及恢复功能,17,对相似的操作的处理有时在若干类中定义了相同的操作,就能够从共同的超类中继承它们。然而,在不同类中的操作经常是相似的,而不是相同的。这时需要对操作原型做小的

8、修改,使得操作就可以相互相匹配,即不仅操作的名字和特征标记必须相匹配,而且它们应该都具有相同的语义含义。调整继承的策略1若有些操作比其他操作具有更少的参数,要加入所没有的参数,但在这些操作的方法中忽略新加入的参数。-缺点:对消息规约,有些麻烦。 (慎用) 2若在一个类中不需要父类中定义的操作,就在该类中把它声明为一个无操作的方法。 (慎用),选读,18,(3)按编程语言调整继承 起因:OOA强调如实地反映问题域,OOD考虑实现问题,所用语言不支持多继承,甚至不支持继承,多继承模式,狭义菱形,广义菱形,19,因为聚合和泛化是不同的概念,这种方法并不是通用的(按定义)。 在大多数情况下,需要考虑形

9、成多继承的原因,将本来在特殊类中显式定义的信息离出来,作为部分对象,以原来的一般类作为整体对象。,把多继承调整为单继承,20,方法1:采用关联,21,公司人员,身份,顾主身份,职员身份,1,01,01,1,22,方法2:压平,公司人员,顾主,职员,顾主职员,问题:有什么缺点?,23,公司人员,顾主,职员,顾主职员,顾主信息,职员信息,24,方法3:取消泛化,顾主,职员,顾主职员,问题:有什么缺点?,25,对多态性的调整,26,把需要频繁交换信息的对象,尽量地放在一台处理机上。 增加属性或类,以保存中间结果 提高或降低系统的并发度,可能要人为地增加或减少主动对象。 合并通讯频繁的类,流速调节器指

10、定流速 流速调节 ,流速探测器当前流速 流速探测 取当前流速 ,流速控制器指定流速 当前流速 流速调节 流速探测 ,合并前,合并后,(4)提高性能,27,用聚合关系描述复杂类,帧,显示,背景,前景,*,1,1,1,显示,显示,28,为编程方便增加底层成分 细化对象的分类,例:将几何图形分成多边形、椭圆、扇形等特殊类,几何图形,多边形,扇形,椭圆,29,供货商,客户,0*,1*,供需合同卖方 买方 .,1,1,供货商,0*,1*,把多对多关联转化为一对多关联,(5)对复杂关联的转化并决定关联的实现方式,30,项目,人员,语言,任务项 项目名 人员 语言 ,1 1*,* 1,1 *1*,把多元关联

11、转化为二元关联,公司,雇员,*,1*,工作,薪水,*,1*,工作,薪水,公司,雇员,1,1,把关联类转化为二元关联,32,对关联进行调整后,要考虑关联的实现方式。 (1)聚合决定在整体类中指出部分类时,是用部分类直接作为整体类中的属性的数据类型,还是把部分类用作指针或对象标识的基类型,再用这样的指针或对象标示定义整体类的属性。如果是组合,最好用第1种方式,否则就需要在程序中保证整体对象与部分对象的生命周期的一致性。 (2)关联通常,通过在对象中设立指针或对象标识以指向或记录另一端的对象的方法,来实现关联。如果是单向关联,就在源端的类中设立属性,用来标记另一端的类将来创建的对象如果是双向关联,就

12、在两端类中各设立属性,用来标记对方将来创建的对象。如果关联中对方类的多重性是1,那么可在本方设立一个指向对方对象的指针,或设立一个记录对方对象引用的属性。如果对方类的多重性大于1,那么可在本方设立一个指向对方对象的指针集合或引用集合。若关联的某端有角色名,最好把其作为另一端类的属性名,以访问与角色名相邻的类。,33,(6)调整与完善属性,按照语法:可见性 属性名:类型= 初始值 对属性的定义进行完善。 每一个属性或者包含单个值,或者包含作为一个整体的密切相关的一组值,若要给出对属性的性质的约束,如“工龄60”或“0英语成绩100”等,也要看语言是否对其直接支持,否则要在算法上考虑如何实现。,3

13、4,为了维护数据的完整性,必须要考虑需要一起更新的多个相关联的数据值。特别是,当基本的数据发生变化时,必须更新导出的属性。通过下列方法可以做到这一点:1)显式的代码因为每一个导出属性是根据一个或多个基本对象属性定义的,更新导出属性的一种方法是,在更新基本对象属性的操作中插入更新导出属性的代码。这种附加的代码将明确地更新依赖基本对象属性的导出属性,使得基本属性与导出属性的值同步。2)批处理性的重计算当基本数据以批处理的方式改变时,可能在所有的基本数值改变之后,再重新计算所有的导出属性的值。3)触发器凡是依赖基本属性的属性,都必须将它自己向基本属性注册。当基本属性的值被更新时,由专门设置的触发器更

14、新导出属性的值。,35,(7)构造和优化算法,对于需要设计的操作,要从如下几方面进行详细地定义:(1) 按照定义操作的格式: 可见性 操作名(参数列表):返回类型 完善操作的定义。(2)从问题域的角度,根据其责任,考虑实现操作的算法,即对象是怎样提供操作的。(3)若操作有前后置条件或不变式,考虑编程语言是否予以支持。若不支持,在操作的方法中要予以实现。(4)建议进一步地分析特定类的对象相关的所有交互图,找出其所有与之相关的消息。一个对象所要响应的每个消息都要由该对象的操作处理,其中的一个操作也可能要使用其他操作。如果类拥有状态图,还可根据内部转换以及外部转换上的动作,设计算法的详细逻辑。可用自

15、然语言或进行了一定结构化的自然语言描述算法,也可以使用程序框图或活动图描述算法。在算法中还要考虑对例外和特殊情况的处理。如考虑对输入错误、来自中间件或其它软硬件的错误的消息以及其它例外情况的处理。 在系统较为复杂或需要处理大批量的数据的情况下,若系统在性能上有要求,就要对系统的体系结构和算法进行优化。,36,(8)决定对象间的可访问性(M)从类A的对象到类B的对象有4种访问性属性可见性:B是A的一个属性(关联、聚合)class A ;B b;参数可见性:B的对象是A的一个方法的参数(依赖)A.amethod(B b) /间接地找到一个对象,并赋给b。局部声明可见性:B的对象是在A的一个方法中声

16、明的一个局部变量(依赖)class A:amethod ; B b;全局可见性:B的对象在某种程度上全局可见(依赖)声明B的全局实例变量对于后三种情况而言,从类A到类B间存在着依赖关系,在程序运行期间A的对象与B的对象存在着临时性的连接(临时链),而第一种情况中的链是由从类A到类B间的关联实例化而来的。,37,(9) 定义对象实例,在逻辑上,一个类是对一组对象的抽象描述。在物理上,一个类所创建的各对象,要么在内存中,要么在外存中。在内存中创建的一个对象,用一个变量记录它的标识。在外存中的对象,可能保存在一个文件中,也可能保存在一个数据库表中。在OOD中,根据不同的实现条件和实现策略,可以按如下

17、的方式定义对象:(1) 用相应的类定义内存中的全局性对象,包括静态声明和动态创建两种方式。可以一次针对一个对象定义一个变量,也可以成批地定义对象。例如,可以定义一个数组,它的每个元素是一个对象变量,以此来成批地定义对象。(2)当系统需要通过从外存读取数据来创建一个对象时 ,先创建该对象,再从外存中读取这个对象数据,把数据赋值给对象的相应属性。按照一定的策略,内存中的永久对象要保存到外存中,请参看数据管理部分。无论那种方式,都需要在在OOD文档中加以说明。按如下格式在类描述模板的定义对象部分进行描述:处理机:,;内存对象:(n元数组);外存对象:;,38,(10)其它在OOD的问题域部分应该根据

18、具体问题考虑使用设计模式。 在OOD的问题域部分,根据情况,还有一些其它需要考虑的问题。例如,考虑加入进行输入数据验证这样的类;考虑对来自中间件或其它软硬件的错误进行处理的类,以及对其它例外情况进行处理的类。 有些作法是在OOD阶段不把这样的读写属性的操作放在类中,而认为这是一种约定,编程人员能理解。有些作法也不把诸如创建和复制对象这样的操作放在OOD模型中。 注意:包容器/集合类(如JAVA的Vector,Hash table),是已经预定义的类库的一部分,一般不在类图中重新定义,可进行引用或继承。不要错把包容器/集合类中方法(如JAVA的find),在其他类中重新定义,可进行引用或继承。,

19、39,10.1 什么是人机交互部分,第10章 人机交互部分的设计,40,控制接口部分,问题域 部分,数据管理部分,把人机交互部分作为系统中一个独立的组成部分,进行分析和设计,有利于隔离界面支持系统的变化对问题域部分的影响,10.1 什么是人机交互部分,第10章 人机交互部分的设计,41,10.2 人机交互部分的需求分析,对使用系统的人进行分析 以便设计出适合其特点的交互方式和界面表现形式; 对人和机器的交互过程进行分析 核心问题是人如何命令系统,以及系统如何向人提交信息。,1、分析与系统交互的人人员参与者 人对界面的需求,不仅在于人机交互的内容,而且在于他们对界面表现形式、风格等方面的爱好。

20、前者是客观需求,对谁都一样;后者是主观需求,因人而异。 (1)列举所有的人员参与者 (2)调查研究 (3)区分人员类型 (4)统计(或估算)各类人员的比例 (5)了解使用者的主观需求(6) 按照一定的准则进行折中与均衡,42,2、从use case分析人机交互use case的构成 参与者的行为和系统行为按时序交替出现,左右分明。形成交叉排列的段落。 每个段落至少含有一个输入语句或输出语句; 有若干纯属参与者自身或系统自身的行为陈述; 可能包含一些控制语句或括号。抽取方法: 删除所有与输入、输出无关的语句和不再包含任何内容的控制语句与括号, 剩下的就是对一个参与者(人)使用一项系统功能时的人机

21、交互描述。,43,收款员收款(use case) 输入开始本次收款的命令; 作好收款准备,应收款总数 置为0,输出提示信息; for 顾客选购的每种商品 do输入商品编号;if 此种商品多于一件 then输入商品数量end if; 检索商品名称及单价; 货架商品数减去售出数; if 货架商品数低于下限 then通知供货员请求上货 end if; 计算本种商品总价并打印编号、 名称、数量、单价、总价; 总价累加到应收款总数; end for; 打印应收款总数; 输入顾客交来的款数; 计算应找回的款数, 打印以上两个数目, 收款数计入账册。(a)一个use case的例子,收款员收款(人机交互)

22、输入开始本次收款的命令; 输出提示信息; for 顾客选购的每种商品输入商品编号;if 此种商品多于一件 then输入商品数量end if; 打印商品编号、名称、 数量、单价、总价; end for; 打印应收款总数 输入顾客交来的款数 打印交款数及找回款数;(b)人机交互描述,从use case提取人机交互描述,44,10.3 人机界面的设计准则易学、易用、操作方便 尽量保持一致性 及时提供有意义的反馈 使用户的注意力集中在当前的任务上而不是界面上 尽量减少用户的记忆 具有语境敏感的帮助功能 减少重复的输入和操作 对用户的操作具有容错性 ,如UNDO 防止灾难性的错误 其它:如艺术性、趣味性

23、、风格、视感等,45,一、输入与输出设计(1)输入的细化 输入步骤的细化 输入设备的选择 输入信息表现形式的选择(命令,数据)(2)输出的细化 输出步骤的细化 输出设备的选择 输出信息表现形式的选择,9.4 人机界面的OO设计,46,二、命令的组织不受欢迎的命令组织方式: (1)一条命令含有大量的参数和任选项 (2)系统有大量命令,不加任何组织和引导基本命令:使用一项独立的系统功能的命令。(提取后的用况) 命令步:在执行一条基本命令的交互过程中所包含的具体输入步骤。 高层命令:如果一条命令是在另一条命令的引导下被选用的,则后者称作前者的高层命令。命令的组织措施分解与组合 (1)分解:将一条含有

24、许多参数和选项的命令分解为若干命令步 (2)组合:将基本命令组织成高层命令,从高层命令引向基本命令,47,(a) 线性结构,基本命令及其 命令步的结构,48,高层命令及其结构,按功能组织:如文件下有:创建、打开、关闭、打印、删除等。 按子系统组织:如文本编辑子系统、编译自系统。,49,两层命令之间的输出信息结构,反馈信息,处理结果,提示信息,反馈信息,处理结果,处理结果,提示信息,提示信息,处理结果,提示信息,提示信息,50,反馈信息:需较长时间执行命令。,处理结果,可能不需要。,提示信息:对下一步可输入的命令的提示。,51,在建立命令树时,应遵循如下策略:把使用最频繁的命令放在前面,按照用户

25、的工作步骤进行排列。 在命令中发现整体-部分模式,以帮助对命令的组织与分块。 每层命令的个数应遵循7+2原则,命令的层次深度尽量要控制在三层以内。,52,1、选择界面支持系统(窗口系统、图形用户界面、可视化编程环境) 2、设计报表及报告.对要生成的报表和报告格式等进行设计。每一种报表或报告应对应于一个类。3、设计诸如安全/登录、设置和业务功能之类的窗口。 每一种窗口对应于一个类。 4、在窗口中,按照命令的逻辑层次,部署所需要的元素,如菜单、工作区和对话框等。窗口中的部件元素对应窗口类的部分类,部分类与窗口类形成聚合关系。 5发现窗口类间的共性以及部件类间的共性,定义较一般的窗口类和部件类,分别

26、形成窗口类间以及部件类间的泛化关系。 6.用类的属性表示窗口或部件的静态特征,如尺寸、位置、颜色和选项等。 7.用操作表示窗口或部件的动态特征,如选中、移动和滚屏等。有的操作要涉及到问题域中的类。 8.发现界面类之间的联系,在其间建立关联。必要时,进一步地绘制用户与系统会话的顺序图。,三、用OO概念表达所有的界面成分*,53,9. 建立界面类与问题域类之间的联系。有些界面对象要与问题域中的对象进行通讯,故要对二者之间的通讯进行设计。在具体设计时,设计人员应该注意以下几点: (a)人机界面只负责输入与输出和窗口更新这样的工作,并把所有面向问题域部分的请求转发给问题域部分,即在界面对象中不应该对业

27、务逻辑进行处理。(b)一种常见的作法是,问题域部分的对象不应该主动发起与界面部分对象之间的通讯,而只能对界面部分对象进行响应,也就是说,只有界面部分的对象才能访问问题域部分的对象。通常把界面对象向问题域部分对象传输的信息或发布命令看作是“请求”,而把从问题域部分对象向界面部分对象传输的信息看作是“回应”或“通知”。(c)尽量减少界面部分与问题域部分的耦合。由于界面是易变的,从易于维护和易于复用的角度出发,问题域部分和界面部分应该是低耦合的。,也可以通过在人机交互部分和问题域部分之间增加控制器或协调类的方式解决这种问题,如可采用下面将要讲述的出版-订阅模式,还有一些相关的模式,54,例题:出版-

28、订阅模式(观察者模式),解决问题域中的对象 对界面层对象的访问问题。,55,Observer (观察者)模式用于定义对象间的一对多的依赖关系,当一个对象发生变化并对外发布消息时,所有依赖它的对象都将得到通知并可进行更新。后一句话中的那组对象是观察者,它们要在发布消息的对象中进行登记(订阅),以便在发布消息时能找到它们。该模式也称为发布订阅(Publish-Subscribe)模式。,采用观察者模式,要在发布消息的对象中设立增减观察者对象的操作,对于观察者对象要建立一个统一的用于接收消息的接口。 益处:观察者发生变化时,只须在发布消息的对象中增减对象标识即可,而不需进行其他改动,56,Observer模式的通用结构图,57,视图帮助者模式,58,例题,59,界面类图局部示例,由于复用类的子类可能要使用祖先类的操作和属性,这样就出现了在图上看不到祖先类的操作和属性。解决问题的方法是,把所需要的祖先类的操作和属性,在标有复用的类中重新列出来,并加上标记,如“”,表明这些属性和操作是继承而来的,不需要在本系统中实现,这样做仅仅是为了使用方便。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报