文档详情

软件工程导论课件之第11章-面向对象设计(第六版)(张海藩编著)

小**
实名认证
店铺
PPT
1.49MB
约82页
文档ID:54588706
软件工程导论课件之第11章-面向对象设计(第六版)(张海藩编著)_第1页
1/82

分析是提取和整理用户需求,并建立问题域精确模型的过程 设计则是把分析阶段得到的需求转变成符合成本和质量要求的、抽象的系统实现方案的过程 从面向对象分析(OOA)到面向对象设计(OOD),是一个逐渐扩充模型的过程 在实际的软件开发过程中分析和设计的界限是模糊的分析和设计活动是一个多次反复迭代的过程第11章 面向对象设计,OOD模型,第11章 面向对象设计,11.1 面向对象设计的准则 11.2 启发规则 11.3 软件重用 11.4 系统分解 11.5 设计问题域子系统 11.6 设计人机交互子系统 11.7 设计任务管理子系统 11.8 设计数据管理子系统 11.9 设计类中的服务 11.10 设计关联 11.11 设计优化,11.1 面向对象设计的准则,所谓优秀设计,就是权衡了各种因素,从而使得系统在其整个生命周期中的总开销最小的设计 对大多数软件系统而言,60%以上的软件费用都用于软件维护,因此,优秀软件设计的一个主要特点就是容易维护 设计准则有6条1. 模块化 面向对象的软件开发模式,支持了系统模块化的原则:对象就是模块 它是把数据结构和操作这些数据的方法紧密地结合在一起所构成的模块。

2. 抽象 面向对象方法不仅支持过程抽象,而且支持数据抽象 类实际上是一种抽象数据类型,它对外开放的公共接口构成了类的规格说明(协议),这种接口规定了外界可以使用的合法操作符,利用这些操作符可以对类的实例中包含的数据进行操作3. 信息隐藏在面向对象方法中,信息隐蔽通过对象的封装性实现:类结构分离了类的接口与类的实现,从而支持了信息隐蔽4. 弱耦合 耦合指不同对象之间相互关联的紧密程度 一般说来,对象之间的耦合可分为两大类: 交互耦合 如果对象之间的耦合通过消息连接来实现,则这种耦合就是交互耦合 交互耦合应尽可能松散 继承耦合 与交互耦合相反,应该提高继承耦合程度 继承是一般化类与特殊类之间耦合的一种形式通过继承关系结合起来的基类和派生类,构成了系统中粒度更大的模块彼此之间应该越紧密越好5. 强内聚 内聚衡量一个模块内各个元素彼此结合的紧密程度 内聚定义为:设计中使用的一个构件内的各个元素,对完成一个定义明确的目的所做出的贡献程度 在设计时应该力求做到高内聚 在面向对象设计中存在下述3种内聚: 服务内聚一个服务应该完成一个且仅完成一个功能 类内聚一个类应该只有一个用途,它的属性和服务应该是高内聚的。

一般-特殊内聚设计出的一般-特殊结构,应该符合多数人的概念6. 可重用 软件重用是提高软件开发生产率和目标系统质量的重要途径 重用基本上从设计阶段开始 重用有两方面的含义: 一是尽量使用已有的类(包括开发环境提供的类库,及以往开发类似系统时创建的类), 二是如果确实需要创建新类,则在设计这些新类的协议时,应该考虑将来的可重复使用性11.2 启发规则,人们在面向对象方法中也积累了一些经验,总结出几条启发规则:,1. 设计结果应该清晰易懂,2. 一般-特殊结构的深度应适当,3. 设计简单的类,4. 使用简单的协议,5. 使用简单的服务,6. 把设计变动减至最小,11.2 启发规则,1. 设计结果应该清晰易懂 用词一致 使用已有的协议 减少消息模式的数目 避免模糊的定义 2. 一般-特殊结构的深度应适当 应该使类等级中包含的层次数适当 一般说来,在一个中等规模(大约包含100个类)的系统中,类等级层次数应保持为7±23. 设计简单的类 应该尽量设计小而简单的类,以便于开发和管理 为使类保持简单,应该注意以下几点: 避免包含过多的属性 有明确的定义:任务简单,描述语句少 尽量简化对象之间的合作关系。

不要提供太多服务 问题:遵循上述规则在开发大型软件系统时,将设计出大量较小的类,需要按逻辑分组,即划分“主题”4. 使用简单的协议 设计简单的类接口,发送的消息中参数要少 一般说来,消息中的参数不要超过3个当然,不超过3个的限制也不是绝对的 5. 使用简单的服务 编写实现每一个服务时,避免复杂的语句和结构; 如果一个服务中包含了过多的源程序语句,或者语句嵌套层次太多,或者使用了复杂的CASE语句,则应该仔细检查这个服务,设法分解或简化它,考虑用一般-特殊结构代替6. 把设计变动减至最小出现必须修改设计的情况,应该使修改的范围尽可能小理想的设计变动情况,11.3 软件重用 11.3.1 概述,1. 重用 重用也叫再用或复用,是指同一事物不作修改或稍加改动就多次重复使用 广义地说,软件重用可分为以下3个层次: 知识重用(软件工程知识的重用) 方法和标准的重用(面向对象方法或国家制定的软件开发规范的重用) 软件成分的重用 本节仅讨论软件成分重用问题2. 软件成分的重用级别 代码重用:通常把它理解为调用库中的模块代码重用的几种形式: 源代码剪贴 源代码包含 继承 设计结果重用:重用某个软件系统的设计模型(即求解域模型)。

这个级别的重用有助于把一个应用系统移植到完全不同的软硬件平台上 分析结果重用:重用某个系统的分析模型这种重用特别适用于用户需求未改变,但系统体系结构发生了根本变化的场合3. 典型的可重用软件成分 项目计划 成本估计 体系结构 需求模型和规格说明 设计 源代码 用户文档和技术文档 用户界面 数据 测试用例,11.3.2 类构件,面向对象技术中的“类”,是比较理想的可重用软构件,称之为类构件 1. 可重用软构件应具备的特点 模块独立性强 具有高度可塑性 接口清晰、简明、可靠 精心设计的“类”基本上能满足上述要求,可以认为它是可重用软构件的雏形2. 类构件的重用方式 实例重用 使用适当的构造函数,按照需要创建类的实例 用几个简单的对象作为类的成员创建出一个更复杂的类 继承重用 继承重用提供了一种安全地修改已有类构件,以便在当前系统中重用的手段 多态重用 使对象的对外接口更加一般化,降低了消息连接的复杂程度 提供一种简便可靠的软构件组合机制11.3.3 软件重用的效益,1. 质量 随着每一次重用,都会有一些错误被发现并被清除,构件的质量也会随之改善 2. 生产率 当把可重用的软件成分应用于软件开发的全过程时,生产率得到了提高。

基本上30%~50%的重用大约可以导致生产率提高25%~40% 3. 成本 净成本节省可以用下式估算:C=Cs-Cr-Cd 其中,Cs是项目从头开发所需要的成本;Cr是与重用相关联的成本;Cd是交付给客户的软件的实际成本11.4 系统分解,“分而治之,各个击破”,软件工程师在设计比较复杂的应用系统时普遍采用的策略首先把系统分解成若干个比较小的部分,然后再分别设计每个部分 系统的主要组成部分称为子系统通常根据所提供的功能来划分子系统一般说来,子系统的数目应该与系统规模基本匹配 各个子系统之间应该具有尽可能简单、明确的接口因此,可以相对独立地设计各个子系统 在划分和设计子系统时,应该尽量减少子系统彼此间的依赖性面向对象设计模型,与面向对象分析模型一样,也由主题、类与对象、结构、属性、服务等5个层次组成 大多数系统的面向对象设计模型,在逻辑上都由4大部分组成 问题域子系统 人机交互子系统 任务管理子系统 数据管理子系统 可以把4大组成部分想象成整个模型的4个垂直切片,如下图所示:,典型的面向对象设计模型,下面对其分析:,1. 子系统之间的两种交互方式 客户-供应商关系(Client-supplier) 作为“客户”的子系统调用作为“供应商”的子系统,后者完成某些服务工作并返回结果。

任何交互行为都是由前者驱动的 平等伙伴关系(peer-to-peer) 每个子系统都可能调用其他子系统,因此,每个子系统都必须了解其他子系统的接口 子系统之间的交互更复杂 总的说来,单向交互比双向交互更容易理解,也更容易设计和修改,因此应该尽量使用客户-供应商关系2. 组织系统的两种方案 层次组织(水平) 把软件系统组织成一个层次系统,每层是一个子系统 上层在下层的基础上建立,下层为实现上层功能而提供必要的服务 每一层内所包含的对象,彼此间相互独立,而处于不同层次上的对象,彼此间往往有关联 在上、下层之间存在客户-供应商关系低层相当于供应商,上层相当于客户 层次结构又可进一步划分成两种模式: 封闭式:每层子系统仅仅使用直接下层提供的服务 开放式:某层子系统可以使用处于其下层的任何一层系统所提供的服务块状组织(垂直) 把软件系统垂直地分解成若干个相对独立的、弱耦合的子系统; 一个子系统相当于一块,每块提供一种类型的服务 混合使用层次结构和块状结构,可以成功地把多个子系统组成一个完整的软件系统典型应用系统的组织结构,3. 设计系统的拓扑结构 由子系统组成完整的系统时,典型的拓扑结构有管道形、树形、星形等。

设计者应该采用与问题结构相适应的、尽可能简单的拓扑结构,以减少子系统之间的交互数量11.5 设计问题域子系统,面向对象设计仅需从实现角度对问题域模型(对象模型、动态模型、功能模型)做一些补充或修改,主要是增添、合并或分解类与对象、属性及服务,调整继承关系等等 当问题域子系统过分复杂庞大时,应该把它进一步分解成若干个更小的子系统1. 调整需求 有两种情况会导致修改通过面向对象分析所确定的系统需求: 一是用户需求或外部环境发生了变化; 二是分析员对问题域理解不透彻或缺乏领域专家帮助 无论出现上述哪种情况,通常都只需简单地修改面向对象分析结果,然后再把这些修改反映到问题域子系统中2. 重用已有的类 代码重用从设计阶段开始,在研究面向对象分析结果时就应该寻找使用已有类的方法 重用已有类的典型过程如下: 选择有可能被重用的已有类,标出这些候选类中对本问题无用的属性和服务 在被重用的已有类和问题域类之间添加泛化关系(即从被重用的已有类派生出问题域类) 标出从已有类继承来的属性和服务,无须在问题域类内定义它们了 修改与问题域类相关的关联,必要时改为与被重用的已有类相关的关联当前所需的类的信息 比 可复用类定义的信息,= 直接复用< 通过继承复用> 删除可复用类的多余信息≈ 删除多余信息,通过继承复用,不同程度的复用:,第4种情况的步骤: (1) 把要复用的类加到问题域; (2) 标以“复用”,划掉(或标出)不用的属性与操作; (3) 建立从复用类到问题域原有的类之间的泛化关系; (4) 由于问题域的类继承了“复用”类的特征,所以有些属性和操作不需要了。

3. 把问题域类组合在一起通过引入一个根类而把问题域类组合在一起此外,这样的根类还可以用来建立协议 4. 增添一般化类以建立协议在设计过程中常常发现,一些具体类需要有一个公共的协议,也就是说,它们都需要定义一组类似的服务在这种情况下可以引入一个附加类(例如,根类),以便建立这个协议5. 调整继承层次 使用多重继承机制 使用单继承机制,使用多重继承机制避免出现属性及服务的命名冲突 窄菱形模式属性及服务命名冲突的可能性比较大 阔菱形模式属性及服务的名字发生冲突的可能性比较小,但是,它需要用更多的类才能表示同一个设计使用单继承机制 A、把多重继承结构简化成单一的单继承层次结构 B、在多重继承结构中的某些继承关系,经简化后将不再存在,这表明需要在各个具体类中重复定义某些属性和服务A、把多重继承简化为单一层次的单继承,方法一:采用聚合把多继承调整为单继承方法二:采用压平的方式方法三:压平和聚合的方式B、取消继承 方法一:把继承结构展平方法二:采用聚合的方法6. 对复杂关联的转化A、把多对多关联转化为一对多关联,,B、把多元关联转化为二元关联,,C、把关联类转化为二元关联,,7. 调整与完善属性,,8. ATM系统实例,ATM系统问题域子系统的结构,11.6 设计人机交互子系统,。

下载提示
相似文档
正为您匹配相似的精品文档