【文档说明】软件工程面向对象设计课件.ppt,共(93)页,1.739 MB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-44898.html
以下为本文档部分文字说明:
2022/11/241第八章面向对象设计2022/11/242第八章面向对象设计•说明简写为OOD面向对象设计就是用面向对象观点建立求解域模型的过程面向对象设计可以被分为两个阶段•系统设计确定实现系统的策略和目
标系统的高层结构•对象设计确定解空间中的类、关联、接口形式及实现服务的算法2022/11/243第八章面向对象设计•8.1面向对象设计的准则•8.2启发规则•8.3系统分解•8.4设计问题域子系统•8.5设计人-机交互子系统•8.6设计任务管理子系统2022/11/244第八章面向对象设计•8.
7设计数据管理子系统•8.8设计类中的服务•8.9设计关联•8.10设计优化•8.11实例2022/11/2458.1面向对象设计的准则•明确设计决定质量,决定可维护性第四章的几条原理仍然有效,增加了面向对象的特点•模块化•抽象•逐步求精•信息隐藏2022/11/2468.1面向对象设计
的准则•1、模块化•2、抽象•3、信息隐藏•4、弱耦合交互耦合(仅通过消息连接来实现)•尽量降低消息连接的复杂程度•减少对象发送(或接收)的消息数2022/11/2478.1面向对象设计的准则•4、弱耦合继承
耦合•应该越紧密越好•在设计时应该使特殊类尽量多继承并使用其一般化类的属性和服务•5、强内聚服务内聚类内聚一般-特殊内聚(应符合多数人的概念)2022/11/2488.1面向对象设计的准则•6、可重用首先,尽量使用已有的类(包
括开发环境提供的类库,及以往开发类似系统时创建的类)其次,如果确实需要创建新类,则在设计这些新类的协议时,应该考虑将来的可重复使用性2022/11/2498.2启发规则•明确回顾第四章中的七条启发式规则•提高模块独立性•模块规模应该适中•深度
、宽度、扇出和扇入都应适当•模块的作用域应该在控制域之内•力争降低模块接口的复杂程度•设计单入口单出口的模块•模块功能应该可以预测2022/11/24108.2启发规则•一、设计结果应该清晰易懂-为了以后可能的重用服务1、用词一致2、使用已有的协议3、减少消
息模式的数目4、避免模糊的定义2022/11/24118.2启发规则•二、一般-特殊结构的深度应适当应该使类等级中包含的层次数适当(即继承的层数)2022/11/24128.2启发规则•三、设计简单的类1、避免包含过多的属性2、有明确的定义3、尽量简化对象之间的合
作关系4、不要提供太多服务•典型地,一个类提供的公共服务不超过7个2022/11/24138.2启发规则•四、使用简单的协议一般来说,消息中的参数不要超过3个(不是绝对的)•五、使用简单的服务面向对象设计出来的类中的服务通常都很小,一般
只有3~5行源程序语句,可以用仅含一个动词和一个宾语的简单句子描述它的功能2022/11/24148.2启发规则•六、把设计变动减至最小通常,设计的质量越高,设计结果保持不变的时间也越长2022/11/24158.3系统分解•说明大多数系统的面向对象设计模型,在逻辑上都由四大部分组成。这
四大部分对应于组成目标系统的四个子系统•问题域子系统•人-机交互子系统•任务管理子系统•数据管理子系统2022/11/24168.3系统分解•说明面向对象设计模型也包含五个层次•主题层•类-&对象层•结构层•属性层•服务层2022/11/24178.3系统分解2022/
11/24188.3系统分解•一、子系统之间的两种交互方式客户-供应商关系(Client_supplier)•单向交互平等伙伴关系(peer_to_peer)•双向交互•推荐2022/11/24198.3系统分解•二、组织系统的两种方案1、层次组织
•封闭式马尔可夫原则•开放式2、块状组织•这种组织方案把软件系统垂直地分解成若干个相对独立的、弱耦合的子系统,一个子系统相当于一块,每块提供一种类型的服务2022/11/24208.4设计问题域子系统•说明面向对象设计仅需从实现角度对
问题域模型作一些补充或修改,主要是增添、合并或分解类—&—对象、属性及服务,调整继承关系等。当问题域子系统过分复杂庞大时,应该把它进一步分解成若干个更小的子系统2022/11/24218.4设计问题域子系统•
一、调整需求用户需求或外部环境发生了变化分析员对问题域理解不透彻或缺乏领域专家帮助,导致面向对象分析模型不能准确反映用户的真正需求•二、重用已有的类•三、把问题域类组合在一起在面向对象设计过程中,设计者往往通过引入一个根类而把问题域类组合在一起2022/11/24228.4
设计问题域子系统•四、增加一般化类以建立协议•五、ATM系统之例见下页星型拓扑所划分的三个更小的子系统实际上就是分析阶段所划分的三个主题2022/11/2423ATM站中央计算机分行计算机ATM现金兑换卡事务总行事务
事务站号分行代码柜员柜员终端数据库柜员储户信息卡权限电话线电话线2022/11/24248.5设计人-机交互子系统•说明在第四章的基础上从面向对象设计的角度做些补充•一、设计人-机交互界面的准则1、一致性•使用一致的术语,一
致的步骤,一致的动作2、减少步骤2022/11/24258.5设计人-机交互子系统2022/11/24268.5设计人-机交互子系统•一、设计人-机交互界面的准则3、及时提供反馈信息2022/11/24278.5设计人-机交
互子系统•一、设计人-机交互界面的准则4、提供撤销命令5、无须记忆6、易学2022/11/24288.5设计人-机交互子系统2022/11/24298.5设计人-机交互子系统•一、设计人-机交互界面的准则7、富有吸引力2022/11/24308.5设计人-机交互子系统•二、设计人-机交互
界面的策略1、分类用户•分类角度按技能水平分类(新手/初级/中级/高级)按职务分类(总经理/经理/职员)按所属集团分类(职员/顾客)2、描述用户•应该仔细了解将来使用系统的每类用户的情况,把获得的各项信息记录下来2022/11/24312022/11/24322022/
11/24338.5设计人-机交互子系统•二、设计人-机交互界面的策略3、设计命令层次•1)研究现有的人-机交互含义和准则•2)确定初始的命令层次实质上是用过程抽象机制组织起来的、可供选用的服务的表示形式•3)精化命令层次(考虑下述因素)次序»在命令
层的每一部分内把服务排好次序2022/11/24348.5设计人-机交互子系统•二、设计人-机交互界面的策略3、设计命令层次•3)精化命令层次整体-部分关系»有助于在命令层中分组组织服务宽度和深度操作步骤
»应该用尽量少的单击、拖动和击键组合来表达命令,而且应该为高级用户提供简捷的操作方法•4)设计人-机交互类(以MFC为例)2022/11/24358.6设计任务管理子系统•说明设计工作的一项重要内容是,确定哪些是必须同时动作的
对象,哪些是相互排斥的对象,然后进一步设计任务管理子系统2022/11/24368.6设计任务管理子系统•一、分析并发性通过面向对象分析建立起来的动态模型,是分析并发性的主要依据。如果两个对象彼此间不存在交互,或者它们同时接受事件,则这两个对象在本质
上是并发的2022/11/24378.6设计任务管理子系统•二、设计任务管理子系统设计任务管理子系统,包括确定各类任务并把任务分配给适当的硬件或软件去执行1、确定事件驱动型任务•如与设备、屏幕窗口等的通信2、确定时钟
驱动型任务•某些任务每隔一定时间间隔就被触发以执行某些处理•工作过程:睡眠,接收中断,处理中断,睡眠……2022/11/24388.6设计任务管理子系统•二、设计任务管理子系统3、确定优先任务•高优先级•低优先级4、确定关键任务•关键任务是有关系统
成功或失败的关键处理,这类处理通常都有严格的可靠性要求•对高可靠性处理应该精心设计和编码,并且应该严格测试2022/11/24398.6设计任务管理子系统•二、设计任务管理子系统5、确定协调任务•当系统中存在三个以
上任务时,就应该增加一个任务,用它作为协调任务6、尽量减少任务数•必须仔细分析和选择每个确实需要的任务。应该使系统中包含的任务数尽量少2022/11/24408.6设计任务管理子系统•二、设计任务管理子系统7、确定资源需求•使用多处理器或固件,主要是为了满足高
性能的需求。设计者必须通过计算系统载荷(即每秒处理的业务数及处理一个业务所花费的时间),来估算所需要的CPU(或其他固件)的处理能力2022/11/24418.7设计数据管理子系统•一、选择数据存储管理模式三种模式•1、文件管理系统OS的一部分,但是需要额外代码•2
、关系数据库管理系统一致的接口标准化的语言•3、面向对象数据库管理系统扩展的关系数据库管理系统和扩展的面向对象程序设计语言2022/11/24428.7设计数据管理子系统•二、设计数据管理子系统1、设计数据格式
•1)文件系统第一范式(就是数据表的每一列不可再分)•2)关系数据库管理系统第三范式»每个非关键字属性仅函数依赖于主关键字»如“学生系宿舍”存在传递依赖,不符合第三范式•3)面向对象数据库管理系统扩展的关系数据库途径扩展的面向对象程序设计语言途径20
22/11/24438.7设计数据管理子系统•二、设计数据管理子系统2、设计相应的服务•如果某个类的对象需要存储起来,则在这个类中增加一个属性和服务,用于完成存储对象自身的工作•1)文件系统打开,检索,更新,关闭注意,为提高性能应该批量处理访问文件的要求2022/11/24448
.7设计数据管理子系统•二、设计数据管理子系统2、设计相应的服务•2)关系数据库管理系统访问数据表,检索,更新•3)面向对象数据库管理系统扩展的关系数据库途径扩展的面向对象程序设计语言途径2022/11/24458.7设计数据管理子系统•三、实例ATM中,需要
存储的对象主要是账户类的对象。为了支持数据管理子系统的实现,账户对象必须知道自己是怎样存储的•每个对象自己保存自己•由数据管理子系统负责存储对象2022/11/24468.8设计类中的服务•一、确定类中应有的服务对象模型•进行对象设
计的基本框架•对象模型中,通常只在每个类中列出很少几个最核心的服务动态模型•对象中的许多服务都与对象收到的事件密切相关2022/11/24478.8设计类中的服务•一、确定类中应有的服务功能模型•DFD中的某些处
理可能与对象提供的服务相对应2022/11/24488.8设计类中的服务•二、设计实现服务的方法1、设计实现服务的算法•1)算法复杂度•2)容易理解与容易实现•3)易修改2、选择数据结构3、定义内部类和内部操作2022/11/24498
.9设计关联•在面向对象设计过程中,设计人员必须确定实现关联的具体策略•一、关联的遍历(使用关联的方式)单向遍历双向遍历2022/11/24508.9设计关联•二、实现单向关联关联的重数是一阶的•实现关联的指针是一个简单指针关联的重数是多阶的
•需要用一个指针集合实现关联实例(下二页)2022/11/24518.9设计关联雇员公司1..*被雇用►雇员公司关联实现2022/11/2452教师课程讲授►关联1+1+教师课程实现指针集合2022/11/245
38.9设计关联•三、实现双向关联方法一、只用属性实现一个方向的关联,当需要反向遍历时就执行一次正向查找雇员公司实现2022/11/24548.9设计关联•三、实现双向关联方法二、两个方向的关联都用属性实现雇员公司实现指针集合2022/11/2455
8.9设计关联•三、实现双向关联方法三、用独立的关联对象实现双向关联-雇主-雇员-工资公司与雇员公司雇员2022/11/24568.9设计关联•四、链属性的实现三种情形:•1:1关联•1:N关联•M:N关联2022/11/24578.10设计优化•一、确定优先级•二、提高
效率的几项技术1、增加冗余关联(分析时应避免的)以提高访问效率+find_skill()公司雇员技能雇用►具有技能►1+1+1+哈希表实现2022/11/24588.10设计优化•一、确定优先级•二、提高效率的几项技术1、增加冗余关联以提高访问效率+find_skill()公司雇员雇
用►1+1+语言限定词(索引)2022/11/24598.10设计优化•二、提高效率的几项技术2、调整查询次序•例:查询“扬州所有的女公交司机”应安排什么查询次序?3、保留派生属性(中间结果)2022/11/24608.10设计优化•三、
调整继承关系在面向对象设计过程中,建立良好的继承关系是优化设计的一项重要内容1、抽象与具体•首先创建一些满足具体用途的类,然后对它们进行归纳,一旦归纳出一些通用的类以后,往往可以根据需要再派生出具体类。在进行了一些具体化(即专门化)的工
作之后,也许就应该再次归纳了2022/11/2461+买()+吃()+烹调()-价钱-热量-重量-肥瘦比例肉馅+买()+吃()+烹调()+削皮()-价钱-热量-重量土豆(a)2022/11/2462+削皮()土豆+买
()+吃()+烹调()#价钱#热量#重量食品-肥瘦比例肉馅(b)2022/11/2463+削皮()土豆+买()+吃()+烹调()#价钱#热量#重量食品+绞肉()-肥瘦比例肉馅(c)+切肉()-肥瘦比例-切法五花肉2022/11/2464+绞肉()肉馅+削皮()+切片()
土豆+买()+吃()+烹调()#价钱#热量#重量食品#肥瘦比例肉+切肉()-切法五花肉(d)2022/11/24658.10设计优化•三、调整继承关系2、为提高继承程度而修改类定义•不能违背领域知识和常识•应该确保现有类的协议(即同外部世界的接口)不变3、利用委托实现行为
共享2022/11/2466+push()+pop()-l:ListStack+add()+remove()+first()+last()List1+add()+remove()+first()+la
st()List+push()+pop()stack继承了add,remove,first,last将List的实例作为属性,从而其本身只有两个操作2022/11/24678.11实例•问题的初衷介绍一个简化的C++类库管理系统的分析和设计过程2022/11/24688.11实例•一、面向对象分
析1、需求•1)管理用C++语言定义的类•2)用户能够方便地向类库中添加新的类,并能建立新类与库中原有类的关系•3)用户能够通过类名从类库中查询出指定的类•4)用户能够查看或修改与指定类有关的信息(包括数据成员的定义
、成员函数的定义及这个类与其他类的关系)2022/11/24698.11实例•一、面向对象分析1、需求•5)用户能够从类库中删除指定的类•6)用户能够在浏览窗口中方便、快速地浏览当前类的父类和子类•7)具有“联想”浏览功能,也就是说,可以把当前类的某个子类或父类指定为新的当前类,从
而浏览这个新当前类的父类和子类•8)用户能够查看或修改某个类的指定成员函数的源代码2022/11/24708.11实例•一、面向对象分析1、需求•9)本系统是一个简化的多用户系统,每个用户都可以建立自己的类库,不同类库之间互不干扰•10)对于用户的误操作
或错误的输入数据,系统能给出适当的提示信息,并且仍然继续稳定地运行•11)系统易学易用,用户界面应该是GUI(图形用户界面)的2022/11/24718.11实例•一、面向对象分析2、建立对象模型•1)确定类—&—对象基本对象就两个
»类库»类(类条目)由需求3)4)条可知类条目中应包含属性:»类名»父类列表»成员函数列表»数据成员列表2022/11/24728.11实例•一、面向对象分析2、建立对象模型•1)确定类—&—对象类条目中的每个“父类”应包含信息:»名字»访问权»虚基类
标志(virtual)2022/11/24738.11实例•一、面向对象分析2、建立对象模型•1)确定类—&—对象类条目中的每个“成员函数”应包含信息:»函数名»访问权(public,protected,private)»虚函数
标志(virtual)»返回值类型»参数»函数代码(需求8))2022/11/24748.11实例•一、面向对象分析2、建立对象模型•1)确定类—&—对象类条目中的每个“数据成员”应包含信息:»数据
名»访问权(public,protected,private)»数据类型由于“父类”、“成员函数”、“数据成员”的相对独立性,将它们都作为对象2022/11/24758.11实例•一、面向对象分析2、建立对象模型•1)确定类—&—对象类条目中应包含操作:»对于类名
(设置类名)»对于父类列表(添加、删除、更改)»对于成员函数(添加、删除、更改)»对于数据成员(添加、删除、更改)2022/11/24768.11实例•一、面向对象分析2、建立对象模型•1)确定类—&—对象类库包
含的属性:»库名»类条目列表类库包含的操作:»插入一个类条目(需求2))»删除一个类条目(需求5))»存储类库»读出类库(放到内存中)2022/11/24778.11实例•一、面向对象分析2、建立对象模型•2)分析类—&—对象之间的关系一个用户拥有多个类库每个类库由0或多个类条目组成
每个类条目由0或多个父类每个类条目0或多个数据成员每个类条目0或多个成员函数组成»注:上述关系全是对象之间的关系,而不是类之间的关系2022/11/24788.11实例•一、面向对象分析2、建立对象模型•下页•动态模型(无需)不存在状态转换的问题
•功能模型(无需)没有数据转换的问题,所以无需用DFD描述功能2022/11/2479+插入类条目()+删除类条目()+存储类库()+读出类库()-库名-类条目列表类库+设置类名()+添加父类()+删除父类()+更改父类()+添
加成员函数()+删除成员函数()+更改成员函数()+添加数据成员()+删除数据成员()+更改数据成员()-类名-父类列表-成员函数列表-数据成员列表类条目-名字-访问权-虚基类标志父类-函数名-访问权-虚函数标志-返回值类型-参数-代码成员函数-数据名-访问
权-数据类型数据成员用户1**1**拥有►1+2022/11/24808.11实例•二、面向对象设计1、设计类库结构•两种可选结构二叉树(下页图示)链表»操作简单,逻辑表现力不好2022/11/24818.11实例讨论其典型优缺点父类孩子1孩子2孩子3孙子21孙子11
孙子12孙子13曾孙1112022/11/24828.11实例•二、面向对象设计1、设计类库结构•最终的选择:Class1Class2Class3Class4Parent11NextNextParent21NextParent31NextParent412022/11
/24838.11实例•二、面向对象设计2、设计问题域子系统•从实现的角度对前述对象模型所做补充:1)类条目(ClassEntry)»用“父类链表头指针”、“成员函数链表头指针”、“数据成员链表头指针”代替对应的列表»增加“注释”
»增加“next”指针»增加“查找指定父类信息”、“查找指定成员函数信息”、“查找指定数据成员信息”2022/11/24848.11实例•二、面向对象设计2、设计问题域子系统•从实现的角度对前述对象模型所做补充:2)类库(ClassEntryL
ink)»将“类条目列表”改为“类链头指针”»应有服务(取得库中类条目的个数,读文件并在内存中建立类链表,写链表,插入一个类条目,删除一个类条目,按类名查找并将内容复制到指定地点)2022/11/24858.11实例•二、面向对象
设计2、设计问题域子系统•从实现的角度对前述对象模型所做补充:3)父类(ClassBase),成员函数(ClassFun),数据成员(ClassData),»各添加一个指针(next)4)类条目缓冲区(Buffer)
2022/11/2486ClassEntryLinkClassEntryClassBaseClassFunClassData下一个ClassEntry...下一个ClassBase下一个ClassFun下一个ClassData.........ClassEntry2022/11/24878
.11实例•二、面向对象设计3、设计人-机交互子系统•1)窗口包含下述构件:登录窗口2022/11/24888.11实例•二、面向对象设计3、设计人-机交互子系统•1)窗口包含下述构件:主窗口类库管理系统类库管理系统创
建浏览储存退出2022/11/2489创建窗口类库管理系统类库管理系统请在此输入或选择新类名新类名:父类处理框父类列表添加编辑删除数据成员处理框数据成员列表添加编辑删除成员函数处理框成员函数列表添加编辑删除确认放弃请输入该
类的说明信息2022/11/2490选择浏览方式窗口请选择浏览方式请选择浏览方式浏览方式确认放弃按类名浏览按类关系浏览2022/11/2491类名浏览窗口按类名浏览按类名浏览确认放弃请选择或输入要浏览的
类所选类的说明信息:父类:访问权限:虚基类标志:成员函数名:成员函数访问权:成员函数返回类型:虚函数标志:成员函数参数权:数据成员名:数据成员访问权:数据成员类型:所选函数代码2022/11/24928.11实例•二、面向对象设计3、设计人-机交互子系统•1)窗口包含下述构件:按类关系浏
览窗口(略)•2)重用我们设计的是一个可重用类库管理系统,在设计和实现这个类库管理系统的过程中,自然应该尽可能重用已有的软构件2022/11/24938.11实例•二、面向对象设计3、设计人-机交互子
系统•2)重用采用VC环境,尽可能重用MFC中的类»上述所有的窗口类可以从MFC中的CDialog类继承»只有很少的编程工作量4、其它类(略)没有设计如下的两个子系统:•任务管理子系统•数据管理子系统