资源预览内容
第1页 / 共63页
第2页 / 共63页
第3页 / 共63页
第4页 / 共63页
第5页 / 共63页
第6页 / 共63页
第7页 / 共63页
第8页 / 共63页
第9页 / 共63页
第10页 / 共63页
亲,该文档总共63页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第11章 面向对象的设计,第11章 面向对象设计,11.1 面向对象设计的准则 11.2 启发规则 11.3 软件重用 11.4 系统分解 11.5 设计问题域子系统 11.6 设计人机交互子系统,11.7 设计任务管理子系统 11.8 设计数据管理子系统 11.9 设计类中的服务 11.10 设计关联 11.11 设计优化 小结,面向对象设计 设计则是把分析阶段得到的需求转变成符合成本和质量要求的、抽象的系统实现方案的过程。 从面向对象分析到面向对象设计(OOD),是一个逐渐扩充模型的过程。 许多分析结果可以直接映射成设计结果,而在设计过程中又往往会加深和补充对系统需求的理解,从而进一步完善分析结果。 面向对象方法的一大优势就是分析和设计活动之间的平滑(无缝)过渡.,面向对象设计可再细分为系统设计和对象设计。 系统设计确定实现系统的策略和目标系统的高层结构。 对象设计确定解空间中的类、关联、接口形式及实现服务的算法。 系统设计与对象设计之间的界限,比分析与设计之间的界限更模糊。,1. 模块化 面向对象软件开发模式,很自然地支持模块的设计原理:对象就是模块。 2. 抽象 面向对象方法支持过程和数据抽象。 类是一种抽象数据类型。使用者无须知道类中数据元素的具体表示方法,就可以通过接口使用类中定义的数据。 这类抽象称为规格说明抽象。 3. 信息隐藏 对象的封装性实现支持了信息隐藏。,4. 弱耦合 耦合主要指不同对象之间相互关联的紧密程度。 两个对象应该通过类的接口实现耦合,而不应该依赖于类的具体实现细节(友元)。 对象之间的两类耦合: (1) 交互耦合:交换消息 使交互耦合尽可能松散的准则:减少消息中包含的参数个数,降低参数的复杂程度, 减少消息数。 (2) 继承耦合:互为基类和派生类(非模块之间) 与交互耦合相反,应该提高继承耦合程度。 通过继承关系结合起来的基类和派生类,构成了更大的模块。,5. 强内聚 在面向对象设计中存在下述3种内聚。 (1) 服务内聚。一个服务应该完成一个且仅完成一个功能。 (2) 类内聚。设计类的原则是,一个类应该只有一个用途,它的属性和服务应该是高内聚的。类的属性和服务应该全都是完成该类对象的任务所必需的。如果某个类有多个用途,通常应该把它分解成多个专用的类。 (3) 一般-特殊(继承)内聚。设计出的一般-特殊结构,应该符合多数人的概念,更准确地说,这种结构应该是对相应的领域知识的正确抽取。 紧密的继承耦合与高度的一般-特殊内聚是一致的。,6. 可重用 重用有两方面的含义: 一是尽量使用已有的类 二是在设计新类的协议时考虑将来的可重用性。,1. 设计结果应该清晰易懂 保证设计结果清晰易懂的主要因素如下: (1) 用词一致:一词一用。 (2) 使用已有的协议。 (3) 减少消息模式的数目。 (4) 避免模糊的定义:类的用途有限,名清晰,11.2 启发规则,2. 一般-特殊结构的深度应适当 一个中等规模(大约包含100个类)的系统中,类等级层次数应保持为72。 不应该仅仅从方便编码的角度出发随意创建派生类,应该使一般-特殊结构与领域知识或常识保持一致。,3. 设计简单的类 小而简单的类便于开发和管理(高内聚)。为使类保持简单,应该注意以下几点。 (1) 避免包含过多的属性:完成的功能可能太多了。 (2) 有明确的定义:任务应该简单。 (3) 简化对象之间的合作关系。如果需要多个对象协同配合才能做好一件事,则破坏了类的简明性和清晰性。 (4) 不要提供太多服务。典型地,一个类提供的公共服务不超过7个。,在开发大型软件系统时,遵循上述启发规则也会带来另一个问题:设计出大量较小的类,难继承, 这同样会带来一定复杂性。 解决这个问题的办法之一,是把系统中的类按逻辑分组,也就是划分“主题”。,4. 使用简单的协议 消息中的参数最好不要超过3个。 复杂消息导致对象紧耦合。 5. 使用简单的服务(模块复杂性) 类中的服务小为好,35行源程序语句,可用一个简单句子描述它的功能。 如果需要在服务中使用复杂的CASE语句,考虑用一般-特殊结构代替这个类的可能性。,6. 把设计变动减至最小(稳定性) 设计的质量越高,设计结果越稳定。 随着时间推移,设计方案日趋成熟,改动越来越小。,1. 重用 重用也叫再用或复用,是指同一事物不作修改或稍加改动就多次重复使用。软件重用可分为3个层次: (1) 知识重用(例如,软件工程知识的重用)。 (2) 方法和标准的重用(例如,面向对象方法或国家制定的软件开发规范的重用)。 (3) 软件成分的重用。,11.3 软件重用 11.3.1 概述,2. 软件成分的重用级别 软件成分的重用的3个级别: (1)几种形式的代码重用 源代码剪贴:几乎无法跟踪原始代码块的修改 源代码包含#include :重新编译都用最新源代码 继承:可扩充或修改库中的类而不影响原有的代码 (2) 设计结果重用 重用某个软件系统的设计模型。e.g. 同(3) (3) 分析结果重用 重用分析模型, 例如,把一个应用系统移植到完全不同的软硬件平台上。,3. 10种典型的可重用软件成分 (1) 项目计划:软件质量保证计划。 (2) 成本估计:不同项目中类似功能的成本估算。 (3) 体系结构:事务类处理体系结构。 (4) 需求模型/规格说明:对象模型,数据流图。 (5) 设计:体系结构、数据、接口和过程设计。 (6) 源代码:兼容的程序构件。 (7) 用户文档和技术文档:部分重用。 (8) 用户界面:GUI 可占应用程序的60%代码量。 (9) 数据: 记录结构,文件和完整的数据库。 (10 测试用例:与重用设计或代码相关的用例。,面向对象技术中的类构件有3种重用方式:实例重用、继承重用和多态重用。 1. 可重用软构件应具备的特点 (1) 模块独立性强:具有单一、完整的功能,且经过反复测试被确认是正确的。,11.3.2 类构件,(2) 具有高度可塑性:必须提供为适应特定需求而扩充或修改已有构件的机制,且使用起来非常简单方便。 (3) 接口清晰、简明、可靠,详尽的文档说明。,2. 类构件的重用方式 (1) 实例重用 按照需要创建类的实例。然后向它发送消息,启动相应的服务,完成需要完成的工作。 还可以用几个简单实例/类创建出一个更复杂的类, 见继承重用。类提供的服务过少,则难被重用。 (2) 继承重用 提高继承重用的关键是设计合理的、具有一定深度的类构件继承层次结构: 每个子类只加入少量新属性和新服务,而降低其接口复杂度,表现出一个清晰的进化过程,提高可理解性;也为多态重用奠定了良好基础。,(3) 多态重用 利用多态性可简化对象的对外接口 (基类与派生类相同的对外接口),从而降低了消息的复杂程度。运行时,接收消息的对象由多态性机制启动自己特定的方法,去响应一个一般化的消息,从而简化了消息界面。 可能影响重用性的操作: 与表示方法有关的操作。例如,不同实例的比较、显示、擦除等等。 与数据结构、数据大小等有关的操作。 与外部设备有关的操作。例如,设备控制。 算法在将来可能会改进(或改变)的核心操作。,转换接口:重用时都必须重新定义的服务的集合, C+语言编程时,在基类中将其定义为纯虚函数。 扩充接口:有多种可能的实现算法的服务,派生类可改变算法或继承父类中的算法。用C+语言实现时,在基类中把这类服务定义为普通的虚函数。,1. 质量:重用构件错误较少 2. 生产率:3050%的重用导致生产率提高2540% 3. 成本节省:C=Cs-Cr/N-Cd,11.3.3 软件重用的效益,解决复杂问题的普遍策略:“分而治之,各个击破” 系统的主要组成部分称为子系统, 根据所提供的功能来划分。 子系统之间应该具有尽可能简单、明确的接口。 相对独立地设计各个子系统, 减少子系统彼此间的依赖性。 面向对象设计模型也由主题、类与对象、结构、属性、服务等5个层次组成。 在逻辑上都有4个子系统: 问题域子系统、人机交互子系统、任务管理子系统和数据管理子系统。,11.4 系统分解,不同的软件系统中,这四个子系统的重要程度和规模可能相差很大: 某些系统仅有3个(甚至少于3个)子系统。,子系统之间的两种交互方式 (1) 客户-供应商关系 (Client-supplier) “客户”的子系统调用作为“供应商”的子系统,后者完成某些服务工作并返回结果。使用这种交互方案,作为客户的子系统必须了解作为供应商的子系统的接口,然而后者却无须了解前者的接口,因为任何交互行为都是由前者驱动的。,(2) 平等伙伴关系(peer-to-peer)关系 每个子系统都可能调用其他子系统,因此,每个子系统都必须了解其他子系统的接口。这种组织系统的方案比起客户-供应商方案来,交互更复杂,从而使系统难于理解,容易发生不易察觉的设计错误。 尽量使用客户-供应商关系。,2.水平层次和垂直块组织系统的两种方案 (1) 层次组织 每层是一个子系统。同层的对象,彼此间相互独立,而不同层的对象可存在客户-供应商关系。 层次结构又可进一步划分成: 1) 封闭式: 每层仅使用其直接下层提供的服务。 2) 开放式: 每层可以使用任何下层提供的服务。 优缺点: 简单/高效 通常,在需求陈述中只描述了对系统顶层和底层的需求,顶层就是用户看到的目标系统,底层则是可以使用的资源。 设计者必须设计一些中间层次: 过渡, 效率, 质量。,(2) 块状组织 把系统垂直地分解成若干个相对独立的、弱耦合的子系统/块,每块提供一种类型的服务。 采用层次与块状的混合结构,3. 设计(分布式)系统的拓扑结构 由子系统组成完整的系统时,典型的拓扑结构有管道形、树形、星形等。设计者应该采用与问题结构相适应的、尽可能简单的拓扑结构,以减少子系统之间的交互数量。 ATM系统的星型结构实例,设计受具体实现环境的约束: 本项目预计要使用的编程语言, 可用的软构件库(主要是类库) 程序员的编程经验。 分析模型,为设计奠定了基础, 应尽可能保留。 设计仅需从实现角度对模型做一些补充或修改:增添、合并或分解类与对象、属性及服务,调整继承关系等。,11.5 设计问题域子系统,1. 调整需求 一是用户需求或外部环境发生了变化; 二是对象分析模型不能完整、准确地反映用户的真实需求。 2. 重用已有的类 重用已有类的典型过程如下: (1) 选择重用最相似的已有类。 (2) 从被重用的已有类派生出问题域类。 (3) 增加或修改问题域类中需要的属性和服务。 (4) 修改与问题域类相关的关联。,3. 把问题域类组合在一起 可以引入一个根类把问题域类组合在一起。 e.g. 系统-子系统 4. 增添一般化类以建立协议 一些类需要有一个公共的协议:类似的服务, 共同接口。可以引入一个根类以便建立这个协议。,5. 调整继承层次 (1) 使用多重继承机制 阔菱形比窄菱形易避免属性及服务的命名冲突(载重)。,(2) 使用单继承机制 使用仅提供单继承机制的语言,必须多重继承结构转换成单继承结构。,人机交互子系统设计确定人机交互的细节,对GUI, 包括指定窗口和报表的形式、设计命令层次等。 原型是成功地设计人机交互的常用手段。 OOD的特点: 设计人机交互类, 重用, 如Visual C+的MFC类库。,11.6 设计人机交互子系统,对象可以并发地工作。 对象可能存在相互制约的顺序执行关系。 设计工作的一项内容就是,确定哪些是必须/可能同时动作的对象,哪些是相互制约的对象。,11.7 设计任务管理子系统,1. 分析并发性 动态模型是分析并发性的主要依据。 对象彼此间不存在(间接/传递)交互则它们可以是并发的。 检查对象的状态图及它们之间交换的事件,能够把若干个非并发的对象归并到一条控制线中:这条线上只有一个对象是活动的。 计算机中用任务(task)/进程(process)实现控制线。 并发行为既可以在不同的处理器上实现,也可以在单处理器上用多任务操作系统实现。,2. 设计任务管理子系统 任务分类: 事件驱动型任务、时钟驱动
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号