




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1 第第11章章 面向对象设计面向对象设计 面向对象的设计原则面向对象的设计原则 系统设计系统设计 对象设计对象设计 设计模式设计模式 RUP的设计活动的设计活动 RUP的实现活动的实现活动 2 11.1 面向对象的设计概念及原则面向对象的设计概念及原则 1、有关概念、有关概念 面向对象设计将面向对象分析创建的分析面向对象设计将面向对象分析创建的分析 模型变换为设计模型,它将作为软件构造的蓝图。模型变换为设计模型,它将作为软件构造的蓝图。 但由于面向对象分析与设计活动是一个迭代与演但由于面向对象分析与设计活动是一个迭代与演 化的过程,概念与表示方法的一致性使得分析与化的过程,概念与表示方法的一
2、致性使得分析与 设计阶段平滑过渡。设计阶段平滑过渡。 传统的设计方法将问题域分解成一系列任传统的设计方法将问题域分解成一系列任 务来完成,这些任务形成过程式软件的基本结构。务来完成,这些任务形成过程式软件的基本结构。 面向对象方法把问题域作为一系列相互作用的对面向对象方法把问题域作为一系列相互作用的对 象,在此基础上构造出基于对象的软件系统结构。象,在此基础上构造出基于对象的软件系统结构。 3 面向对象设计包括:面向对象设计包括: (1)系统设计)系统设计 设计系统体系结构,实现分布式协同计设计系统体系结构,实现分布式协同计 算和资源利用。算和资源利用。 对象的储存。对象的储存。 用户界面。用
3、户界面。 (2)对象(类)设计对象(类)设计 对象设计是根据具体的实现策略,对分对象设计是根据具体的实现策略,对分 析模型进行细化与扩充。析模型进行细化与扩充。 通过系统设计和对象设计产生设计模型,通过系统设计和对象设计产生设计模型, 是进一步完成系统实现的基础。是进一步完成系统实现的基础。 4 2、OO设计原则设计原则 (1)(1)封装封装 是将一个完整的概念组成一个独立的单元,然后通过是将一个完整的概念组成一个独立的单元,然后通过 一个名字来引用它。在一个名字来引用它。在OO系统的较高层次,将一些相关系统的较高层次,将一些相关 的应用问题封装在一个子系统中,对子系统的访问是通过的应用问题封
4、装在一个子系统中,对子系统的访问是通过 访问子系统的接口实现的;在较低的层次将具体对象的属访问子系统的接口实现的;在较低的层次将具体对象的属 性和操作封装在一个对象类中,通过类的接口访问其属性。性和操作封装在一个对象类中,通过类的接口访问其属性。 (2 2)抽象)抽象 OO方法不仅支持过程抽象还支持数据抽象。类封装方法不仅支持过程抽象还支持数据抽象。类封装 了数据和操作数据的方法,类是一种包含过程抽象的数据了数据和操作数据的方法,类是一种包含过程抽象的数据 抽象,它对外提供的公共数据接口构成了类的规格说明抽象,它对外提供的公共数据接口构成了类的规格说明 (类的协议)。使用者无需知道类中的具体操
5、作是如何实(类的协议)。使用者无需知道类中的具体操作是如何实 现的,无需了解内部数据的具体表现方式,只要搞清它的现的,无需了解内部数据的具体表现方式,只要搞清它的 规格说明,就可通过接口定义的操作访问类的数据。规格说明,就可通过接口定义的操作访问类的数据。 5 (3)信息隐蔽)信息隐蔽 信息隐蔽是通过对象的封装实现的。类的结构分离信息隐蔽是通过对象的封装实现的。类的结构分离 了接口和实现,对于类的使用者来说,属性的表示和操了接口和实现,对于类的使用者来说,属性的表示和操 作的实现都是隐蔽的。作的实现都是隐蔽的。 (4 4)强内聚)强内聚 服务内聚服务内聚: 一个服务完成且仅完成一个功能。一个服
6、务完成且仅完成一个功能。 类内聚类内聚: 一个类的属性和操作全部都是完成某个一个类的属性和操作全部都是完成某个 任务所必须的,其中不包括无用的属性和操作。任务所必须的,其中不包括无用的属性和操作。 层内聚层内聚: 把向用户或高层提供相关服务的功能放把向用户或高层提供相关服务的功能放 在一起,而将其他内容排除在外。为了保证适当的层内在一起,而将其他内容排除在外。为了保证适当的层内 聚,往往有严格的层次结构,高层能够访问低层的服务,聚,往往有严格的层次结构,高层能够访问低层的服务, 而低层却不能访问高层的服务(下图描述了这种关系)。而低层却不能访问高层的服务(下图描述了这种关系)。 6 用户界面用
7、户界面 应用逻辑应用逻辑 访问操作访问操作 系统系统 访问数访问数 据库据库 网络通信网络通信 应用程序的典型层次应用程序的典型层次 处理应用协议处理应用协议 处理连接处理连接 处理包处理包 传输和接收传输和接收 通信系统中的简化层次通信系统中的简化层次 7 层内聚的优点如下:层内聚的优点如下: 替换高层模块对低层模块没有影响。替换高层模块对低层模块没有影响。 可以用等价的层替换低层,但必须复制该层所有可以用等价的层替换低层,但必须复制该层所有 的的API,这样高层才不受影响。,这样高层才不受影响。 其他有关传统方法中的功能内聚、通信内聚、顺其他有关传统方法中的功能内聚、通信内聚、顺 序内聚、
8、时间内聚等概念及提高内聚的原则在序内聚、时间内聚等概念及提高内聚的原则在OO设计设计 中仍然适用。中仍然适用。 8 (5)弱耦合)弱耦合 OO设计中,耦合主要指不同对象(包括类、包)设计中,耦合主要指不同对象(包括类、包) 之间相互关联的程度,如果一个对象过多地依赖于其之间相互关联的程度,如果一个对象过多地依赖于其 它对象来完成自己的工作,不仅使系统的可理解性下它对象来完成自己的工作,不仅使系统的可理解性下 降,还会增加测试、修改的难度,同时降低了类的可降,还会增加测试、修改的难度,同时降低了类的可 复用性和可移植性。但对象不可能完全孤立,当两个复用性和可移植性。但对象不可能完全孤立,当两个
9、对象必须相互联系时,只通过类的公共接口实现耦合,对象必须相互联系时,只通过类的公共接口实现耦合, 不应该依赖于类的具体实现细节。不应该依赖于类的具体实现细节。 设计时尽量减少对象之间发送的消息数(设计时尽量减少对象之间发送的消息数(Meyer 建议的建议的少接口少接口),减少消息中的参数个数(),减少消息中的参数个数(小接口小接口),), 对象之间以明显和直接的方式通信,减少通信的复杂对象之间以明显和直接的方式通信,减少通信的复杂 程度(程度(显式的接口显式的接口)。传统方法中有关降低耦合的原)。传统方法中有关降低耦合的原 则在则在OO方法中仍然适用。方法中仍然适用。 9 (6)可复用)可复用
10、 为了提高工作效率、减少错误、降低成本,就要充分考为了提高工作效率、减少错误、降低成本,就要充分考 虑软件的复用性。复用有两个方面的含义:一是尽量使用已虑软件的复用性。复用有两个方面的含义:一是尽量使用已 有的类,包括开发环境提供的类库和已有的相似类。二是创有的类,包括开发环境提供的类库和已有的相似类。二是创 建新类时考虑将来的可复用性。建新类时考虑将来的可复用性。 类有三种复用方式:类有三种复用方式: 实例复用实例复用 由于类的封装特性,使用者不需要了解内部的实现细节由于类的封装特性,使用者不需要了解内部的实现细节 就可用适当的构造函数创建需要的实例,然后向所创建的实就可用适当的构造函数创建
11、需要的实例,然后向所创建的实 例发送适当的消息,启动相应的服务,完成需要的任务。例发送适当的消息,启动相应的服务,完成需要的任务。 设计一个可复用性好的类是一件很困难的事情,因为,设计一个可复用性好的类是一件很困难的事情,因为, 类提供的服务太多,会增加接口的复杂度,降低类的可理解类提供的服务太多,会增加接口的复杂度,降低类的可理解 性;提供的服务太少,则可能会降低复用性。在设计时,需性;提供的服务太少,则可能会降低复用性。在设计时,需 要根据具体的应用环境和以往的经验来综合考虑,设计出合要根据具体的应用环境和以往的经验来综合考虑,设计出合 适的类构件。适的类构件。 10 继承复用继承复用 当
12、已有的类构件不能通过实例复用满足要求时,可当已有的类构件不能通过实例复用满足要求时,可 以通过继承复用对已有的类构件进行修改,使它满足要以通过继承复用对已有的类构件进行修改,使它满足要 求。在设计时,关键是要设计一个合理的、具有一定深求。在设计时,关键是要设计一个合理的、具有一定深 度的类构件的继承层次结构。每个子类在继承父类的属度的类构件的继承层次结构。每个子类在继承父类的属 性和服务的基础上,加入少量的新属性和新服务,这样性和服务的基础上,加入少量的新属性和新服务,这样 做的好处是父子类的耦合度比较适当,接口简单,易于做的好处是父子类的耦合度比较适当,接口简单,易于 理解。理解。 多态复用
13、多态复用 多态是一种特性,这种特性使得一个属性或变量在多态是一种特性,这种特性使得一个属性或变量在 不同的时期可以表示不同的对象。利用多态性可以使对不同的时期可以表示不同的对象。利用多态性可以使对 象的对外接口更加一般化,系统运行时,根据接收消息象的对外接口更加一般化,系统运行时,根据接收消息 的对象类型,由多态机制启动正确的方法,响应一个一的对象类型,由多态机制启动正确的方法,响应一个一 般化的消息。般化的消息。 11 例如出现下列情况:例如出现下列情况: 操作与数据结构大小有关。操作与数据结构大小有关。 操作与外部设备特性有关。操作与外部设备特性有关。 实现算法将来可能会改进。实现算法将来
14、可能会改进。 为了克服与表示方法、数据结构或硬件特点相关的操为了克服与表示方法、数据结构或硬件特点相关的操 作给复用带来的困难,可以设计一个基类把与上述操作有作给复用带来的困难,可以设计一个基类把与上述操作有 关的服务定义为纯虚函数,然后在复用时先派生出一个新关的服务定义为纯虚函数,然后在复用时先派生出一个新 类,在新类中重新定义上述操作的算法。类,在新类中重新定义上述操作的算法。 设计一个可复用的软件比设计一个普通软件的代价要设计一个可复用的软件比设计一个普通软件的代价要 高,但随着这些软件被复用的次数的增加,分摊到它的设高,但随着这些软件被复用的次数的增加,分摊到它的设 计和实现成本就会降
15、低。计和实现成本就会降低。 12 (7)简洁化设计)简洁化设计 一个软件一个软件60的工作量是维护工作。为了便于维护,的工作量是维护工作。为了便于维护, 现代软件工程越来越重视软件的简洁和易于理解。做好现代软件工程越来越重视软件的简洁和易于理解。做好 以下几点:以下几点: 设计简单的类。避免定义太多的属性和服务。一个设计简单的类。避免定义太多的属性和服务。一个 类的职责要清晰,易于理解也有助于复用。类的职责要清晰,易于理解也有助于复用。 使用简单的协议。对象之间的关联是通过消息触发使用简单的协议。对象之间的关联是通过消息触发 的,消息过于复杂,说明对象之间的耦合程度太紧,不的,消息过于复杂,说
16、明对象之间的耦合程度太紧,不 利于维护。利于维护。 设计结果简洁明了。设计结果(如文档)描述用词设计结果简洁明了。设计结果(如文档)描述用词 准确、清晰、容易理解。准确、清晰、容易理解。 13 11.2 系统设计系统设计 和传统设计的目的相同,是为实现系统需求而对软和传统设计的目的相同,是为实现系统需求而对软 件体系结构进行的设计。系统设计过程包括以下活动:件体系结构进行的设计。系统设计过程包括以下活动: 划分分析模型为子系统。划分分析模型为子系统。 标识问题的并发性。标识问题的并发性。 选择软件体系结构的风格并分配子系统到处理器。选择软件体系结构的风格并分配子系统到处理器。 设计用户界面。设
17、计用户界面。 选择实现数据管理(对象储存)的基本策略。选择实现数据管理(对象储存)的基本策略。 标识全局资源及访问它们所需的控制机制。标识全局资源及访问它们所需的控制机制。 为系统定义合适的控制流机制。为系统定义合适的控制流机制。 考虑边界条件。考虑边界条件。 评审并考虑权衡。评审并考虑权衡。 14 1、划分分析模型、划分分析模型 以定义类、关系和行为的内聚集合,将这些设计元以定义类、关系和行为的内聚集合,将这些设计元 素包装为子系统。素包装为子系统。 定义子系统时应该遵循以下标准:定义子系统时应该遵循以下标准: 子系统应该具有定义良好的接口,通过接口和系统子系统应该具有定义良好的接口,通过接
18、口和系统 的其余部分通信。的其余部分通信。 除了少数的除了少数的“通信类通信类”,在子系统中的类只和该子,在子系统中的类只和该子 系统中的其他类协作。系统中的其他类协作。 子系统的数量不应太多。子系统的数量不应太多。 子系统可以内部划分以降低复杂性。子系统可以内部划分以降低复杂性。 15 当两个子系统互相通信时,可建立客户当两个子系统互相通信时,可建立客户/服务器服务器 (C/S)结构或对等结构结构或对等结构(P2P)。在。在C/S结构中,每个子结构中,每个子 系统只承担一个由客户端或服务器端隐含的角色,服务系统只承担一个由客户端或服务器端隐含的角色,服务 只是单向地从服务器端流向客户端;在只
19、是单向地从服务器端流向客户端;在P2P结构中,服结构中,服 务可以双向流动。务可以双向流动。 在划分子系统时,往往进行分层设计。系统的每在划分子系统时,往往进行分层设计。系统的每 一层包含一个或多个子系统,表示了完成系统功能所需一层包含一个或多个子系统,表示了完成系统功能所需 的功能性的不同抽象层次。抽象级别由与其相关的处理的功能性的不同抽象层次。抽象级别由与其相关的处理 对用户的可见程度来确定。(如对用户的可见程度来确定。(如PPt第第6页应用程序的页应用程序的 典型层次结构)。典型层次结构)。 16 Buschmann及其同事提出以下分层设计方法:及其同事提出以下分层设计方法: 建立分层的
20、标准。即决定子系统将如何被组合成层次的建立分层的标准。即决定子系统将如何被组合成层次的 体系结构。体系结构。 确定层的数量。太多使系统复杂,太少降低子系统的功确定层的数量。太多使系统复杂,太少降低子系统的功 能独立性。能独立性。 命名层并将子系统分配到某个层。确信同层的子系统间命名层并将子系统分配到某个层。确信同层的子系统间 的通信以及和其他层的子系统间的通信遵循软件体系结的通信以及和其他层的子系统间的通信遵循软件体系结 构设计思想。构设计思想。 定义每个层的接口。定义每个层的接口。 精化子系统以建立每个层的类结构。精化子系统以建立每个层的类结构。 定义层间通信的消息模型。定义层间通信的消息模
21、型。 评审层设计以保证层间的耦合度最小。评审层设计以保证层间的耦合度最小。 迭代以精化分层设计。迭代以精化分层设计。 17 2、并发性与基于体系结构风格的子系统分配、并发性与基于体系结构风格的子系统分配 当系统有许多并发行为时,要划分任务,以便简化当系统有许多并发行为时,要划分任务,以便简化 并发行为的设计与编码。在这里,任务就是进程的同义并发行为的设计与编码。在这里,任务就是进程的同义 词。词。 并发任务可通过检查每个对象的状态图而定义,如并发任务可通过检查每个对象的状态图而定义,如 果事件和转换流指明在任意时刻只有单个对象是活跃的,果事件和转换流指明在任意时刻只有单个对象是活跃的, 则是一
22、个控制线程(则是一个控制线程(thread of control)。即使一个对)。即使一个对 象向另一个对象发送消息,只要第一个对象等待响应,象向另一个对象发送消息,只要第一个对象等待响应, 控制线程就继续。如果第一个对象不等待,则控制线程控制线程就继续。如果第一个对象不等待,则控制线程 分叉。因此控制线程是一个进程中的并发代码部分的执分叉。因此控制线程是一个进程中的并发代码部分的执 行。行。 OO系统中的任务是通过孤立控制线程而设计的。系统中的任务是通过孤立控制线程而设计的。 例如当例如当SafeHome系统正在监控其传感器时,它也可以系统正在监控其传感器时,它也可以 拨号到监控站以检验连接
23、。涉及这两个行为的对象(传拨号到监控站以检验连接。涉及这两个行为的对象(传 感器、监控站)是同时活跃的,每个对象参与一个独立感器、监控站)是同时活跃的,每个对象参与一个独立 的控制线程并被定义为独立的任务。如果监控和拨号活的控制线程并被定义为独立的任务。如果监控和拨号活 动顺序地发生,则只设计单个任务。动顺序地发生,则只设计单个任务。 18 对象对象-行为模型对分析类间或子系统间的并发性提行为模型对分析类间或子系统间的并发性提 供了支持。如果类和子系统不是同时活动的,则不需供了支持。如果类和子系统不是同时活动的,则不需 要并发处理,它们可以实现在同一个处理器硬件上;要并发处理,它们可以实现在同
24、一个处理器硬件上; 如果类和子系统必须异步地或同时作用于事件,则被如果类和子系统必须异步地或同时作用于事件,则被 视为并发的。这时有两种选择:分配每个子系统到各视为并发的。这时有两种选择:分配每个子系统到各 自独立的处理器;分配子系统到同一处理器并通过操自独立的处理器;分配子系统到同一处理器并通过操 作系统特性提供并发支持作系统特性提供并发支持。 分布式系统中,分布式系统中, 软件体系结构风格对系统分布方软件体系结构风格对系统分布方 案具有决定性的影响。选择体系结构风格应考虑以下案具有决定性的影响。选择体系结构风格应考虑以下 因素:因素: 19 根据被开发系统的特点:如系统类型、用户需求、根据
25、被开发系统的特点:如系统类型、用户需求、 系统规模、使用方式等;系统规模、使用方式等; 网络协议:不同的网络协议支持不同的体系结构风网络协议:不同的网络协议支持不同的体系结构风 格;格; 可用的软件产品:包括网络软件、可用的软件产品:包括网络软件、OS、DBMS、现、现 有的数据服务器等;有的数据服务器等; 成本及其他:购置硬件及软件成本、新开发软件成成本及其他:购置硬件及软件成本、新开发软件成 本、系统的安装与维护成本。此外,如开发人员对所选本、系统的安装与维护成本。此外,如开发人员对所选 择体系结构风格下实现技术的熟练程度及开发期限等。择体系结构风格下实现技术的熟练程度及开发期限等。 根据
26、以上因素选择合适的体系结构,然后将子系统根据以上因素选择合适的体系结构,然后将子系统 分配到体系结构的节点上。通过使用分配到体系结构的节点上。通过使用UML的配置图为系的配置图为系 统建立多进程的分布式的体系结构统建立多进程的分布式的体系结构。 20 3、任务管理设计、任务管理设计 当一个节点上有多个控制流存在时,需要设计一个对当一个节点上有多个控制流存在时,需要设计一个对 这些控制流进行协调和管理的控制流(即进程或任务)。这些控制流进行协调和管理的控制流(即进程或任务)。 如设计一个进程,由它负责系统的启动和初始化、其他进如设计一个进程,由它负责系统的启动和初始化、其他进 程的创建与撤销、资
27、源的分配、优先级的授予等工作。程的创建与撤销、资源的分配、优先级的授予等工作。 用以下几步完成任务管理的设计:用以下几步完成任务管理的设计: 确定要执行的任务并识别它的特征。确定要执行的任务并识别它的特征。 确定任务的优先级。确定任务的优先级。 创建协调任务来协调所有其他任务。创建协调任务来协调所有其他任务。 为每个任务设计对象,并定义它们之间的关系。为每个任务设计对象,并定义它们之间的关系。 任务应该用模版详细描述,包括任务名、描述、优先任务应该用模版详细描述,包括任务名、描述、优先 级、服务、由谁管理、如何通信以及在层次中的位置,便级、服务、由谁管理、如何通信以及在层次中的位置,便 于编程
28、人员实现。于编程人员实现。 21 4、全局资源管理、全局资源管理 全局资源包括物理资源(磁盘驱动器、处理器、通全局资源包括物理资源(磁盘驱动器、处理器、通 信线路)或逻辑资源(文件、数据库、显示窗口)。不信线路)或逻辑资源(文件、数据库、显示窗口)。不 但有访问权限的问题,还有访问冲突的问题。所以,应但有访问权限的问题,还有访问冲突的问题。所以,应 该标识全局资源,并制定访问它们的策略。一般的情况该标识全局资源,并制定访问它们的策略。一般的情况 下,如果资源是物理对象,则通过建立协议实现并发系下,如果资源是物理对象,则通过建立协议实现并发系 统的访问;如果资源是逻辑对象,统的访问;如果资源是逻
29、辑对象, Rumbaugh建议对建议对 每个资源可创建一个每个资源可创建一个“保护者保护者”对象,控制对该资源的对象,控制对该资源的 访问(鉴别身份、协调冲突等访问(鉴别身份、协调冲突等)。)。 22 5、选择全局控制流机制、选择全局控制流机制 即系统如何执行。控制流是一个在处理机上顺序执行即系统如何执行。控制流是一个在处理机上顺序执行 的动作序列。在分析过程中,一般不考虑控制流问题,因的动作序列。在分析过程中,一般不考虑控制流问题,因 为假定所有的对象都能同时运行并在任何需要的时候就能为假定所有的对象都能同时运行并在任何需要的时候就能 执行它们的操作。系统设计的时候,就要考虑不是每个对执行它
30、们的操作。系统设计的时候,就要考虑不是每个对 象随时都能在自己的处理器上运行。有象随时都能在自己的处理器上运行。有3种可能的控制流种可能的控制流 机制:机制: 过程驱动控制:过程驱动控制: 控制来自程序代码中,如程序等待控制来自程序代码中,如程序等待 输入。这种控制流大多用于遗留系统并且使用过程化语言输入。这种控制流大多用于遗留系统并且使用过程化语言 编写。当使用面向对象语言,操作的先后顺序分散在许多编写。当使用面向对象语言,操作的先后顺序分散在许多 对象中,通过观察代码来决定输入的顺序将很困难。对象中,通过观察代码来决定输入的顺序将很困难。 事件驱动控制:事件驱动控制: 主循环等待外部事件,
31、一旦事件到主循环等待外部事件,一旦事件到 达就把与事件相关的信息分配给适当的对象,激活相应的达就把与事件相关的信息分配给适当的对象,激活相应的 控制流。缺陷是错误过程会阻塞整个应用。控制流。缺陷是错误过程会阻塞整个应用。 23 线程线程: 系统可以创建任意数量个线程,每个线程系统可以创建任意数量个线程,每个线程 对应于不同的事件,还能共享一个进程内的数据资源。对应于不同的事件,还能共享一个进程内的数据资源。 如果某个线程需要更多的数据,就等待来自操作者的输如果某个线程需要更多的数据,就等待来自操作者的输 入。这种控制流机制最直接,但需要比较成熟的支持线入。这种控制流机制最直接,但需要比较成熟的
32、支持线 程的开发工具,特别是调试和测试工具。程的开发工具,特别是调试和测试工具。 一旦选定了控制流机制,就可用一组控制对象(主一旦选定了控制流机制,就可用一组控制对象(主 动对象)来实现它(主动操作的一次执行就是一个控制动对象)来实现它(主动操作的一次执行就是一个控制 流)。控制对象的职责就是记录外部事件,存储它们的流)。控制对象的职责就是记录外部事件,存储它们的 临时状态,并给出与外部事件相关的边界对象和实体对临时状态,并给出与外部事件相关的边界对象和实体对 象的正确的操作次序象的正确的操作次序。 6、数据管理设计、数据管理设计 如何存储那些持久的、需要经常重新计算的对象?如何存储那些持久的
33、、需要经常重新计算的对象? 选择什么样的存储管理模式?选择什么样的存储管理模式? 24 3种存储管理机制:种存储管理机制: (1)普通文件)普通文件 由操作系统提供的存储机制,数据按字节流存储,由操作系统提供的存储机制,数据按字节流存储, 数据操纵功能简单,适合于存储大容量的图形、图像、数据操纵功能简单,适合于存储大容量的图形、图像、 视频、音频等多媒体数据。数据存储时,每个类对应于视频、音频等多媒体数据。数据存储时,每个类对应于 一个文件,每个对象实例对应文件的一个纪录。一个文件,每个对象实例对应文件的一个纪录。 对对 象象 对对 象象 对对 象象 应用系统应用系统 数据接口数据接口 文件文
34、件 用文件存储对象用文件存储对象 记录记录1 记录记录2 记录记录n 25 数据接口部分如何设计?主要设计为其他对象提数据接口部分如何设计?主要设计为其他对象提 供基本保存与恢复功能的对象类。供基本保存与恢复功能的对象类。 对象存取器对象存取器 类类-文件对照表文件对照表 对象保存()对象保存() 对象恢复()对象恢复() 换算型对象换算型对象 存取器存取器 *对象保存对象保存() *对象恢复对象恢复() 索引表索引表 文件记录索引文件记录索引 查找记录指针查找记录指针 () 查找型对象查找型对象 存取器存取器 *对象保存对象保存() *对象恢复对象恢复() 索引型对象索引型对象 存取器存取器
35、 *对象保存对象保存() *对象恢复对象恢复() 文件系统数据接口的设计文件系统数据接口的设计 从关键字换从关键字换 算出记录位算出记录位 置再保存或置再保存或 存取存取 以某种快速以某种快速 算法查找与算法查找与 关键字相符关键字相符 的记录的记录 用于某些类的用于某些类的 对象实例不便对象实例不便 于按关键字的于按关键字的 值排序值排序 26 问题域部分的对象通过请求数据接口部分提供的服问题域部分的对象通过请求数据接口部分提供的服 务实现对象的存取,这些永久性对象需要增加一些属性务实现对象的存取,这些永久性对象需要增加一些属性 (如类名、关键字)和请求保存与恢复的操作,往往需(如类名、关键
36、字)和请求保存与恢复的操作,往往需 定义一个在较高层次上的作为存储协议的抽象类。因此定义一个在较高层次上的作为存储协议的抽象类。因此 对原有的对象模型要作一些修改与调整。对原有的对象模型要作一些修改与调整。 (2)关系数据库关系数据库 提供了对数据存取、数据共享、数据完整性维护、提供了对数据存取、数据共享、数据完整性维护、 故障恢复、事务处理等功能实现的数据操纵语言。数据故障恢复、事务处理等功能实现的数据操纵语言。数据 以表的形式存储,表的每一列标识一个属性,每行把一以表的形式存储,表的每一列标识一个属性,每行把一 个数据项标识成一个属性值的元组。不同表中的多个元个数据项标识成一个属性值的元组
37、。不同表中的多个元 组用来表示单个对象的属性。关系型数据库技术成熟,组用来表示单个对象的属性。关系型数据库技术成熟, 适合于大的数据集以及对属性数据的复杂查询适合于大的数据集以及对属性数据的复杂查询。但关系但关系 数据库不适合储存多媒体数据和经过压缩处理过的数据数据库不适合储存多媒体数据和经过压缩处理过的数据 (因为要求至少满足第一范式(因为要求至少满足第一范式每个属性必须是原子的,每个属性必须是原子的, 不再含有内部结构)不再含有内部结构) 27 对对 象象 对对 象象 对对 象象 应用系统应用系统 数据接口数据接口 RDBMS 表表1 表表2 表表n 关系数据库关系数据库 用关系数据库存储
38、对象用关系数据库存储对象 由于关系数据库要求存由于关系数据库要求存 入其中的数据符合一定的规入其中的数据符合一定的规 范,因此需要对永久类的数范,因此需要对永久类的数 据进行规范化(要花费代据进行规范化(要花费代 价),以消除关系中的函数价),以消除关系中的函数 依赖所带来的数据更新异常依赖所带来的数据更新异常 并减少数据冗余。并减少数据冗余。 为了给数据查询、更新为了给数据查询、更新 等操作带来方便,需要对永等操作带来方便,需要对永 久类确定关键字,使能够唯久类确定关键字,使能够唯 一的确定该类的每个对象实一的确定该类的每个对象实 例(该表的每个元组)的属例(该表的每个元组)的属 性。性。
39、28 数据接口的实现类似文件系统,也需要提供数据接口的实现类似文件系统,也需要提供“对象对象 保存保存”和和“对象恢复对象恢复”的服务。执行这些服务需要知道的服务。执行这些服务需要知道 被保存或恢复的对象的下述信息:被保存或恢复的对象的下述信息: 它在内存中是哪个对象(以便知道从何处取得被保它在内存中是哪个对象(以便知道从何处取得被保 存的对象,或者把数据恢复到何处);存的对象,或者把数据恢复到何处); 它属于哪个类(以便知道该对象应保存在哪个数据它属于哪个类(以便知道该对象应保存在哪个数据 库表中);库表中); 它的关键字(以便知道该对象对应数据库表的哪个它的关键字(以便知道该对象对应数据库
40、表的哪个 元组)。元组)。 (3)OO数据库数据库 将对象和关系作为数据储存。提供了继承和抽象数将对象和关系作为数据储存。提供了继承和抽象数 据类型,不需要对象和存储实体之间的格式转换,不需据类型,不需要对象和存储实体之间的格式转换,不需 要另外设计数据接口。需熟悉要另外设计数据接口。需熟悉OODBMS提供的提供的ODL、 DML,实现对类和对象的定义以及对数据库的访问。,实现对类和对象的定义以及对数据库的访问。 下图显示了使用关系数据库对类的实例的存储下图显示了使用关系数据库对类的实例的存储。 29 两个多对多关系的类映射为两个多对多关系的类映射为3个表(维护表、个表(维护表、车辆零件车辆零
41、件 表表、零件表)。、零件表)。 30 7、确定边界条件、确定边界条件 设计中的大部分工作都与系统稳定的状态行为有关。设计中的大部分工作都与系统稳定的状态行为有关。 但必须考虑边界条件:系统如何启动、初始化、关闭以及但必须考虑边界条件:系统如何启动、初始化、关闭以及 故障处理。故障处理。 初始化包括:常量、参数、全局变量、任务及保护独初始化包括:常量、参数、全局变量、任务及保护独 享的处置设置。系统关闭时,应该释放所拥有的全部资源。享的处置设置。系统关闭时,应该释放所拥有的全部资源。 并发系统中必须通知其他任务,系统要关闭。并发系统中必须通知其他任务,系统要关闭。 运行中出现故障的原因可能是:
42、运行中出现故障的原因可能是: 用户错误,系统应帮助用户纠正错误。用户错误,系统应帮助用户纠正错误。 硬件错误,网络连接故障等情况需要保存临时状态。硬件错误,网络连接故障等情况需要保存临时状态。 软件故障,在程序中多设计出现故障后的出口。软件故障,在程序中多设计出现故障后的出口。 系统设计是不断迭代和演化的过程,要保证设计模型系统设计是不断迭代和演化的过程,要保证设计模型 是正确的、完整的、一致的、现实的、易读的。是正确的、完整的、一致的、现实的、易读的。 31 8、评审、评审 如果分析模型与设计模型映射(如:每个子系统都如果分析模型与设计模型映射(如:每个子系统都 能追溯到一个用例或一个非功能
43、需求),则设计模型是能追溯到一个用例或一个非功能需求),则设计模型是 正确的;正确的; 如果每个需求和每个系统设计问题都提到了,则模如果每个需求和每个系统设计问题都提到了,则模 型是完整的;型是完整的; 如果一个模型不包括任何冲突,则它是一致的;如果一个模型不包括任何冲突,则它是一致的; 如果模型能够实现,则它是现实的;如果模型能够实现,则它是现实的; 由非系统设计人员能够看懂模型,则模型是易读的。由非系统设计人员能够看懂模型,则模型是易读的。 32 11.3 对象设计对象设计 系统设计相当于大楼的建筑平面图,规定了每个房系统设计相当于大楼的建筑平面图,规定了每个房 间的用途,以及房间与房间之
44、间、房间与外部环境之间间的用途,以及房间与房间之间、房间与外部环境之间 的连接机制。对象设计着重于每个房间的内部细节。的连接机制。对象设计着重于每个房间的内部细节。 对象设计的主要任务是:对象设计的主要任务是: 定义对象完整的接口定义对象完整的接口 设计对象内部结构设计对象内部结构 构件选择构件选择 重组及优化重组及优化 系统分析确定了问题域对象,以及它们之间的关系、系统分析确定了问题域对象,以及它们之间的关系、 相关的属性、操作。系统设计确定了子系统和大多数重相关的属性、操作。系统设计确定了子系统和大多数重 要的求解域对象。对象设计要精细这些对象(这里的对要的求解域对象。对象设计要精细这些对
45、象(这里的对 象包括子系统),并可能定义其他的求解域对象。象包括子系统),并可能定义其他的求解域对象。 33 1、定义对象的接口、定义对象的接口 对象的接口也称为对象的协议、对象的界面。它通对象的接口也称为对象的协议、对象的界面。它通 过定义对象可以接收的每个消息和当对象接收到该消息过定义对象可以接收的每个消息和当对象接收到该消息 后完成的相关服务来描述。接口提供了一种方法,把对后完成的相关服务来描述。接口提供了一种方法,把对 象基于操作的功能说明与具体实现区分开来,使得任何象基于操作的功能说明与具体实现区分开来,使得任何 依赖和使用接口的客户不必依赖于接口的具体实现,有依赖和使用接口的客户不
46、必依赖于接口的具体实现,有 利于接口实现的替换。利于接口实现的替换。 接口描述可以用接口描述可以用UML中类图一样的符号,省略属性中类图一样的符号,省略属性 部分,部分,interface要包含在类名部分中。比较多的人要包含在类名部分中。比较多的人 喜欢用程序设计语言来定义接口,以便用编译器来发现喜欢用程序设计语言来定义接口,以便用编译器来发现 接口描述中的错误和不一致。接口描述中的错误和不一致。 下图给出了下图给出了“转账转账” 的的Java接口描述接口描述。 34 /provided interfaces: Public interface Transfers public Account
47、 create (Customer owner, Money balance, AccountNumber account_id); public void Deposit (Money amount ,String reason); public void Withdraw (Money amount, String reason); 要确定某个对象完整的接口,必须考察与它有关要确定某个对象完整的接口,必须考察与它有关 的所有用例,将与它有关的所有消息抽取出来,形成的所有用例,将与它有关的所有消息抽取出来,形成 该对象完整的界面。该对象完整的界面。 对于包或构件,当有依赖关系指向它的时候,就
48、对于包或构件,当有依赖关系指向它的时候,就 有可能表示该包或构件需要提供一个接口。有可能表示该包或构件需要提供一个接口。 35 2、设计对象内部结构、设计对象内部结构 确定遗漏的属性和操作:确定遗漏的属性和操作: 系统分析和设计时集中考虑应用域,忽略与实现相系统分析和设计时集中考虑应用域,忽略与实现相 关的细节,这时就应该增加上。关的细节,这时就应该增加上。 指定类型,声明可见性:指定类型,声明可见性: 属性属性:确定类型、数据结构。除了分析活动中确定:确定类型、数据结构。除了分析活动中确定 的属性,还包括一些其他属性,这些属性用来表示和其的属性,还包括一些其他属性,这些属性用来表示和其 他类
49、的对象关联的对象引用(关联的实现)。他类的对象关联的对象引用(关联的实现)。 操作操作:确定参数、返回值及类型。:确定参数、返回值及类型。 为了确定每个属性和操作的访问权限,为了确定每个属性和操作的访问权限,UML定义了定义了 3种可见性符号,即在属性和操作的说明前加上前缀:种可见性符号,即在属性和操作的说明前加上前缀: 36 -:私有的,:私有的, 只能由定义它的类访问,子类和其他类只能由定义它的类访问,子类和其他类 都不能访问。都不能访问。 +:公有的,:公有的, 任何类都可以访问。公有的操作确定了任何类都可以访问。公有的操作确定了 对象的接口。对象的接口。 #:保护的,:保护的, 可以由
50、定义它的类以及该类的子类访问。可以由定义它的类以及该类的子类访问。 设计关联:设计关联: OOPL一般不提供一般不提供“关联关联”的直接实现,一般用指针的直接实现,一般用指针 或对象引用来实现关联。(有或对象引用来实现关联。(有UML建模工具自动完成关联建模工具自动完成关联 到引用的转换)。到引用的转换)。 一对一关联一对一关联: ZoomInMapAreaZoomIn 1 1 MapArea -Target: MapArea 也可在也可在MapArea中设置一个引用中设置一个引用ZoomIn的属性,并增加相应的属性,并增加相应 的操作。的操作。 37 一对多关联一对多关联: LayerEle
51、ment 1 * LayerElement -LayerEle: Set-Containe: Layer Layer的的Set取决关系的约束条件。如层中的元素要取决关系的约束条件。如层中的元素要 排序,则用排序,则用Array或或Vector代替代替Set。 一对多关联的实现一对多关联的实现 38 多对多关联多对多关联: RecordElement * * RecordElement -RecordEle: Set-Containe: Set 多对多关联的实现多对多关联的实现 对于多对多关联,可以将对于多对多关联,可以将 “关联关联” 作为一个独立作为一个独立 的类,形成两个二元关系,可降低重
52、数,方便实现。的类,形成两个二元关系,可降低重数,方便实现。 39 设计操作的算法设计操作的算法 分析类的状态图,从每个状态转移前后的动作说明分析类的状态图,从每个状态转移前后的动作说明 获取每个方法体的逻辑结构。而顺序图中的消息一般对获取每个方法体的逻辑结构。而顺序图中的消息一般对 应状态图中引起状态转移的事件或动作。应状态图中引起状态转移的事件或动作。 类名类名 可见性:属性列表可见性:属性列表 可见性:操作可见性:操作1(参数表参数表) 可见性:操作可见性:操作2(参数表参数表) 方法方法1 方法方法1过程体过程体 方法方法2 方法方法2过程体过程体 方法方法n 方法方法n过程体过程体
53、消息消息 消息消息 消息消息 40 3、构件选择、构件选择 选择系统运行的软、硬件平台,包括商品构件(更可选择系统运行的软、硬件平台,包括商品构件(更可 靠、有效、健壮)、靠、有效、健壮)、DBMS、中间件、企业应用程序框架、中间件、企业应用程序框架 (特定的应用)等,目的是尽可能多地减少需要开发的自(特定的应用)等,目的是尽可能多地减少需要开发的自 定义对象的数量。由于商品构件支持大多数系统,较为复定义对象的数量。由于商品构件支持大多数系统,较为复 杂,需要学习的投入,可能还要作适应性修改。杂,需要学习的投入,可能还要作适应性修改。 4、重组与优化、重组与优化 (1)提高可复用性)提高可复用
54、性 对象设计给出了开发阶段中再次检查应用程序和求解对象设计给出了开发阶段中再次检查应用程序和求解 对象间继承层次的机会。对象间继承层次的机会。 设计完善的继承层次的主要优点是:设计完善的继承层次的主要优点是: 可以复用更多的代码,产生较少的冗余。可以复用更多的代码,产生较少的冗余。 代码是可扩展的,可用来创建更特别的类。代码是可扩展的,可用来创建更特别的类。 41 但是通过继承复用是有代价的,开发人员需要正但是通过继承复用是有代价的,开发人员需要正 确的预见所创建的类的哪些行为需要共享、哪些行为确的预见所创建的类的哪些行为需要共享、哪些行为 需要由以后的新类细化,通常还不会知道以后所有可需要由
55、以后的新类细化,通常还不会知道以后所有可 能的新类。另外,一旦开发人员为共享代码定义了继能的新类。另外,一旦开发人员为共享代码定义了继 承层次,抽象类的接口难以改变,因为许多子类和客承层次,抽象类的接口难以改变,因为许多子类和客 户类都依赖它们。户类都依赖它们。 设计通过继承层次复用的方法是:设计通过继承层次复用的方法是: 检查大量相似的类,抽取出它们的共同行为。检查大量相似的类,抽取出它们的共同行为。 给出一层抽象概念,并从预期的变化中抽取出一给出一层抽象概念,并从预期的变化中抽取出一 个具体类。如个具体类。如AbstractFactory等设计模式都使用了继等设计模式都使用了继 承来防止预
56、期的变化。承来防止预期的变化。 42 (2)优化访问路径)优化访问路径 效率低的系统性能的常见原因是访问必须的信息时效率低的系统性能的常见原因是访问必须的信息时 对多个关系的重复遍历。为了识别较低的访问路径,对多个关系的重复遍历。为了识别较低的访问路径, Rumbaugh建议对象设计者应该考虑下列问题:建议对象设计者应该考虑下列问题: 对于每个操作对于每个操作:需要多少次遍历?遍历哪些关系?:需要多少次遍历?遍历哪些关系? 常用的操作不应该有许多遍历,应该直接通信。如果缺少常用的操作不应该有许多遍历,应该直接通信。如果缺少 直接通信,应该在两个对象间增加另外的关系。有一个直接通信,应该在两个对
57、象间增加另外的关系。有一个 Demeter法则,称法则,称“只同你的直接朋友对话只同你的直接朋友对话”,指在软件,指在软件 设计中,一个方法只与由关联连接的相邻对象通信。好处:设计中,一个方法只与由关联连接的相邻对象通信。好处: 易理解、易修改、效率高。易理解、易修改、效率高。 对于每个关系对于每个关系:有:有“多重多重”关系?重数是必需的吗?关系?重数是必需的吗? 检索过程中,关系中的检索过程中,关系中的“多多”端是否经常出现?如果有,端是否经常出现?如果有, 应该试着将应该试着将“多多”减少为减少为“1”。否则,应为。否则,应为“多多”端排序端排序 或建立索引以改进访问时间。或建立索引以改
58、进访问时间。 43 效率低的另一个原因是过多的建模。分析时确效率低的另一个原因是过多的建模。分析时确 定了许多类结构,但设计时发现没有任何意义的信定了许多类结构,但设计时发现没有任何意义的信 息。因此对象设计者应该问:息。因此对象设计者应该问: 对于每个属性对于每个属性:哪些操作用到了这个属性?只:哪些操作用到了这个属性?只 有有 set()、get()操作吗?如果是,能否移到调用它的对操作吗?如果是,能否移到调用它的对 象中去?如果某些类有很少的属性和行为,并且与象中去?如果某些类有很少的属性和行为,并且与 其它类相关,可将这些类退化成属性(减少了类的其它类相关,可将这些类退化成属性(减少了
59、类的 数目)。这样做的目的是使模型变得简单、直接。数目)。这样做的目的是使模型变得简单、直接。 44 11.4 设计模式设计模式 1 1、概述、概述 模式模式 (Pattern) 是解决特定领域问题的经验,可以帮是解决特定领域问题的经验,可以帮 助人们在软件开发过程中对于经常重复出现的问题制定成助人们在软件开发过程中对于经常重复出现的问题制定成 功解决的方案。功解决的方案。 模式的概念最初来自于建筑学领域,用模式描述建筑模式的概念最初来自于建筑学领域,用模式描述建筑 物的建筑元素(物的建筑元素(Alexander,1979),),概括概括了被认为是好了被认为是好 的设计的实践经验。的设计的实践
60、经验。94年年Gamma等等4 4人(简称人(简称“Gang of Four”)合著的合著的设计模式:可复用面向对象软件的基础设计模式:可复用面向对象软件的基础 提出了用设计模式解决重复出现的软件设计问题提出了用设计模式解决重复出现的软件设计问题,并对设并对设 计模式进行了分类描述和解释。计模式进行了分类描述和解释。96年由年由Buschmann等等5 5人人 合著的合著的面向模式的软件体系结构面向模式的软件体系结构将模式跨越不同的抽将模式跨越不同的抽 象层次,提出了高层的体系结构模式、中层的设计模式和象层次,提出了高层的体系结构模式、中层的设计模式和 低层的习惯用法。本章主要针对设计模式进行
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030年中国采盐行业市场运营状况及发展趋势分析报告
- 2025-2030年中国酒店用品行业运行态势及发展前景分析报告
- 2025-2030年中国过硫酸盐行业运行状况及发展前景分析报告
- 2025-2030年中国轻质碳酸钙行业竞争态势与营销策略研究报告
- 2025-2030年中国车辆专用照明及电气信号设备制造市场十三五规划与发展策略分析报告
- 2025-2030年中国螺丝刀行业运行状况及前景趋势分析报告
- 2025-2030年中国船舶租赁市场运行现状及发展趋势预测报告
- 2025-2030年中国膨化食品市场运营状况与发展策略分析报告
- 2025-2030年中国纸浆产业运行状况与前景趋势分析报告
- 2025-2030年中国粮食烘干机械行业运行现状及发展前景预测报告
- 抗日战争胜利题材话剧剧本范文
- GB/T 22328-2008动植物油脂1-单甘酯和游离甘油含量的测定
- 录用offer模板参考范本
- GB 16780-2021水泥单位产品能源消耗限额
- 全面推进依法行政课件
- 政务服务一网通办平台解决方案-最新
- 儿童气管插管医学课件
- 内燃机车无火回送操作方法
- 第十四届全国交通运输行业职业技能竞赛(公路收费及监控员)赛项题库-上(单选题汇总-共3部分-1)
- 奥太焊机维修教材MZ系列
- 哈利波特和死亡圣器PPT培训课件
评论
0/150
提交评论