1、1,第八章 面向对象设计 (Object-Oriented Design), 1 面向对象设计的准则 2 启发规则 3 软件重用 4 系统分解:设计问题域子系统;设计人机交互子系统;设计任务管理子系统;设计数据管理子系统 5 设计类中的服务 6 设计关联 7 设计优化 8 小结,2,传统方法将分析模型转换为设计,数据字典,状态迁移图,过程设计,接口设计,体系结构设计,数据设计,3,OO方法将分析模型转换为设计,用例,对象-行为模型,服务设计,消息设计,类及对象设计,子系统设计,4,1. OOD准则:优秀软件设计的一个重要特点是容易维护,回顾:SD准则包括 Modularization Abst
2、raction Information hiding Module independence,对于 OOD有类似的准则:1、Module = Object,1. OOD准则,5,1. OOD准则, Procedure abstraction: 在SD中已讨论, Data abstraction: Class即是一种抽象数据类型。外界无须知道实现方法就可按照类协议(class description protocol)* 使用class中定义的数据。, Parameter abstraction: 将数据类型作为参数处理。,* Class description protocol : The c
3、omplete definition of all properties, features, and methods that are descriptive of any object that is an instance of a class. Timothy Budd An Introduction to Object-Oriented Programming Addison-Wesley Publishing Company, Inc. 1991,2、Abstraction:抽出事物的本质特性, 暂不考虑其细节,使设计从具体实现方法中超脱。,6,1. OOD准则,例:C+ 中的“模
4、板”(template),template class array_n private :T items n ; / 定义了T类型的向量元素共n个 ; main ( ) array_n w ; /w是有1000个元素的复向量 ,7,1. OOD准则,3、Information hiding = Encapsulation of object, 继承耦合(inheritance coupling):要求 Parent class IS_A child class as high as possible,8,1. OOD准则, 一般-特殊内聚(general-particular cohesion
5、):High g-p cohesion High inheritance coupling,5、Cohesion: 服务内聚(service cohesion):一个服务只完成一个功能。, 类内聚(class cohesion):一个类只有一个用途,否则分解之。,6、Reusability(详见3),9,2. 启发规则,1、设计结果清晰易懂,应做到: 用词一致 按习惯用法命名。不同classes中相似的methods最好取同一名字。 使用已有的protocol。 尽量减少message模式的数目。 避免模糊定义。,2、一般-特殊结构的深度应适当(约100个classes,则设计72层),10,
6、2. 启发规则,3、设计简单的class(定义不超过一页纸或两屏)。应注意: 避免过多attributes; 能用简单的语句描述一个class的任务; objects之间合作关系要简单;避免过多methods( 7个)。,问题:设计出大量的classes,使结构复杂度增加。 解决:划分主题,提高可理解性。,4、使用简单的protocol,减少message 中传递的 parameters,5、使用简单的method(CASE 可考虑用 inheritance替代)。,6、把设计变动减至最小。,11,理想的设计变动情况,12,1、概念: 知识重用(例如软件工程知识的重用), 方法和标准重用(例如
7、OO方法和国家规定的软件开发规范的重用), 软件成分的重用,3. 软件重用 (Software Reuse),源码剪贴 无法溯源,无配置管理,Include 修改后所有包含了此段代码的程序都须重新编译。,Inheritance 无须改动原有代码,想象一下,stdio.h 被改动之后,重用软件成分有三个级别: 代码重用:,13,3. 软件重用, 设计重用 当移植系统时, 分析重用 当需求未变,而系统结构改变时(例如将HDIS改为OO实现),2、重用效果的衡量:, 额外代价: 创建可重用成分的专门投资 多花2 4倍时间测试以保证质量 构件库的建立与维护需要投资 以上投资将分摊到重用这些构件的新系统
8、成本中。重用次数越多,分摊成本越少。,14,3. 软件重用,记:Lt = Total length of code ( # of lines) Ln = Length of new code Lr = Length of reused code Et 、En、 Er are the corresponding efforts ( # of m-d), 重用率(Reusability)与生产率(Productivity),Productivity,Reusability =,开发代码的生产率,重用新代码的生产率,15,3. 软件重用,重用技术:指利用可重用的构件开发软件的技术,及开发可重用软件的
9、技术。, 软件组合技术:, 底层部件库法(Bottom-up compositional reuse) : 从可重用的代码部件库(reuse repository)中选用部件,组合成软件。,A:是,前提条件为CnCr ,即重用比新开发效率高。,Q:是否R 越高P就越高?,16,Lucent Technologies initiated a companywide program to reuse software components (McClure 1997). As a consequence, the Workstation Software Development Departmen
10、t formed a Reuse Council to devise a strategy for selecting candidate components for its reuse repository. The Council was comprised of seven people, representing all groups in the department. The Council created an inventory of components and formed a matrix with the features of all past and planne
11、d projects. Then, each feature was rated in terms of whether it had been implemented and was still needed, had been implemented but was no longer needed, or had not been implemented but was still needed. Those features that were needed and were common to more than one project were targeted for reuse
12、. In fact, some were redesigned to make them more reusable. The Council met every week for 2 hours to make component selections, inspect design documentation for those components already in the repository, and to monitor the levels of reuse in the departments projects.,3. 软件重用,例:, 上层组合法:完整程序的组合,17,3
13、. 软件重用, 软件生成技术:按照形式化的软件功能描述和一定的生成机理,由生成器系统(generator system)自动生成目标程序。重用的是generator 的代码规则, OO重用技术:Class component的重用, 类构件(Class component):,可重用的软构件应具备的特点: 独立、可塑、接口清晰(文档详尽),18,3. 软件重用,重用方式: 实例重用(instance reuse black-box reuse): 创建class的不同instances,通过messages完成 不同的任务。是最基本的重用方式。 用几个简单的objects创建出更复杂的clas
14、s, 是实例重用的另一种形式, 继承重用(inheritance reuse): 是一种安全地裁剪已有的class component的方式。, 多态重用(polymorphism reuse): Parent class与child class有相同的对外接口,使 消息连接的复杂度降低。,19,3. 软件重用,注意:有些操作可能会妨碍class component的重用,如 与表示方法有关的操作 与数据结构、大小有关的操作 与外部设备有关的操作 实现算法在将来可能会改进改变的核心操作,解决方法:将这些操作分离出来,作为适配接口(adaptive interface),使class中其它操作通
15、过调用AI而实现。在不同应用环境下,用户只须重新定义AI操作就可以重用class。,20,3. 软件重用,Adaptive Interface还可进一步细分为, 转换接口(transition interface):重用时必须重定义与表示方法、数据结构、硬件等有关的操作 (例如C+中class 里的 pure virtual function), 扩充接口(expansion interface):一个操作可由多种算法实现,若无新算法则继承老算法。,21,3. 软件重用,模式的定义,模式是在特定上下文中遇到的一般性问题的可重用解决方案的概要。建筑师Christopher Alexander:“
16、由三个部分组成的规则,表达了在一个特定上下文、一个问题和一个解决方案之间的关系” 模式是将设计知识文档化并且把这种知识传递给学习设计的人的一种方法。,22,3. 软件重用,设计模式的定义,设计模式是面向对象软件设计经验的总结。 设计模式系统地命名、解释和评价了面向对象系统中的一个重要的和重复出现的设计。 设计模式使人们可以简单方便地复用成功的设计和体系结构。 设计模式描述了在特定场景下使用的解决一般设计问题的类和相互通信的对象。,23,I,P,O,问题域 Application Domain,人机交互 Human- Computer Interface (HCI),任务管理 Task Mana
17、gement,数据管理 Data Management,4. 系 统 分 解,回顾SD:从DFD出发 ,OOD模型分解:,24,4. 系 统 分 解,1、子系统之间的交互方式(collaboration), 客户-供应商(client-server)关系:, 平等伙伴(peer-to-peer)关系:,Client subsystem,Server subsystem,Peer subsystem,Peer subsystem,25,4. 系 统 分 解,2、系统组织方案, 水平层次组织:将系统组织成hierarchy,同一层中的objects相互独立,而上、下层间有 client-serve
18、r关系。, 一个client只能调用其相邻下层的server 封闭式(closed), 一个client可调用其下任一层的server 开放式(open)优点:高效; 缺点:修改影响面广,26,HCI,典型应用系统的组织结构,应 用 软 件 包,操 作 系 统,计 算 机 硬 件,人机对 话控制,仿真 软件包,图形 处理,窗口图形,屏幕图形,象素图形,4. 系 统 分 解, 垂直块组织:将系统垂直分解成若干独立的子系统,一个子系统相当于一块,每块提供一种类型的服务。,27,4. 系 统 分 解,3、四种子系统的设计, 问题域子系统:基于OOA建立的object model,进行补充修改。, 调
19、整需求, 重用class: 选出可用的class,标出与本问题无关 的 attributes 和 methods 派生出child class,标出继承的attributes 和 methods 修改关联, 组合class:通过引入root class完成,用于建立public protocol。, 调整inheritance。,28,(1)使用多重继承机制:避免出现属性及服务的命名冲突。,窄菱形模式,阔菱形模式,29,(2)使用单重继承机制:把多重继承结构简化成单一的单继承层次结构。在多重继承结构中的某些继承关系,经简化后将不再存在,这需要在各个具体类中重复定义某些属性和服务。,30,ATM
20、系统实例,ATM系统问题域子系统的结构,31, HCI子系统:好的包装,4. 系 统 分 解, 设计准则:, 一致性: 术语、步骤、操作等始终一致。, 减少步骤:使完成一件任务所需敲键盘、点鼠标、下拉菜单等的次数都减至最少。, 及时提供反馈信息:,提供hot key操作,做一个体贴的status bar, 提供撤销(undo)命令:, 无须记忆:不应要求用户记住某个窗口的信息,然后再用到窗口中 这是系统的责任而不是用户的任务。,仁慈的你如佛祖对众生:回头是岸, 易学:提供HELP、联机参考等。, 富有吸引力,32,1、菜单(menu)按照显示方式正文菜单、图标菜单、正文和图标混合菜单,如“开始
21、”菜单。,用户界面的基本类型,从用户角度出发,用户界面设计的类型主要有问题描述语言,数据表格、图形与图标、菜单、对话框及窗口等。每一种类型都有不同的特点和性能。讨论以下类型:菜单、图象、对话框和窗口。,按屏幕位置和操作风格固定位置、浮动位置(弹出)、下拉式、嵌入式,混合菜单,33,2、图 像在用户界面中,加入丰富多彩的画面,将能够更加形象地为用户提供有用的信息,以达到可视化的目的。主要的处理操作有:图像的隐蔽和再现、屏幕滚动和图案显示、动画等。,2、图 像,34,3、对话框对话框是在需要时,显示在屏幕上一个矩形区域内的图形和正文信息。通过对话,实现系统和用户之间的通信。对话框显示的方式与弹出式
22、菜单类似,即瞬时弹出。同时,系统还应将对话框所覆盖的原图像进行保存,以便在对话结束后能立即恢复。有三种对话形式:,必须回答式 无需回答式 警告式,必须回答式对话框,无需回答式对话框,警告式对话框,3、对话框,35,4、窗口(window)图形学中称为视图区(Viewport),视为虚拟屏幕。一个实用窗口,可包含部件:,菜单区(menu bar) 图标区(icon bar)标题区(title bar) 移动区(move bar)大小区(size bar) 退出区(quit bar) 用户工作区(users work bar)横向滚动区(horizontal scroll bar) 纵向滚动区(v
23、ertical scroll bar),4、窗口,36,4、窗口(window)下图描述了一个包括多个部件的窗口.,图3.61,37,4. 系 统 分 解, 设计策略, 设计HCI类:例如VC提供的MFC类库(Microsoft Foundation Class Library), 将用户分类(按技能、职务等), 描述用户的类型、水平、使用目的、其它特征(如年龄、性别、习惯等),写出操作脚本, 设计命令层次:注意同用户熟悉的方式( 如windows界面)尽量保持一致. 次序、深度、宽度调整适当,38,4. 系 统 分 解, 任务管理子系统:基于OOA建立的dynamic model, 分析并发
24、性:, 若两个objects之间无交互行为,或它们同时接受events,则它们本质上是并发的(synchronous), 考察event flow diagram,找出没有并发对象的路径(称为控制线),每条对应一个任务(task,亦称process), 不同的tasks对应必须同时发生的不同行为,39,4. 系 统 分 解, 确定task类型,并分配给适当的软硬件去执行, 事件驱动型(event-driven):主要完成通信工作。event = 数据到达的 interrupt, 时钟驱动型(clock-driven):完成周期性工作。, 优先型(priority):将high priority
25、或 low priority的任务专门分离出来先做或后做。, 关键任务(key task):指关系系统成败的处理,要求高可靠性,应分离考虑,严格测试。, 协调任务(coordinator):当系统中存在三个以上tasks时,应增设一个协调任务,用于封装不同tasks之间的协调控制。,40,4. 系 统 分 解, 数据管理子系统:, 选择管理模式 文件管理(file manager)系统 关系数据库(Relational Data Base)管理系统 面向对象数据库(OODB)管理系统,采用何种管理模式,需综合考虑: 非技术因素 数据管理系统的成熟程度和先进性 价格 开发队伍的技术背景 与其他系
26、统的关系,41,4. 系 统 分 解,技术因素(a)文件系统 优点:可存储任何类型的 数据 缺点 :操作低级;数据操纵功能贫乏;缺少数据完整 性支持;缺少多用户及多应用共享、故障恢复、事务处理等功能。 适应的情况:数据类型复杂,对数据存取、数据共享、数据完整性维护、故障恢复、事务处理等功能要求不高的应用系统。 不适应的情况:数据操纵复杂、多样,数据共享及数据完整性维护要求较高的应用系统。,42,4. 系 统 分 解,(b)RDBMS 优点:对数据存取、数据共享、数据完整性维护、故障恢复、事务处理等功能的支持能力强。缺点 :对数据模式的限制较多。适应的情况:需大量保存和管理数据的应用系统。不适应
27、的情况:图形、图象、音频、视频等多媒体数据和经过压缩处理的数据。(b)OODBMS,43,4. 系 统 分 解,(a) 文件系统, 设计数据格式及相应的服务,应用系统,对象,对象,对象,数据接口,文件系统,44,4. 系 统 分 解,1 、对象实例在内存空间和文件空间的存储映像。 方式1:,内 存 空 间,对象1,对象2,对象n,数据接口,文 件 系 统,类A,实例化,文件A,45,4. 系 统 分 解,方式2:,内 存 空 间,对象,数据接口,文 件 系 统,类A,实例化,文件A,46,4. 系 统 分 解,2 、对象存放策略。 基本策略:把由每个类直接定义,并需要永久存储的全部对象实例,存
28、放在一个文件中;其中每个对象实例的全部属性作为一个存储单元,占用该文件的一个记录。 对一般特殊结构:(1) 一般类直接创造的对象实例和特殊类创造的对象实例分别使用不同的文件,以保持文件中每个记录是等长的,并且每个记录中没有空余不用的字节。(2) 各个类定义的所有对象实例都存放在同一文件中,按属性的最大集合定义文件的记录结构。,47,4. 系 统 分 解,3、提高存放和检索对象数据的效率。 对象名称呈线性规律的情况:例如数组,由数组名称和下标确定所对应的文件记录。 对象关键字呈线性规律的情况:例如银行帐户号码,按关键字的顺序安排对象所对应的文件记录。 对象名称或关键字可以比较和排序的情况:(1)
29、 按关键字的顺序安排文件中记录的位置,检索时采用折半查找法直接查找文件记录。(2)建立按对象名称或关键字排序的索引表。 其他情况:散列表、倒排表、二叉排序树等。,48,4. 系 统 分 解,4、设计数据接口部分的对象类。此对象类(对象存取器)为所有其他对象提供基本保存与恢复功能。,类名-文件名,入口参数: 要求保存的对象 对象关键字的值 所属类,49,4. 系 统 分 解,5、问题域部分的修改。对每个需要长久保存其对象实例的对象类,增加一个属性“类名”;增加一个“请求保存”服务和“请求恢复”服务。系统保存或恢复对象的时刻:系统每次启动; 系统停止运行之前; 系统首次使用一个未曾恢复过的永久对象
30、;与其他应用系统共享对象数据。,50,4. 系 统 分 解,51,4. 系 统 分 解,(b) RDBMS, 设计数据格式及相应的服务,应用系统,对象,对象,对象,数据接口,RDBMS,RDB,52,4. 系 统 分 解,1 、对象实例在内存空间和文件空间的存储映像。 方式1:,内 存 空 间,对象1,对象2,对象n,数据接口,数据库,类A,实例化,RDBMS,53,4. 系 统 分 解,方式2:,内 存 空 间,对象,数据接口,数据库,类A,实例化,RDBMS,54,4. 系 统 分 解,使用RDBMS的情况:对象可能非映射式地使用库中的数据。,应用系统,对象,对象,对象,RDBMS,RDB
31、,提供数据,例:已有户籍管理数据库,现需开发一个人口统计系统。仅建立一个“人口统计员”对象。不负责数据的创建、维护与更新。,可能需要数据格式转换。,55,4. 系 统 分 解,对象在数据库中的存放策略 对象数据的规范化:满足1NF,2NF,3NF 修改类图: 保持原先的类图不变,按规范化的结果定义 数据库表; 按照规范化的要求修改类图,1NF类的非原子属性改为原子属性。 确定关键字:人为的给类增加一个可以单独做关键字的属性,例如:职工的编号。 从类图到数据库的映射:对其中每个要在数据库中存储其对象实例的类,建立一张数据库表,类的每个属性(本类定义的或继承的)对应表的一个属性,从名称到数据类型完
32、全相同,其中一组属性为关键字。例如:,56,4. 系 统 分 解,对一般特殊结构的处理: 建立客车、货车、客货两用车的数据库表。,57,4. 系 统 分 解,对关联的处理:一对一联系:一个表以相应的属性组作为外键,另一个表以同样的属性组作为主键。一对多联系:A表以B表的主键作为外键。多对多联系:转换为两个一对多联系。,01 1,* 1,58,4. 系 统 分 解,4 数据接口部分对象类的设计和问题域部分的修改,59,4. 系 统 分 解,(c) 面向对象数据库管理系统 数据格式: 扩展的关系数据库途径:使用与关系数据库管理系统相同的方法。 扩展的面向对象程序设计语言途径:不需要规范化属性的步骤
33、,因为数据库管理系统本身具有把对象值映射成存储值的功能。 相应的服务: 扩展的关系数据库途径:与使用关系数据库管理系统时方法相同。 扩展的面向对象程序设计语言途径:无须增加服务,这种数据库管理系统已经给每个对象提供了“存储自己”的行为。,60,5. 设计类中的服务 细化object model中的 methods,1、确立服务, 从 dynamic model出发:Event flow diagram中, Event = message ;, 接受message 的object 必有对应的 method;, Method 改变 status(即 attributes),并完成 action。,
34、61,5. 设计类中的服务,则算法应有DO_CASE型控制, 从function model出发:,DFD的一般结构是,注意:Action (即算法)与status 有关。例如:不同status接受同一个 event 时,其action不同 ,62,5. 设计类中的服务, 若 Process=从Input Flow中抽取一个值,则,63,5. 设计类中的服务, 对照DFD与Class-&-Object图,若一个process涉及多个classes,则必须判断它属于哪一个class。例如:,若Process 改变了 Receiver,则,又如:从关联上看,process所涉及的所有classes
35、中,处于中心地位的class,一般拥有该process。,64,5. 设计类中的服务,2、设计实现方法, 算法设计:要求做到易修改,并且复杂度低(即效率高) 易理解,易实现。, 数据结构设计:需要考虑具体的物理结构的选择。, 新添用于存放内部处理中间结果的class;引入新的低层操作,进一步细化。,65,6. 设计关联,1、单向关联 例:, 由雇员找其所属公司,则设雇主为其属性,即一单向指针, 由公司找其下属某一雇员,则有两种方法:,方法1:遍历所有雇员,找雇主匹配且满足特征的雇员。(省空间),66,6. 设计关联,方法2:设公司的属性雇员为一指针集。(快速),2、双向关联,方法1:将上述两种
36、单向关联结合使用,方法2:另设关联类(特别适用于链属性),67,7. 优 化,1、确定优先级:必须站在全局高度确定各项质量指标的优先级,在优化设计时制定折衷方案。切忌各子系统自以为是,导致最终优化目标对立。最常见的情况是在效率与清晰性之间的折衷。,2、提高效率的技术, 增加关联(类),例:设某公司有2000名雇员,平均每名雇员会10种技能,其中有5人精通日语,现要查询公司中会讲日语的雇员是哪些人,68,7. 优化,方法1:嵌套查询 遍历雇员2000次,而对每个雇员遍历技能10次。命中率为1/4000。,方法2:用Hash Table实现技能,使“会讲日语”对应唯一的技能对象,则命中率上升为1/
37、400。,方法3:增加一个额外的限定关联“精通语言”,即可立刻查得结果。,69,7. 优化, 调整查询次序,优化算法例如公司有5名会日语的雇员,有200名会法语的雇员。现要找日、法语均会的雇员,则应先找的 雇员,再从中找 的雇员。,会日语,会法语, 保留内部中间过程产生的派生属性。,3、调整继承关系, 向上归纳, 向下派生,建立这样的索引必然多占空间,而且基关联改变时也必须相应地修改索引。因此,应只给那些经常执行并且开销大、命中率低的查询建立索引。,70,71,72,7. 优化,例:实现 Stack 方法1:从 List 派生push = last + addpop = last + remo
38、ve 问题:Stack.first 也是合法的。, 利用委托(commitment),方法2:把 List 作为 Stack 的一个 attribute ,称为 commitment。这种方法比较安全(Stack.first 为非法)。,73,8. 小结,1、面向对象设计就是用面向对象观点建立求解空间模型的过程。通过面向对象分析得出的问题域模型为建立求解空间模型奠定了坚实基础。分析与设计本质上是一个多次反复迭代的过程,而面向对象分析与面向对象设计的界限尤其模糊。,2、优秀设计是使得目标系统在其整个生命周期中总开销最小的设计。,3、重用是提高软件生产率和目标系统质量的重要途径。,4、大多数求解空间模型,在逻辑上由4大部分组成。问题域子系统、人机交互子系统、任务管理子系统和数据管理子系统的设计方法。类中服务的设计方法及实现关联的策略。,