第六章面向对象的设计方法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(a)先创建一些具体类 (b) 归纳出抽象类; (c) 进一步具体化; (d)再次归纳 设计类继承的例子
6.10 实例 例1 C++类库管理系统的分析与设计
面向对象分析 需求陈述 建立对象模型 确定类与对象
分析类与对象之间的关系
面向对象设计 设计类库结构 设计问题域子系统 设计人机交互子系统 设计其他类
OOA阶段建立的类库管 理系统对象模型
类条目 类名 父类列表 成员函数列表 数据成员列表 设置类名 添加父类 删除父类 更改父类 添加成员函数 删除成员函数 更改成员函数 添加数据成员 删除数据成员 更改数据成员
类库
库名 类条目列表 插入类条目 删除类条目 存储类库 读出类库 类条目 类名 父类列表 成员函数列表 数据成员列表 设置类名 添加父类 删除父类 …… * 成员函数 函数名 访问权 虚基类标志 返回值类型 参数 代码 * 数据成员 数据名 访问权 数据类型
典型的面向对象的设计模型
系统分解
6.2 系统分解
● 子系统间交互方式
● 客户—供应商关系(Client_supplier)
作为客户的子系统调用作为供应商的子系统,后者完成某些服务 工作并返回结果。
● 平等伙伴关系(peer_to_peer)
每个子系统都可以调用其他子系统。
request
client subsystem
第六章
6.1 概述
面向对象设计
6.6 设计数据管理子系统
6.2 系统分解
6.3 设计问题域子系统 6.4 设计人机交互子系统 6.5 设计任务管理子系统
6.7 设计类中的服务
6.8 设计关联 6.9 设计优化 6.10 例子
概述
6.1 概述
● 任务
● 根据已经建立的分析模型,运用面向对象的技术,进行系统 的软件设计。
面向对象分析 1.需求陈述 简化的C++类库管理系统需求描述: 管理用C++语言定义的类 用户能够方便地向类库中添加新类,并建立新类与库中原有类的关系
用户能够通过类名从库中查询出指定的类
用户能够查看或修改与指定类有关的信息(数据成员,成员函数等) 用户能够从类中删除指定的类
用户能够在浏览窗中方便、快速地浏览当前类的父类和子类
●数据和过程被封装为类、对象的属性和操作;接口被封装为 对象间的消息;体系结构的设计则表现为具有控制流程的对象 间的协作。 ● 通常包括系统设计和对象设计。系统设计确定实现系统的策 略和高层结构;对象设计确定类、关联、接口形式和实现服务 的算法。这两者的界限模糊。
系统分解
6.2 系统分解
问题域子系统:负责直接实现用户的需求 人机交互子系统:负责用户界面 任务管理子系统:负责控制和协调并发任务 数据管理子系统:负责对象的存储和检索
关联
6.8 设计关联
● 关联的遍历 单向遍历和双向遍历 ● 实现单向关联 用属性实现单向关联
(a)关联 (b)实现 设置雇主作为雇员的属性(成员变量)
关联
6.8 设计关联
● 实现双向关联 只用属性实现一个方向的关联,当需要反向遍历时就执行一次 正向查找。
两个方向的关联都用属性实现。
用独立的关联对象实现双向关联。
问题域子 系统
6.3 设计问题域子系统
● 调整继承层次 1. 使用多重继承机制 避免出现属性及服务的命名冲突
• 窄菱形模式
•阔菱形模式
问题域子 系统
6.3 设计问题域子系统
● 调整继承层次 2. 使用单继承机制 将多继承调整为单继承
问题域子 系统
6.3 设计问题域子系统
● ATM系统 将问题域子系统划分成:ATM站子系统、中央计算机子系统、分行计 算机子系统 。
优化
6.9 设计优化
● 确定优先级 系统的各项质量指标并不是同等重要的,设计人员必须确定各项质量 指标的相对重要性(即确定优先级),以便在优化设计时制定折衷方案
● 提高效率的几项技术 增加冗余关联以提高访问效率 调整查询次序 保留派生属性
优化
假设公司有2000雇员,平均每名雇员会10种技能,则查找会讲英语的所有 雇员需要遍历2000雇员,对每个雇员遍历10个技能。
● 设计人机交互类
任务管理
6.5 设计任务管理子系统
●分析并发性 如果两个对象彼此间不存在交互,或者它们同时接受事件,则这两个 对象在本质上是并发的。将若干非并发的对象归并到一条控制线中。 控制线:一条遍及状态图集合的路径,在这条路经上每次只有一个对 象是活动的。用任务(进程)实现控制线。
●设计任务管理子系统 确定各类任务(事件驱动型任务、时钟驱动型任务、优先任务、关键 任务和协调任务等)并把任务分配给适当的硬件或软件去执行。
数据管理
6.6 设计数据管理子系统
● 数据库 ● 类和关联映射到数据库表
数据管理
6.6 设计数据管理子系统
● 数据库 ● 类和关系映射到数据库表
数据管理
6.6 设计数据管理子系统
● 数据库 ● 类和关系映射到数据库表
数据管理
6.6 设计数据管理子系统
● 数据库 ● 类和关系映射到数据库表
数据管理
人机交互
6.4 设计人机交互子系统
在面向对象分析中已经对用户界面进行了初步分析,在面向对象设计 中,需要确定人机交互的细节。 ● 分类用户 按技能水平分类(新手/初级/中级/高级)。 按职务分类(总经理/经理/职员)。 按所属集团分类(职员/顾客)。 ● 描述用户 应该仔细了解将来使用系统的每类用户的情况,把获得的下列各项 信息记录下来。 · 用户类型。 · 使用系统欲达到的目的。 · 特征(年龄、性别、受教育程度、限制因素等)。 · 关键的成功因素(需求、爱好、习惯等)。 · 技能水平。 · 完成本职工作的脚本。
数据采集子系统 数据生成子系统
基础数据维护子系统
系统分解
系统分解
● 依赖性 –PackageA的一些成员引用PackageB的某些成员 –PackageB的变化可能会影响到PackageA
系统分解
部署图
问题域子 系统
6.3 设计问题域子系统
通常,面向对象设计仅需从实现角度对问题域模型作一些补充或修改, 主要是增添、合并或分解类与对象、属性及服务,调整继承关系等。 当问题域子系统过分复杂庞大时,应该把它进一步分解成若干个更小 的子系统。 ● 调整需求 ● 重用已有的类 ● 把问题域类组合在一起 在面向对象设计过程中,设计者往往通过引入一个根类而把问题域类 组合在一起。 ● 增添一般化类以建立协议 ● 调整继承层次
1+
拥 有
用户
*
* 父类
名字 访问权 虚基类标志
6.10 实例
面向对象设计 设计类库结构 设计问题域子系统 设计人机交互子系统 设计其他类
两种可把类条目组织成类库的数据结构: 二叉树
链表
6.10 实例
面向对象设计 设计类库结构 设计问题域子系统 设计人机交互子系统 设计其他类
对对象模型做补充和细化 类条目(ClassEntry) 类库(ClassEntryLink) 父类(ClassBase)、成员函数(ClassFun)和数据成员(ClassData) 类条目缓冲区(ClassEntryBuffer) 当前处理的类,增加了用于与窗口或类链交换数据的成员函数
6.6 设计数据管理子系统
● 数据库 ● 设计相应的服务 被存储对象需要知道访问哪些数据库表,怎样访问所需行,检索对象, 更新对象,ObjectServer类(通知对象保存自身,检索已存储对象)
类中服务
6.7 设计类中的服务
● 确定类中应有的服务 综合考虑对象模型、动态模型和功能模型,动态模型中对象的行为以及功 能模型中的用例,转换成由适当的类所提供的服务 ● 设计实现服务的方法 设计实现服务的算法 算法复杂度 容易理解与容易实现 易修改 选择数据结构 定义内部类和内部操作
(1) 确定事件驱动型任务 是由事件驱动的,可能主要完成通信工作。事件通常表明某些数据 到达的信号。 (2) 确定时钟驱动型任务 每隔一定时间间隔就被触发以执行某些处理。例如,某些设备需要 周期性地获得数据。
(3)确定优先任务
优先任务可以满足高优先级或低优先级的处理需求。 · 高优先级:某些服务具有很高的优先级,为了在严格限定的时间内 完成这种服务,可能需要把这类服务分离成独立的任务。 · 低优先级:有些服务是低优先级的,属于低优先级处理(通常指那些 背景处理)。设计时可能用额外的任务把这样的处理分离出来。 (4) 确定关键任务 关键任务是有关系统成功或失败的关键处理,这类处理通常都有严格的 可靠性要求。在设计中可能需要用额外的任务将这样的处理分离出来。
server subsystem contract
request
peer subsystem request contract contract peer subsystem
总的说来,单向交互比双向交互更容易理解,也更容易设计和修改,因 此应该尽量使用客户—供应商关系。
系统分解
6.2 系统分解
● 组织系统的方案
(5) 确定协调任务
当系统中存在三个以上任务时,就应该增加一个任务,用它作为协调任 务。
(6) 尽量减少任务数
仔细分析和选择每个确实需要的任务,使系统中包含的任务数尽量少。
数据管理
6.6 设计数据管理子系统
● 选择数据存储管理模式 ● 文件系统
● 数据库
● 文件系统 ● 确定文件类别,文件组织方法,设计文件记录格式 ● 设计相应服务(被存储的对象需要知道打开哪些文件,定位到 正确的记录,怎样检索对象,怎样更新对象;ObjectServer类,通知 对象保存自身,检索已存储的对象)
面向对象分析
2.建立对象模型
确定类与对象
分析类与对象之间的关系 类名 类库 属性 库名,类条目列表 方法 插入条目,删除条目,存储,读出类库
类条目
父类
类名,父类列表,成员函数列表,数据 设置更新类名,添加,删除和更改父 成员列表 类,成员函数,数据成员
父类的名字,访问权,虚基类标志
成员函数 函数名,访问权,虚函数标志,返回值 类型,参数,函数代码 数据成员 数据名,访问权,数据类型 用户
● 层次组织
把软件系统组织成一个层次系统,每层是一个子系统。每一层内 所包含的对象,彼此间相互独立,而处于不同层次上的对象,彼此 间往往有关联(客户—供应商关系)。分成:封闭式和开放式。
● 块状组织
把软件系统垂直地分解成若干个相对独立的、弱耦合的子系统, 一个子系统相当于一块,每块提供一种类型的服务。 用户界面子系统 数据查询子系统
具有“联想”浏览功能,可以把当前类的某个子类或父类指定为新的当前 类,从而浏览这个新当前类的子类或父类 用户能查看或修改某个类的指定的成员函数的源代码 本系统是一个简化的多用户系统,每个用户都可以建立自己的类库,不同 类库之间互不干扰 对于用户误操作或错误的输入,能提示并继续稳定运行
系统易学,用户界面应是GUI的
建立索引,添加一个额外的限定关联”精通语言”,就可立即查询到精通某种 语言的雇员。只给经常执行并且开销大,命中率低的查询建立索引。
优化
6.9 设计优化
● 提高效率的几项技术
增加冗余关联以提高访问效率
调整查询次序
保留派生属性
假设希望找出既会说英语又会说日语的所有雇员,公司有200雇员会讲英语, 5人会讲日语,则先查找会讲日语的人,然后再从这些人中查找会讲英语的人。
关联;
பைடு நூலகம்
实现
关联
6.8 设计关联
● 实现双向关联 只用属性实现一个方向的关联,当需要反向遍历时就执行一次 正向查找。
两个方向的关联都用属性实现。
用独立的关联对象实现双向关联。
关联
6.8 设计关联
● 关联对象的实现 一对一关联:作为其中一个对象的属性
一对多关联:作为“多”端对象的一个属性
多对多关联:使用一个独立的类实现链属性,这个类的每个实例表 示一条链及该链的属性。
人机交互
6.4 设计人机交互子系统
● 设计命令层次 (1) 研究现有的人-机交互含义和准则 (2) 确定初始的命令层次 (3) 精化命令层次 · 次序:将常用服务放在最前面,或按照用户习惯的工作步骤排序 · 整体—部分关系:寻找服务中存在的这种模式,以便分组组织服务 · 宽度和深度:命令层次的宽度和深度都不宜过大 · 操作步骤:用尽量少的操作来表达命令,为高级用户提供快捷操作
优化
6.9 设计优化
● 调整继承关系 抽象与具体 一般先创建一些具体用途的类,然后归纳出通用类,再根据需要 派生出具体类,持续不断的演化过程
为提高继承程度而修改类定义
如果在一组相似的类中存在公共的属性和行为,则抽取出来放在 一个共同的祖先类中;有时现有类的属性和行为相似但不相同, 需要对类的定义稍加修改,才能进行抽取。