软件工程导论课件之第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),是一个逐渐扩充模型的过程。在实际的软件开发过程中分析和设计的界限是模糊的。分析和设计活动是一个多次反复迭代的过程。问题域部分人机交互部分数据管理部分任务管理部分OOD模型11.1面向对象设计的准则所谓优秀设计,就是权衡了各种因素,从而使得系统在其整个生命周期中的总开销最小的设计。对大多数软件系统而言,60%以上的软件费用都用于软件维护,因此,优秀软件设计的一个主要特点就是容易维护。设计准则有6条。1.模块化对象就是模块。它是把数据结构和操作这些数据的方法紧密地结合在一起所构成的模块。2.抽象面向对象方法不仅支持过程抽象,而且支持数据抽象。3.信息隐藏在面向对象方法中,信息隐藏通过对象的封装性实现。4.弱耦合耦合指不同对象之间相互关联的紧密程度。一般说来,对象之间的耦合可分为两大类:交互耦合如果对象之间的耦合通过消息连接来实现,则这种耦合就是交互耦合。交互耦合应尽可能松散。继承耦合与交互耦合相反,应该提高继承耦合程度。继承是一般化类与特殊类之间耦合的一种形式。通过继承关系结合起来的基类和派生类,构成了系统中粒度更大的模块。彼此之间应该越紧密越好。5.强内聚内聚衡量一个模块内各个元素彼此结合的紧密程度。内聚定义为:设计中使用的一个构件内的各个元素,对完成一个定义明确的目的所做出的贡献程度。在设计时应该力求做到高内聚。在面向对象设计中存在下述3种内聚:服务内聚。一个服务应该完成一个且仅完成一个功能。类内聚。一个类应该只有一个用途,它的属性和服务应该是高内聚的。一般-特殊内聚。设计出的一般-特殊结构,应该符合多数人的概念。6.可重用软件重用是提高软件开发生产率和目标系统质量的重要途径。重用基本上从设计阶段开始。重用有两方面的含义:一是尽量使用已有的类(包括开发环境提供的类库,及以往开发类似系统时创建的类),二是如果确实需要创建新类,则在设计这些新类的协议时,应该考虑将来的可重复使用性。11.2启发规则1.设计结果应该清晰易懂用词一致。使用已有的协议。减少消息模式的数目。避免模糊的定义。2.一般-特殊结构的深度应适当应该使类等级中包含的层次数适当。一般说来,在一个中等规模(大约包含100个类)的系统中,类等级层次数应保持为7±2。3.设计简单的类应该尽量设计小而简单的类,以便于开发和管理。为使类保持简单,应该注意以下几点:避免包含过多的属性。有明确的定义。尽量简化对象之间的合作关系。不要提供太多服务。在开发大型软件系统时,设计出大量较小的类,需要划分“主题”。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.调整继承层次使用多重继承机制避免出现属性及服务的命名冲突。窄菱形模式。属性及服务命名冲突的可能性比较大。阔菱形模式。属性及服务的名字发生冲突的可能性比较小,但是,它需要用更多的类才能表示同一个设计。使用单继承机制把多重继承结构简化成单一的单继承层次结构。在多重继承结构中的某些继承关系,经简化后将不再存在,这表明需要在各个具体类中重复定义某些属性和服务。窄菱形模式阔菱形模式使用单继承机制把多重继承结构简化成单一的单继承层次结构。在多重继承结构中的某些继承关系,经简化后将不再存在,这表明需要在各个具体类中重复定义某些属性和服务。把多重继承简化为单一层次的单继承方法一:采用聚合把多继承调整为单继承。ABCABC多继承中的一个继承转换为聚合人员多继承研究生教职工在职研究生身份聚合方式研究生教职工人员10..2方法二:采用压平的方式。人员压平方式研究生教职工在职研究生方法三:压平和聚合的方式。人员压平和聚合方式研究生教职工在职研究生研究生信息教职工信息取消继承方法一:把继承结构展平。完全取消继承研究生教职工在职研究生方法二:采用聚合的方法。ABCABC采用聚合取消继承6.对复杂关联的转化把多对多关联转化为一对多关联供货商客户1..*1..*供需合同买方卖方……供货商客户1..*1..*11供货商客户1..*1..*把多元关联转化为二元关联人员项目语言人员项目语言任务项项目名人员语言……1..**111..*1..*把关联类转化为二元关联工作岗位工资公司职员1..*1..*工作岗位工资公司职员1..*1..*117.调整与完善属性学生姓名籍贯奖励……奖励级别时间贡献……学生姓名籍贯……1..*18.ATM系统实例ATM系统问题域子系统的结构11.6设计人机交互子系统在面向对象设计过程中,则应该对系统的人机交互子系统进行详细设计,以确定人机交互的细节。使用由原型支持的系统化的设计策略,是成功地设计人机交互子系统的关键。1.分类用户应该深入到用户的工作现场,仔细观察用户是怎样做他们的工作的。设计者首先应该把将来可能与系统交互的用户分类。几个不同角度:按技能水平分类(新手、初级、中级、高级)。按职务分类(总经理、经理、职员)。按所属集团分类(职员、顾客)。2.描述用户应该仔细了解将来使用系统的每类用户的情况,记录各项信息:用户类型。使用系统欲达到的目的。特征(年龄、性别、受教育程度、限制因素等)。关键的成功因素(需求、爱好、习惯等)。技能水平。完成本职工作的脚本。3.设计

1 / 91
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功