您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > 软件工程第11章面向对象设计
第11章面向对象设计11.1面向对象设计的准则11.2启发规则11.3软件重用11.4系统分解11.5设计问题域子系统11.6设计人机交互子系统11.7设计任务管理子系统11.8设计数据管理子系统11.9设计类中的服务11.10设计关联11.11设计优化综述OOA分析:是提取和整理用户需求,并建立问题域精确模型的过程。OOD设计:是把分析阶段得到的需求转变成系统实现方案的过程。OOD方法:从OOA到OOD,是一个逐渐细化和扩充模型的过程;由于概念一致,OOA与OOD边界模糊,可平滑过渡,分析和设计活动是一个多次反复迭代的过程。OOD划分:OOD细分为系统设计(总体)和对象设计(详细);系统设计:确定系统的实现策略和软件结构(高层结构)。对象设计:确定解空间中的类、关联、接口形式及实现服务的算法。系统与详细设计关系:系统设计与对象设计之间的界限,比分析与设计之间的界限更模糊,不再对它们加以区分。11.1面向对象设计的准则目的:坚持设计准则,提高设计质量,减少系统开销(主要是维护费用);原理:第5章讲述的软件设计原理,同样适应OOD,只是增加一些与面向对象方法密切相关的新特点,从而形成面向对象设计准则。1.模块化OOD很自然地支持了模块化的设计原理,对象就是模块。它是把数据结构和操作这些数据的方法紧密地结合在一起所构成的模块。2.抽象面向对象方法完全是一种抽象机制,实现了数据和过程的抽象;如类实际上就是一种抽象类型,对外提供开放的公共接口(类的规格说明和协议)的实现过程和对内部数据元素的操作对外都是透明的。3.信息隐藏对象的封装机制很自然实现信息隐藏:类结构分离了接口与实现,从而支持了信息隐藏。对于类的用户来说,属性的表示方法和操作的实现算法都应该是隐藏的。4.弱耦合耦合指一个软件结构内不同模块之间互连的紧密程度。在OOM中,对象是最基本的模块,因此,耦合主要指不同对象之间相互关联的紧密程度。对象通过消息实现耦合,而不知类的具体实现细节。对象之间的耦合可分为两大类:1)交互耦合:对象之间的耦合通过消息连接来实现。要求:尽量降低消息连接的复杂程度(消息参数个数和复杂程度),减少对象发送或接收的消息数,可实现交互松耦合。2)继承耦合:通过继承机制实现的基类和子类的耦合,耦合越强越好。子类多继承父类的数据和方法,可以实现强耦合。5.强内聚内聚衡量一个模块内各个元素彼此结合的紧密程度。在设计时应该力求做到高内聚。在OOD中存在下述3种内聚:1)服务内聚:一个服务应该完成一个且仅完成一个功能;2)类内聚:设计类原则,一个类应该只有一个用途,它的属性和服务应该是高内聚的。3)一般-特殊内聚:从抽象到具体的设计过程(类继承机制)可以实现这种类聚。继承耦合的强耦合与此一致。6.可重用软件重用是提高软件开发生产率和目标系统质量的重要途径。重用有两方面的含义:一是尽量使用已有的类(类库或已建立的类),二是如果确实需要创建新类,则在设计这些新类的协议时,应该考虑将来的可重复使用性。11.2启发规则与结构设计规则类似,通过OOD实践也总结了一些设计规则:1.设计结果应该清晰易懂设计结果清晰、易读、易懂,是提高软件可维护性和可重用性的重要措施。保证设计结果清晰易懂的主要因素为:用词一致;使用已有的协议;避免模糊的定义等。2.一般-特殊结构的深度应适当类等级的层数要适当。一般说来,在一个中等规模(大约包含100个类)的系统中,类等级层次数应保持为7±23.设计简单的类应该尽量设计小而简单的类,以便于开发和管理。经验表明,如果一个类的定义不超过一页纸(或两屏),则使用这个类是比较容易的。简单类设计应注意:1)避免类的属性过多:属性过多,则功能太多,表明类过分复杂;2)有明确的定义:分配给每个类的任务应该简单,能用一两个简单语句描述清楚;3)简化对象之间的合作关系:对象协同完成任务的机会尽量要减少;4)不要提供太多服务:类提供的服不要过多。4.使用简单的协议一般说来,消息中的参数不要超过3个(不是绝对的),经验表明,通过复杂消息相互关联的对象是紧耦合的,对一个对象的修改往往导致其他对象的修改。5.使用简单的服务面向对象设计出来的类中的服务通常都很小,一般只有3~5行源程序语句,可以用仅含一个动词和一个宾语的简单句子描述它的功能。6.把设计变动减至最小设计的质量越高,设计结果保持不变的时间也越长。理想的设计变动曲线如图11.1所示。在设计的早期阶段,变动较大,随着时间推移,设计方案日趋成熟,改动也越来越小了。11.3软件重用11.3.1概述1.重用重用也叫再用或复用,是指同一事物不作修改或稍加改动就多次重复使用。广义地说,软件重用可分为以下3个层次:1)知识重用:最高层次、最大规模的重用(如软件工程知识);2)方法和标准的重用(如面向对象方法或国家软件文档编写指南);3)软件成分的重用:类库,对象等。1)、2)重用属于知识工程研究的范畴,仅讨论3)软件成分重用。2.软件成分的重用级别软件成分的重用可以进一步划分成以下3个级别:1)代码重用:程序代码的重用。包括:源代码剪贴:这是最原始的重用形式。缺点:复制或修改原有代码时可能出错,存在严重的配置管理问题等。源代码包含:许多程序设计语言都提供包含(include)库中源代码的机制。特点:若修改库中源代码,所有包含它的程序都必须重新编译;继承:利用继承机制重用类库中的类时,无须修改已有的代码,就可以扩充或具体化在库中找出的类。2)设计结果重用设计结果重用:指的是重用某个软件系统的设计模型。这个级别的重用有助于把一个应用系统移植到完全不同的软硬件平台上。3)分析结果重用分析结果重用:一种重用某个系统的分析模型的高级别重用。这种重用特别适用于用户需求未改变,但系统体系结构发生变化的场合。3.典型的可重用软件成分可能被重用的软件成分主要有以下10种:1)项目计划:软件项目计划(项目规模、时间进度、资源分配、质量等计划)的基本结构和内容都可以跨项目重用的。2)成本估计:以类似功能模块特征,重用对该功能的成本估计结果。3)体系结构:如特定应用领域的体系结构(体系结构风格),可作为重用的设计框架。4)需求模型和规格说明:类和对象的模型及规格说明,传统软件工程方法开发的分析模型(数据流图),也是可重用的。5)设计:SD和OOD中,软件体系结构、数据结构、接口设计和过程设计,系统和对象设计是可重用的。6)源代码:用兼容的程序设计语言书写的、经过验证的程序构件。7)用户文档和技术文档:用户文档和技术文档的部分或全部重用。8)用户界面:重用最广泛的软件成分,GUI软件占到一个应用程序的60%代码量,重用的效果非常显著。9)数据:被重用的数据包括内部表、列表和记录结构,以及文件和完整的数据库。10)测试用例:一旦设计或代码构件将被重用,相关的测试用例应该“附属于”它们也被重用。11.3.2类构件在OOD中,“类”是比较理想的可重用软构件,不妨称之为类构件。类构件有3种重用方式:实例重用、继承重用和多态重用。下面进一步讲述与类构件有关的内容。1.可重用软构件应具备的特点类构件作为软件构件,就要象制造工业生产线的构件那样可被重用。1)模块独立性强:功能单一完整,实现对外透明,且经反复测试被确认是正确的软构件。2)具有高度可塑性:可重用的软构件必须具有高度可裁剪性,可以定制。3)接口清晰、简明、可靠:软构件应提供清晰、简明、可靠的对外接口,而且还应该有详尽的文档说明,以便重用。2.类构件的重用方式1)实例重用:使用类的构造函数创建类的实例,然后以消息机制调用而完成需要完成的工作。对象的引用也是实例重用的一种。2)继承重用:继承提供了一种对已有类构件进行重用的机制。3)多态重用:利用多态性可以重用同一接口提供的多种不同功能。如C++语言的虚函数。11.3.3软件重用的效益1)质量:可重用软件构件已被证明是正确的,且没有缺陷。2)生产率:在软件开发过程中,大量使用各种分析、设计构件,必然减少工作量,生产率必然得到提高。3)成本:软件重用带来了软件成本的减少。11.4系统分解“分而治之,各个击破”人类解决复杂问题时普遍采用的策略。复杂系统的开发策略:先把系统分解成若干个比较小的部分,然后再分别设计每个部分。这样做有利于降低设计的难度,有利于分工协作,也有利于维护人员对系统理解和维护。子系统:系统的主要组成部分称为子系统。通常根据所提供的功能来划分子系统。子系统的划分按照独立性和完整性的原则实施。OOD模型(解空间对象模型):与面向对象分析模型(问题空间对象模型)一样,由主题、类与对象、结构、属性、服务5个层次组成。OOD模型的组成:在大多数系统的面向对象设计模型,在逻辑上都由4大部分组成。在目标系统中分别对应:问题域子系统、人机交互子系统、任务管理子系统和数据管理子系统。图11.2典型的面向对象设计模型1.子系统之间的两种交互方式子系统之间的交互方式:客户-供应商(Client-supplier)关系和平等伙伴(peer-to-peer)关系。1)客户-供应商关系:在这种关系中,作为“客户”的子系统调用作为“供应商”的子系统,后者完成某些服务工作并返回结果。特点:客户子系统必须了解作为供应商的子系统的接口,然而后者却无须了解前者的接口,因为任何交互行为都是由前者驱动的。2)平等伙伴关系:各个子系统地位平等,可以相互调用,因此,每个子系统都必须了解其他子系统的接口。特点:随着子系统数增加,结构复杂,难以组织总的说来,单向交互比双向交互更容易理解,也更容易设计和修改,因此应该尽量使用客户-供应商关系。2.组织系统的两种方案子系统组成大系统时,有水平层次和垂直块组织两种方案:1)层次组织:这种组织方案把软件系统组织成一个层次系统,每层是一个子系统。上层和下层自系统形成C/S结构层次结构的两种模式:封闭式和开放式:封闭式,每层子系统仅仅使用其直接下层提供的服务;开放式,任一层次可以向下跨层次调用。2)块状组织:把软件系统垂直地分解成若干个相对独立的、松耦合的子系统,一个子系统相当于一块,每块提供一种类型的服务。层次与块的混合组织:如下图所示图11.3典型应用系统的组织结构11.5设计问题域子系统设计问题域子系统:就是如何将问题域分析模型(逻辑模型)转变为求解域模型(物理模型)的过程。在OO分析与OO设计之间没有明确的分界线(概念上),对于问题域子系统更是如此。但是,分析与设计毕竟是性质不同的两类开发工作,分析工作与具体实现无关,设计工作则受具体实现环境的约束。在开始进行设计工作之前,设计者应该了解本项目预计要使用的编程语言,可用的软构件库(主要是类库)以及程序员的编程经验。设计思想:OOA得出的问题域精确模型,为设计问题域子系统建立了完整的框架(框架的稳定性)。通常,面向对象设计仅需从实现角度对问题域模型做一些补充或修改,主要是增添、合并或分解类与对象、属性及服务,调整继承关系等等;当问题域子系统过分复杂庞大时,应该把它进一步分解成若干个更小的子系统。OOD可能对OOA所得出的问题域模型做的补充或修改如下:1.调整需求有两种情况会导致修改分析模型所确定系统需求:一是用户需求或外部环境发生了变化;二是分析员对问题域理解不正确不完整,以致面向对象分析模型不能正确反映用户的真实需求。OOD阶段所做的需求调整,要修改面向对象分析结果,然后再把这些修改反映到问题域子系统中。2.重用已有的类重用已有类(代码重用)实现分析模型;若没有可以重用类而需要创建新类时,则在设计这些新类时需要考虑其可重用性。对于已有的可重用类,典型重用方法和过程如下:1)选择可能被重用的已有类,标出类中对本问题无用的属性和服务,选择那些能使无用的属性和服务最少的类;2)从被重用的已有类派生出问题域类(继承重用类而产生问题域类);3)标出从已有类继承来的属性和服务,而无须在分析类内定义;4)修改与问题域类相关的关联,包括与被重用的已有类相关的关联。3.问题域类的组合在OOD过程中,通过引入一个根类而把问题域类组合在一起。但建议按照主题划分和组合设计。4.增添一般化类以建立公共协
本文标题:软件工程第11章面向对象设计
链接地址:https://www.777doc.com/doc-3680280 .html