软件工程第十一章3副本

上传人:E**** 文档编号:91190521 上传时间:2019-06-26 格式:PPT 页数:82 大小:428.50KB
返回 下载 相关 举报
软件工程第十一章3副本_第1页
第1页 / 共82页
软件工程第十一章3副本_第2页
第2页 / 共82页
软件工程第十一章3副本_第3页
第3页 / 共82页
软件工程第十一章3副本_第4页
第4页 / 共82页
软件工程第十一章3副本_第5页
第5页 / 共82页
点击查看更多>>
资源描述

《软件工程第十一章3副本》由会员分享,可在线阅读,更多相关《软件工程第十一章3副本(82页珍藏版)》请在金锄头文库上搜索。

1、1,第11章 面向对象设计,11.1 面向对象设计的准则 11.2 启发规则 11.3 软件重用 11.4 系统分解 11.5 设计问题域子系统 11.6 设计人机交互子系统 11.7 设计任务管理子系统 11.8 设计数据管理子系统 11.9 设计类中的服务 11.10 设计关联 11.11 设计优化,2,11.8 设计数据管理子系统 11.8.1 选择数据存储管理模式,1. 文件管理系统 文件管理系统是操作系统的一个组成部分,具有成本低和简单等特点。 缺点: 文件操作的级别低, 为提供适当的抽象级别还必须编写额外的代码。 不同操作系统的文件管理系统往往有明显差异。,3,2. 关系数据库管理

2、系统 关系数据库管理系统的理论基础是关系代数,它不仅理论基础坚实而且有下列一些主要优点: 提供了各种最基本的数据管理功能。 为多种应用提供了一致的接口。 标准化的语言(SQL语言)。 关系数据库管理系统通常都相当复杂,具体缺点: 运行开销大。 不能满足高级应用的需求。 与程序设计语言的连接不自然。,4,3. 面向对象数据库管理系统 面向对象数据库管理系统是一种新技术,主要有两种设计途径: 扩展的关系数据库管理系统,是在关系数据库的基础上,增加了抽象数据类型和继承机制,此外还增加了创建及管理类和对象的通用服务。 例如:(Oracle 8i,DB2) 扩展的面向对象程序设计语言,扩充了面向对象程序

3、设计语言的语法和功能,增加了在数据库中存储和管理对象的机制。,5,11.8.2 设计数据管理子系统,1. 设计数据格式 (1)文件系统 定义第一范式表: 列出每个类的属性表; 把属性表规范成第一范式,从而得到第一范式表的定义。 为每个第一范式表定义一个文件。 测量性能和需要的存储容量。 修改原设计的第一范式,以满足性能和存储需求。,6,1. 设计数据格式 (2)关系数据库管理系统 定义第三范式表: 列出每个类的属性表; 把属性表规范成第三范式,从而得出第三范式表的定义。 为每个第三范式表定义一个数据库表。 测量性能和需要的存储容量。 修改先前设计的第三范式,以满足性能和存储需求。,7,1. 设

4、计数据格式 (3)面向对象数据库管理系统 扩展的关系数据库途径:使用与关系数据库管理系统相同的方法。 扩展的面向对象程序设计语言途径:不需要规范化属性的步骤,因为数据库管理系统本身具有把对象值映射成存储值的功能。,8,2. 设计相应的服务 (1)文件系统 被存储的对象需要知道打开哪个(些)文件 怎样把文件定位到正确的记录上 怎样检索出旧值(如果有的话) 怎样用现有值更新它们,9,2. 设计相应的服务 (1)文件系统 此外,还应该定义一个ObjectServer(对象服务器)类,并创建它的实例。该类提供下列服务: 通知对象保存自身; 检索已存储的对象(查找,读值,创建并初始化对象),以便把这些对

5、象提供给其他子系统使用。,10,2. 设计相应的服务 (2)关系数据库管理系统 应该知道访问哪些数据库表,怎样访问所需要的行,怎样检索旧值,以及怎样用现有值更新它们。 此外,还应该定义一个ObjectServer类,并声明它的对象。该类提供下列服务: 通知对象保存自身; 检索已存储的对象(查找,读值,创建并初始化对象),以便由其他子系统使用这些对象。,11,2. 设计相应的服务 (3)面向对象数据库管理系统 扩展的关系数据库途径:与关系数据库管理系统方法相同。 扩展的面向对象程序设计语言途径:无须增加服务,已经给每个对象提供了“存储自己”的行为。,12,11.8.3 例子,为具体说明数据管理子

6、系统的设计方法,让我们再看看图11.7所示的ATM系统。,13,11.8.3 例子,从图中可以看出,惟一的永久性数据存储放在分行计算机中。 因为必须保持数据的一致性和完整性,而且常常有多个并发事务同时访问这些数据,因此,采用成熟的商品化关系数据库管理系统存储数据。 应该把每个事务作为一个不可分割的批操作来处理,由事务封锁账户直到该事务结束为止。,14,11.8.3 例子,在这个例子中,需要存储的对象主要是账户类的对象。为了支持数据管理子系统的实现,账户类对象必须知道自己是怎样存储的,有两种方法可以达到这个目的。 (1) 每个对象自己保存自己 账户类对象在接到“存储自己”的通知后,知道怎样把自身

7、存储起来(需要增加一个属性和一个服务来定义上述行为)。,15,11.8.3 例子,(2)由数据管理子系统负责存储对象 账户类对象在接到“存储自己”的通知后,知道应该向数据管理子系统发送什么消息,以便由数据管理子系统把它的状态保存起来,为此也需要增加属性和服务来定义上述行为。使用这种方法的优点,是无须修改问题域子系统。,16,11.8.3 例子,如上一小节所述,应该定义一个数据管理类ObjectServer,并声明它的对象。这个类提供下列服务: 通知对象保存自身或保存需长期存储的对象的状态; 检索已存储的对象并使之“复活”。,17,11.9 设计类中的服务 11.9.1 确定类中应有的服务,需要

8、综合考虑对象模型、动态模型和功能模型,才能正确确定类中应有的服务。 对象模型,通常只在每个类中列出很少几个最核心的服务。设计者必须把动态模型中对象的行为以及功能模型中的数据处理,转换成由适当的类所提供的服务。,18,11.9.1 确定类中应有的服务,一张状态图描绘了一类对象的生命周期,图中的状态转换是执行对象服务的结果。 对象的许多服务都与对象接收到的事件密切相关,事实上,事件就表现为消息,接收消息的对象必然有由消息选择符指定的服务。 功能模型指明了系统必须提供的服务。数据流图中的某些处理可能与对象提供的服务对应。,19,11.9.1 确定类中应有的服务,下列规则有助于确定操作的目标对象: 如

9、果某个处理的功能是从输入流中抽取一个值,则该输入流就是目标对象。 如果某个处理具有类型相同的输入流和输出流,而且输出流实质上是输入流的另一种形式,则该输入输出流就是目标对象。 如果某个处理从多个输入流得出输出值,则该处理是输出类中定义的一个服务。 如果某个处理把对输入流处理的结果输出给数据存储或动作对象,则该数据存储或动作对象就是目标对象。,20,11.9.1 确定类中应有的服务,当一个处理涉及多个对象时,为确定把它作为哪个对象的服务,设计者必须判断哪个对象在这个处理中起主要作用。通常在起主要作用的对象类中定义这个服务。下面两条规则有助于确定处理的归属: 如果处理影响或修改了一个对象,则最好把

10、该处理与处理的目标(而不是触发者)联系在一起。 考察处理涉及的对象类及这些类之间的关联,从中找出处于中心地位的类。如果其他类和关联围绕这个中心类构成星形,则这个中心类就是处理的目标。,21,11.9.2 设计实现服务的方法,1. 设计实现服务的算法 设计实现服务的算法时,应该考虑下列几个因素: 算法复杂度。 容易理解与容易实现。 易修改。,22,11.9.2 设计实现服务的方法,2. 选择数据结构 在面向对象设计过程中,需要选择能够方便、有效地实现算法的物理数据结构。,23,11.9.2 设计实现服务的方法,3. 定义内部类和内部操作 在面向对象设计过程中,可能需要增添一些在需求陈述中没有提到

11、的类,这些新增加的类,主要用来存放在执行算法过程中所得出的某些中间结果。,24,11.10 设计关联,1. 关联的遍历 使用关联有两种可能的方式: 单向遍历 双向遍历 单向遍历实现起来比较简单,双向遍历实现起来稍微麻烦一些。,25,11.10 设计关联,2. 实现单向关联 用指针可以方便地实现单向关联。如果关联的重数是一元的,则实现关联的指针是一个简单指针;如果重数是多元的,则需要用一个指针集合实现关联。,26,用指针实现单向关联,27,用指针集合实现双向关联,28,3. 实现双向关联 许多关联都需要双向遍历,当然,两个方向遍历的频度往往并不相同。实现双向关联有下列3种方法: 只用属性实现一个

12、方向的关联,当需要反向遍历时就执行一次正向查找。如果两个方向遍历的频度相差很大,而且需要尽量减少存储开销和修改时的开销,则这是一种很有效的实现双向关联的方法。,29,3. 实现双向关联 两个方向的关联都用属性实现。当访问次数远远多于修改次数时,这种实现方法很有效。,30,3. 实现双向关联 用独立的关联对象实现双向关联。关联对象不属于相互关联的任何一个类,它是独立的关联类的实例。,用对象实现关联,31,4. 关联对象的实现 可以引入一个关联类来保存描述关联性质的信息,关联中的每个连接对应着关联类的一个对象。 实现关联对象的方法取决于关联的重数。 一对一关联:关联对象可以与参与关联的任一个对象合

13、并。 一对多关联:关联对象可以与“多”端对象合并。 多对多关联:则关联链的性质不可能只与一个参与关联的对象有关,通常用一个独立的关联类来保存描述关联性质的信息,这个类的每个实例表示一条具体的关联链及该链的属性。,32,11.11 设计优化 11.11.1 确定优先级,系统的各项质量指标并不是同等重要的,设计人员必须确定各项质量指标的相对重要性(即确定优先级),以便在优化设计时制定折衷方案。 最常见的情况,是在效率和清晰性之间寻求适当的折衷方案。,33,11.11.2 提高效率的几项技术,1. 增加冗余关联以提高访问效率 分析阶段确定的关联可能并没有构成效率最高的访问路径。 下面用设计公司雇员技

14、能数据库的例子,说明分析访问路径及提高访问效率的方法。,34,1. 增加冗余关联以提高访问效率 图11.11是从面向对象分析模型中摘取的一部分。公司类中的服务find_skill返回具有指定技能的雇员集合。,图11.11 公司、雇员及技能之间的关联链,35,1. 增加冗余关联以提高访问效率 例如: 用户可能询问公司中会讲日语的雇员有哪些人? 假设某公司共有2000名雇员,平均每名雇员会10种技能,则简单的嵌套查询将遍历雇员对象2000次,针对每名雇员平均再遍历技能对象10次。如果全公司仅有5名雇员精通日语,则查询命中率仅有1/4000。,36,1. 增加冗余关联以提高访问效率 提高访问效率的一

15、种方法是使用哈希(Hash)表: “具有技能”这个关联不再利用无序表实现,而是改用哈希表实现。只要“会讲日语”是用惟一一个技能对象表示,这样改进后就会使查询次数由20000次减少到2000次。,37,一个权限认证的例子,使用了哈希表作为数据的存储 public class RoleRight private static Hashtable rightList = new Hashtable(); public void init() String accRoleList = “admin“,“manager“,“user“,“guest“; String rightCodeList = “1

16、0001“,“10021“,“20011“,“24011“; for(int i=0;iaccRoleList.length;i+) rightList.put(accRoleListi,rightCodeListi); /*方法说明:获取角色权限代码*/ public String getRight(String accRole) if(rightList.containsKey(accRole) return (String)rightList.get(accRole); else return null; ,38,1. 增加冗余关联以提高访问效率 但是,当仅有极少数对象满足查询条件时,查询命中率仍然很低。 在这种情况下,更有效的提高查询效率的改进方法是,给那些需要经常查询的对象建立索引。,39,1. 增加冗余关联以提高访问效率 例如,针对上述例子,可以增加一个额外的限定关联“精通语言”,用来联系公司与雇员这两类对象,如图11.12所示。,图11.12 为雇员技能数据库建立索引,40,1. 增加冗余关联以提高访问效率 利用适

展开阅读全文
相关资源
相关搜索

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

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号