面向对象的设计与技术第四章.ppt
《面向对象的设计与技术第四章.ppt》由会员分享,可在线阅读,更多相关《面向对象的设计与技术第四章.ppt(141页珍藏版)》请在三一办公上搜索。
1、1,面向对象的设计与技术,杨文川北京邮电大学2007年2月,(OOD提高篇),2,面向对象的设计与技术,第四部分 设计(Design),3,第十四讲 设计工作流,面向对象的设计与技术,4,14.1设计工作流,设计工作流是在细化阶段的最后部分和构造阶段的前半部分的主要建模活动,将分析模型转变为设计模型。,需求,分析,设计,实现,测试,初步迭代,I1 I2,In In+1,Im Im+1,初始,细化,构造,移交,管理,配置,5,分析模型和设计模型间的区别,UP推荐,应该由同一个团队负责在从需求到分析和设计(最终到实现)来获取制品(例如用例),而不是采用一个分析师团队和一个独立的设计师团队。UP是围
2、绕可交付的制品和里程碑来组织团队的,而不是围绕特定的任务来组织团队的。,6,14.2设计工作流焦点,在分析中,焦点是创建系统的逻辑模型,该模型捕获系统为满足用户需求而必须提供的功能“作什么”。设计的目的是说明如何才能完全实现这个功能“如何作”。在设计中,OO设计师决定战略性设计问题,诸如对象持久性和分布,并且相应地创建设计模型。项目经理和设计师也应该制定政策以处理战术性设计问题。,7,14.3设计制品元模型,接口是设计中很重要的构架角色,需要花很多时间来寻找共建模关键接口。分析模型和设计模型之间存在简单的trace关系。设计模型建立在分析模型的基础之上,也可以看做是分析模型的精化和细化,8,例
3、子,一个包含许多设计子系统的设计系统,需要维护两个模型吗?,理想世界中,系统将具有单一模型,CASE工具能够给出那个模型的分析视图或者设计视图,实际是:。,10,分析视图的价值,分析视图提供系统的“大场景”。分析视图可能只包括在详细设计视图中的1%到10%的类,它的价值在于:介绍新人加入项目在交付几个月或几年后重新理解系统。理解系统是怎样满足客户需求以及提供可跟踪性。计划维护和增强。理解系统的逻辑构架。外包系统的构造。如果需要做以上的任何一项,那么绝对需要保留分析视图。,11,采用何种策略?,是否需要分析视图关键在于项目大小。如果系统庞大、复杂或是战略性的,或者具有很长项目规划生存期就应该保留
4、分析视图(选择策略3和策略4)。但需要考虑分析模型和设计模型步调不一致,你的项目真能接受吗?如果系统比较小(少于200个设计类),设计模型本身小得可以理解,如果系统不是战略性的或只有很短的规划生存期,独立的分析模型也就不需要了。因此只能在策略1和策略2之间选择了,对于中型系统来说,起着决定性因素的是UML的CASE工具的能力。有些CASE工具维护着单一的底层模型,并允许通过过滤和信息隐藏设法重新从设计模型获得“分析”视图。方案需要综合考虑。,12,14.4设计工作流细节,设计中主要参与者有构架设计师、用例工程师和组件工程师。,13,14.5制品,设计模型是分析模型的细化,设计模型添加了详细信息
5、和特定技术的解决方案。所有的属性和操作(包括返回值类型和参数列表)必须完整。设计模型由下列各项组成:设计子系统。设计类。接口。用例实现(设计)。部署图。接口是在设计中产生的关键制品之一。,14,14.4设计工作流细节,分析类是系统中类的高级概念视图,可以被分解成一个或多个接口或者设计类。当进行设计(物理建模)时,这些概念上的类需要被实现成一个或多个物理的设计类和/或接口。,15,小结,本讲介绍设计工作流,关于确定分析模型中说明的功能将如何被实现。设计工作流是在细化阶段最后部分和构造阶段前半部分的主要建模活动。设计模型包括:一个设计系统和若干设计子系统,用例实现(设计),接口,设计类,初步的部署
6、图。相互之间存在跟踪关系的有:设计模型与分析模型,设计系统与分析系统,一个或多个设计子系统与一个分析包。需要分别维护分析模型和设计模型的系统是:庞大的,复杂的,战略性的,受经常变更所支配的,期望长期运行的和外包的。,16,17,第十五讲 设计类,面向对象的设计与技术,18,15.1什么是设计类,设计类是已经完成了规格说明并且达到能够被实现程度的类。在分析中,类来源于问题域,是一组描述你试图去解决问题的需求,以作为分析类的来源。设计类来自两个方面:通过分析类的精化得到的问题域,这里的精化包括添加实现细节。解域它是实用类库和可复用组件的领域。,19,15.2 设计类,分析是关于建模系统应当做什么,
7、设计就是关于建模那些行为如何被实现。分析类是非常高级的抽象,操作集合只是捕获了类关键服务的骨干。在将分析类精化成设计类时就必须全面说明所有的操作和属性,通常会发现类太大了。如果发生这种情况,就应法将它分解成两个或者更多个类。应当记住,你所要设计的类是一些能真正做好一两件事情的小的、自含的而且内聚的单元。,20,15.3设计类剖析,在设计中必须准确地说明类是如何履行它们的职责,必须完成以下事情:完整的属性集合,包括详细说明的名称、类型、可视性和一些默认值(可选的)。将分析类指定的操作转化成一个或多个方法的完整集合。,21,15.4形式良好的设计类,一个形式良好的设计类应具备四个基本特征:完整的和
8、充分的。原始的。高内聚。低耦合。设计类将会被交给程序员去编写实际的源代码,也可以在CASE工具支持的情况下由模型自身直接生成代码。设计类需要被完整地说明,规格说明过程部分决定了这个类是不是“形式良好”。,22,完整性和充分性,完整性就是要提供给类客户他们可能预期的所有功能,满足客户所有合理的期望。充分性就是要保证类的所有方法注重实现隐藏在类背后的意图,恰好包含所需要的方法集合并且没有多余的方法。完整性和充分性的金科玉律是:类只做用户期望它们做的不多也不少。,23,原始性,方法应当设计成提供单一的、原始的原子服务。类不应提供多种方法做同样一件事情,这样容易使类客户混淆,并且会导致维护负担和一致性
9、的问题。目标是:应当提供尽可能小而简单的方法集合,24,高内聚,每个类都应当创建唯一的抽象概念模型,并且具有支持类意图的方法集合这就叫做内聚性。内聚性是类最理想的特征之一,内聚的类通常容易理解、复用和维护。内聚的类具有一小组紧密联系的职责。每个方法、属性和类关联都被特别地设计用以实现这个小而专注的职责集合。,25,低耦合,特定的类应当仅与那些可以帮助它实现职责的类产生关联,并只关联那些存在真正语义链接的类这就是低耦合性。耦合是对象建模中最可怕的敌人,所以必须真正地事先尽量限制类间的关系,目的是尽可能最小化耦合。高度耦合的对象模型会导致系统不可理解和不可维护Spaghetti Code,26,1
10、5.5继承,在分析中只在那些相互之间存在清晰明确的is a关系的设计类间才使用继承。但在设计中你可以选择使用继承来复用源代码。这是不同的策略,因为你正在使用继承来使子类的实现更加灵活和轻松,而不是使用继承表示父类和子类之间的业务关系。,27,继承可能带来的问题,继承是OO中产生多态的机制,但也导致一些问题:在两个或多个类之间可能产生的耦合中,它是最强的耦合形式。类层次中的封装是脆弱的,基类改动会直接波及子类变化。它是一种非常牢固的关系类型,在运行时候是固定的,这就意味着它是类之间的关系中最不易改变的一种类型。,28,聚合与继承,使用聚合取代继承可以得到正确的语义,得到了更加灵活并且语义正确的模
11、型。一个重要的通用原则子类通常应该是描绘“is kind of”。而不是描绘“Is role played by”。,例子,考虑:John由Programmer提升为Manager,30,多重继承,从多于一个的父类继承实现,这就是多重继承。多重继承的几个要点如下:多重继承涉及的所有父类在语义上必须正交(相互间成直角)。is kind of和可替换性原则必须适用于子类和它的所有超类之间。典型地,超类应当没有共同的父类,否则,继承层次就会形成循环。,31,例子,有效使用多重继承的通常方法是Mixin类,32,继承与接口实现,当你关心从超类继承一些实现细节(方法、属性和关联)时,只需要使用继承。这是
12、一种复用方式,事实上在OO的早期它被当做一种主要的复用机制。到今天,设计师们已经认识到有时侯继承施加了难以接受的约束并且在某种程度上已经偏移了它的用途。当希望定义契约而不关心继承实现细节时,接口实现是很有用的。因为在接口实现中并不真正继承任何事物,所以在某些方面它比继承更加灵活和健壮。,33,区别,继承和接口实现具有一些共性,都允许你定义子类必须实现的契约(方法集合)。但这两种技术有着非常不同的语义和用途。从继承中可以得到两件事物:接口基类的公共方法。实现基类的属性、关联、保护方法和私有方法。从接口实现仅得到一件事物:接口一组没有实现的公共操作。,34,15.6模板,模板允许参数化类型,这意味
13、着,你可以根据占位符或参数定义类,而不去说明属性、方法返回值和方法参数的实际类型。通过用实际值代替占位符就可以创建新的类。可以通过使用bind构造型化的依赖关系来实例化模板这被称为显式绑定。,35,例子,36,15.7嵌套类,嵌套类声明在它的外层类的名字空间中,只能通过那个外层类或者外层类的对象对它进行访问。只有外层类或者外层类的对象才能创建和使用嵌套类的实例。,37,例子,窗口类HelloFrame从父类Frame类中继承了基本的窗口行为。HelloFrame具有名为MouseMonitor的嵌套类,嵌套类从它的父类MouseAdapter继承了处理鼠标事件的能力。,38,小结,本讲介绍设计
14、类设计类是规格说明已经完成并且达到能够被实现程度的类,有两个来源:问题域和解域设计类具有完整的规格说明:属性集合和方法:形式良好的设计类展现特定特征:完整性,充分性,原始性,高内聚,低耦合只有在两个设计类之间存在清晰明确的“is a”关系或为了复用代码时才使用继承多重继承允许一个类有多个父类。注意继承与接口实现的区别联系模板允许你“参数化”类型嵌套类是在一个类内部定义另一个类,39,40,第十六讲 精化分析关系,面向对象的设计与技术,41,16.1设计关系,当转向设计时,你必须将分析类之间的关系精化成设计类之间的关系。分析中捕获的许多关系不能像它们显示的那样直接地实现,但是又必须做到这一点。例
15、如,没有一种普遍使用的OO编程语言能直接支持双向关联、关联类或者多对多关联。为了创建一个设计模型,你必须说明如何实现这些关联。,42,16.2精化设计关系,精化设计关联包括几个过程:在恰当的地方将关联精化成聚合或是组合关系。实现关联类。实现一对多关联。实现多对多关联。实现双向关联。所有的设计关联必须具有:导航性。两端的多重性。所有设计关联应至少在目标端有一个角色名称。,43,16.3聚合和组合,在设计中,可以将关联关系精化成聚合或组合关系。聚合这是一种松散的对象间关系计算机和它的外围设备就是一例。组合这是一种非常强的对象间关系树和它的树叶之间的关系。,44,16.4聚合语义,聚合是整体一部分关
16、系的一种,一个对象(整体)使用另一个对象(部分)的服务。聚合语义总结如下:聚合有时能够不依赖部分而存在,有时又不能。部分可以独立于聚合而存在。如果有一些部分遗失,聚合会给人一种不完整的感觉。部分的所有权可以由几个聚合来共享。,45,聚合的特性,聚合是可传递的。聚合是非对称的。这意味着对象永远不会成为它自身的部分。,46,16.5组合,组合是一种更强形式的整体部分聚合关系,并且具有传递性和非对称性。聚合和组合的关键区别在于,在组合中部分脱离了整体就不能独立存在。此外,组合中的每个部分属于一个整体,也只能属于一个整体,而在聚合中一个部分可以由几个整体共享。,47,组合语义,组合的语义总结如下:部分
17、在某一时刻仅仅只能属于一个组成。组成唯一他负责处理它的所有部分,这意味着负责它们的创建和销毁。倘若对于部分的职责由其他的对象来承担的话,组成也就可以放松这些职责。如果一个组成销毁的话,它必须将它所有的部分销毁,或者把负责处理它们的权利交给其他的对象。注意:因为组合唯一地负责处理和安排它的所有部分的生命期,所以当创建一个组成的时候,组成对象也就创建了它的部分。类似地,当你销毁一个组成时,组成必须将它所有的部分全部销毁,或者安排另外一个组合来接受它们。,48,组合与属性,组合语义和属性的语义非常相似。两者都具有由它们的主人控制的生命期;脱离了它们的主人就不能独立存在。事实上,属性正好相当于组成类和
18、该属性的类之间的组合关系。那为什么我们要用两种方法表达相同的事物呢?这有两个原因。属性可以是原始数据类型。如int和double像Time、Date和String这些有特定功能的类被普遍使用。比较好的方法是把这样的类建模成属性。底线是:如果你有原始类型或者实用类,就应当考虑使用属性而不是组成关系。,49,16.6如何精化分析关系,按照下面的步骤进行:如果缺少的话,添加多重性和角色名称到关联。确定关联的哪一端是整体,哪一端是部分。考虑整体一端的多重性,如果正好是1,那么可能能够使用组合;否则,就必须使用聚合。添加从整体到部分的导航性,设计关联必须是单向的。这使你到达了一个阶段,你已经将关联精化成
19、了聚合或是组合。,50,16.7一对一关联,一对一关联几乎都是变成组合。一对一关联暗示了两个类之间的一种非常强的关系,值得注意的是它们是否可以合并成一个单独的类,而不违背任何设计类的设计原则,51,16.8多对一关联,多对一关联发生在整体一端的多重性大于1,而部分一端的多重性恰好是1时。因为整体一端有许多,当部分被许多整体共享的时侯不能用组合,但可以使用聚合。,52,16.9一对多关联,在一对多关联中,在关系的部分一端有一个对象的汇集。为了实现这样一个关系,你必须使用由实现语言提供的固有的汇集支持,或者使用汇集类。大部分的OO语言都提供对对象汇集的最小内建支持(如数组)。数组是对象引用的索引汇
20、集,通常限定为具有一个最大值。内建数组的优点是它们趋于非常快。然而,相对于其他形式汇集的不灵活性而言,速度的优势被抵销。汇集比内建的汇集更加有力和灵活。,53,16.10汇集,汇集类是这样的类,它的实例专门管理其他对象的汇集。大部分的语言都能提供可用的汇集类的标准库(或是其他实用设施)。优秀的OO设计和实现的一个关键是掌握汇集类。所有的汇集类具有下列方法:向汇集中添加对象。从汇集中删除对象。在汇集中检索对象的索引。遍历汇集,即从头到尾步进地检索汇集中的对象。,54,汇集建模策略,汇集建模三个基本的策略:显式地建模汇集类,优点非常明显,缺点是给设计模型添加了许多混乱。汇集类的选择经常是战术的实现
21、决定,可留给开发人员去做;战略性的实现决定,用特定的汇集类来替换一对多关联。告诉CASE工具如何实现每个特定的一对多关联。许多 CASE工具允许为每个一对多关联指派一个特定的汇集类(如添加Vector到适当的关系末端)。说明汇集的语义,但是不要说明任何实现类。重要的是使用汇集时不要“过度建模”。实际使用的汇集类型常常是战术性的,可以将它留给程序员在实现的时候去作合理的假设。,55,简单OCL汇集,OCL(Object Constraint Language)是表示对象约束的形式化语言,是UML1.4规格说明的组成部分。它提供了一组通用的汇集类,提供了OO实现语言中可用的汇集类型的有用范例。OC
22、L汇集是Set、Bag和Sequence。在分析的晚期阶段或是设计的初期阶段,当需要定义一些汇集语义但又不想引入实现语言依赖性的时候,可以选择使用OCL汇集。,56,OCL汇集内容,Set像数学集合重复对象是不允许的。集合中的元素没有索引,并且元素的顺序是随机的。Bag比Set的约束要少一点,允许重复,除此以外,它的语义与Set的语义相同。Sequence同样接受重复对象,但是有索引和排序。这意味着存储在Sequence中的对象就像在数组中一样有索引,并且对象总是维护它们在汇集中的相对位置。,57,映射表,映射表是另一种汇集类类型,也称字典,有点像带有两个字段(关键字和数值)的数据库表。映射表
23、被设计成能根据结定的关键字快速地查找到相应的数值。映射表不是OCL的组成部分,因此如果你想使用映射表,那么你就需强制说明一个语言依赖的实现。,58,例子,因为汇集使用散列表索引,给定特定的关键字,找到对应的数值非常迅速。,59,16.11具体化关系,有些类型的关系是纯分析制品,而且它们自身并不由任何一种普遍使用的OO语言所直接支持。取得这些分析关系并且实现它们的过程通常被称做具体化。需要具体化以下的分析关系:多对多关联。双向关联。关联类。,60,多对多关联,OO语言无法直接支持多对多关联,因此必须被具体化成正常的类、聚合、组合或者依赖。首先你必须确定多对多关联的哪一端是整体,然后再使用恰当的聚
24、合或是组合。,61,双向关联,普通的OO语言不支持真正的双向关联,因此必须将这些双向关联具体化成两个单向关联或依赖,62,关联类,关联类是纯粹的分析制品,在任何普遍使用的OO编程语言中都不能直接实现。必须要将它们从设计模型中除去。将关联类具体化成正常的类,联合使用聚合、组合或者甚至依赖来捕获关联类的语义这可能涉及对模型添加约束。要确定关联哪一端是整体以及使用相应的组合、聚合和导航性。,63,例子,当具体化关联时,已经失去了关联类的语义,但可通过添加包含适当约束的注解来恢复这些语义。,64,小结,本讲介绍将分析关系转化成可实现的设计关系聚合有时能够独立于部分而存在,有时不能。组合是一种强形式的聚
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 设计 技术 第四
链接地址:https://www.31ppt.com/p-6034408.html