高级软件工程--第6章-面向对象设计课件

上传人:无*** 文档编号:241866987 上传时间:2024-07-31 格式:PPT 页数:69 大小:752KB
返回 下载 相关 举报
高级软件工程--第6章-面向对象设计课件_第1页
第1页 / 共69页
高级软件工程--第6章-面向对象设计课件_第2页
第2页 / 共69页
高级软件工程--第6章-面向对象设计课件_第3页
第3页 / 共69页
点击查看更多>>
资源描述
1第6章 面向对象设计面向对象设计过程与准则面向对象设计过程与准则系统分解系统分解问题域部分的设计问题域部分的设计人机交互部分的设计人机交互部分的设计任务管理部分的设计任务管理部分的设计数据管理部分的设计数据管理部分的设计对象设计对象设计26.1 面向对象设计过程与准则面向对象设计过程面向对象设计过程(1)建立系统环境模型。在设计的初始阶段,系统设计师用建立系统环境模型。在设计的初始阶段,系统设计师用系统环境图对软件与外部实体交互的方式进行建模。下图系统环境图对软件与外部实体交互的方式进行建模。下图给出了系统环境图的一般的结构。给出了系统环境图的一般的结构。36.1 面向对象设计过程与准则(2)设计系统体系结构。体系结构设计可以自底向上进行,设计系统体系结构。体系结构设计可以自底向上进行,如将关系紧密的对象组织成子系统或层;也可以自顶向如将关系紧密的对象组织成子系统或层;也可以自顶向下进行,尤其是使用设计模式或遗产系统时,会从子系下进行,尤其是使用设计模式或遗产系统时,会从子系统的划分入手。统的划分入手。(3)对各个子系统进行设计。对于面向对象的系统,典型的对各个子系统进行设计。对于面向对象的系统,典型的子系统有问题域子系统、人机交互子系统、任务管理子子系统有问题域子系统、人机交互子系统、任务管理子系统和数据管理子系统。系统和数据管理子系统。(4)对象设计及优化。对象设计以问题领域的对象设计为核对象设计及优化。对象设计以问题领域的对象设计为核心,其结果是一个详细的对象模型。对象设计过程包括心,其结果是一个详细的对象模型。对象设计过程包括使用模式设计对象、接口规格说明、对象模型重构、对使用模式设计对象、接口规格说明、对象模型重构、对象模型优化象模型优化4组活动。组活动。46.1 面向对象设计过程与准则面向对象设计准则面向对象设计准则(1)模块化模块化传统的面向过程方法中的模块通常是函数、过程及子程传统的面向过程方法中的模块通常是函数、过程及子程序等,而面向对象方法中的模块则是类、对象、接口、序等,而面向对象方法中的模块则是类、对象、接口、构件等。构件等。在面向过程的方法中,数据及对数据的处理是分离的;在面向过程的方法中,数据及对数据的处理是分离的;而在面向对象方法中,数据及其上的处理是封装在一起而在面向对象方法中,数据及其上的处理是封装在一起的,具有更好的独立性,也能够更好地支持复用。的,具有更好的独立性,也能够更好地支持复用。56.1 面向对象设计过程与准则(2)抽象抽象面向对象方法不仅支持过程抽象,而且支持数据抽象。面向对象方法不仅支持过程抽象,而且支持数据抽象。类实际上就是一种抽象数据类型。可以将类的抽象分为类实际上就是一种抽象数据类型。可以将类的抽象分为规格说明抽象及参数化抽象。规格说明抽象及参数化抽象。类对外开放的公共接口构成了类的规格说明,即协议。类对外开放的公共接口构成了类的规格说明,即协议。这种接口规定了外部可以使用的服务,使用者无需知道这种接口规定了外部可以使用的服务,使用者无需知道这些服务的具体实现算法。通常将这类抽象称为规格说这些服务的具体实现算法。通常将这类抽象称为规格说明抽象。明抽象。参数化抽象是指当描述类的规格说明时并不具体指定所参数化抽象是指当描述类的规格说明时并不具体指定所要操作的数据类型,而是将数据类型作为参数。要操作的数据类型,而是将数据类型作为参数。66.1 面向对象设计过程与准则(3)信息隐藏信息隐藏在面向对象方法中,信息隐藏通过对象的封装性实现。对在面向对象方法中,信息隐藏通过对象的封装性实现。对于类的用户来说,属性的表示方法和操作的实现算法都应于类的用户来说,属性的表示方法和操作的实现算法都应该是隐藏的。该是隐藏的。(4)弱耦合弱耦合耦合是指一个软件结构内不同模块之间互连的紧密程度。耦合是指一个软件结构内不同模块之间互连的紧密程度。在面向对象方法中,对象是最基本的模块,因此,耦合主在面向对象方法中,对象是最基本的模块,因此,耦合主要指不同对象之间相互关联的紧密程度。要指不同对象之间相互关联的紧密程度。76.1 面向对象设计过程与准则(5)强内聚强内聚内聚衡量一个模块内各个元素彼此结合的紧密程度。在面内聚衡量一个模块内各个元素彼此结合的紧密程度。在面向对象设计中存在以下向对象设计中存在以下3种内聚:种内聚:1)服务内聚服务内聚:一个服务应该完成一个且仅完成一个功能。:一个服务应该完成一个且仅完成一个功能。2)类内聚类内聚:设计类的原则是,一个类应该只有一个用途,它:设计类的原则是,一个类应该只有一个用途,它的属性和服务应该是高内聚的。类的属性和服务应该全都的属性和服务应该是高内聚的。类的属性和服务应该全都是完成该类对象的任务所必需的,其中不包含无用的属性是完成该类对象的任务所必需的,其中不包含无用的属性或服务。如果某个类有多个用途,通常应该把它分解成多或服务。如果某个类有多个用途,通常应该把它分解成多个专用的类。个专用的类。3)一般一般特殊内聚特殊内聚:设计出的一般:设计出的一般特殊结构,应该符合多特殊结构,应该符合多数人的概念,更准确地说,这种结构应该是对相应的领域数人的概念,更准确地说,这种结构应该是对相应的领域知识的正确抽取。知识的正确抽取。86.1 面向对象设计过程与准则(6)(6)可重用可重用软件重用是提高软件开发生产率和目标系统质量软件重用是提高软件开发生产率和目标系统质量的重要途径。的重要途径。重用基本上从设计阶段开始。重用有两方面的含重用基本上从设计阶段开始。重用有两方面的含义:义:一是尽量使用已有的类一是尽量使用已有的类(包括开发环境提供的类库,及以包括开发环境提供的类库,及以往开发类似系统时创建的类往开发类似系统时创建的类),二是如果确实需要创建新类,则在设计这些新类的协议时,二是如果确实需要创建新类,则在设计这些新类的协议时,应该考虑将来的可重复使用性。应该考虑将来的可重复使用性。96.2 系统分解子系统和类子系统和类在大型和复杂的软件系统情形,首先根据需求的功能模型在大型和复杂的软件系统情形,首先根据需求的功能模型(用例模型),将系统分解成若干个部分,每一部分又可(用例模型),将系统分解成若干个部分,每一部分又可分解为若干子系统或类,每个子系统还可以由更小的子系分解为若干子系统或类,每个子系统还可以由更小的子系统或类组成,如图所示。统或类组成,如图所示。系统结构的类图系统结构的类图 106.2 系统分解服务和子系统接口服务和子系统接口服务是一组有公共目的的相关操作。而子系统则通过给其服务是一组有公共目的的相关操作。而子系统则通过给其他子系统提供服务来发挥自己的能力。与类不同的是,子他子系统提供服务来发挥自己的能力。与类不同的是,子系统不要求其他子系统为它提供服务。系统不要求其他子系统为它提供服务。供其他子系统调用的某个子系统的操作集合就是子系统的供其他子系统调用的某个子系统的操作集合就是子系统的接口。接口。子系统的接口包括操作名、操作参数类型及返回值。子系统的接口包括操作名、操作参数类型及返回值。面向对象的系统设计主要关注每个子系统提供服务的定义,面向对象的系统设计主要关注每个子系统提供服务的定义,即枚举所有的操作、操作参数和行为。即枚举所有的操作、操作参数和行为。116.2 系统分解服务和子系统接口服务和子系统接口子系统分层的目的是建立系统的层次结构。每一层仅依赖子系统分层的目的是建立系统的层次结构。每一层仅依赖于它下一层提供的服务,而对它的上一层可以一无所知。于它下一层提供的服务,而对它的上一层可以一无所知。下图给出了一个三层的系统结构的示例。下图给出了一个三层的系统结构的示例。126.2 系统分解服务和子系统接口服务和子系统接口如果在一个系统的层次结构中,每如果在一个系统的层次结构中,每一层只能访问与其相邻的下一层,一层只能访问与其相邻的下一层,则称之为封闭体系结构;如果每一则称之为封闭体系结构;如果每一层还可访问比其相邻下一层更低的层还可访问比其相邻下一层更低的层次,则称之为开放体系结构。层次,则称之为开放体系结构。典型的封闭体系结构的例子就是开典型的封闭体系结构的例子就是开放系统互联参考模型(放系统互联参考模型(OSIOSI模型),模型),如图所示。如图所示。136.2 系统分解服务和子系统接口服务和子系统接口开放体系结构的一个例子是开放体系结构的一个例子是JavaJava的的SwingSwing用户接口包。它用户接口包。它允许绕过高层直接访问低层接口以克服性能瓶颈。如图所允许绕过高层直接访问低层接口以克服性能瓶颈。如图所示。示。146.2 系统分解Coad&Yourdon的面向对象设计模型的面向对象设计模型Coad&YourdonCoad&Yourdon基于基于MVCMVC(Model-View-ControllerModel-View-Controller)模型,)模型,在逻辑上将系统划分为在逻辑上将系统划分为4 4个部分,分别是个部分,分别是问题域部分问题域部分、人人机交互部分机交互部分、任务管理部分任务管理部分及及数据管理部分数据管理部分,每一部分又,每一部分又可分为若干子系统。可分为若干子系统。Coad Coad 与与 Yourdon Yourdon 在设计阶段中继续采用了分析阶段中提在设计阶段中继续采用了分析阶段中提到的到的5 5个层次,用于建立系统的个层次,用于建立系统的4 4个组成成分。每一个子系个组成成分。每一个子系统都由统都由主题主题、类类-&-&-对象对象、结构结构、属性属性和和服务服务5 5个层次组成。个层次组成。这这5 5个层次可以被当作整个模型的水平切片。个层次可以被当作整个模型的水平切片。156.2 系统分解典型的面向对象设计模型典型的面向对象设计模型 166.2 系统分解子系统之间的两种交互方式子系统之间的两种交互方式客户客户-供应商关系供应商关系:在这种关系中,客户子系统调用供应:在这种关系中,客户子系统调用供应商子系统,后者完成某些服务工作并返回结果。使用这种商子系统,后者完成某些服务工作并返回结果。使用这种交互方案,作为客户的子系统必须了解作为供应商的子系交互方案,作为客户的子系统必须了解作为供应商的子系统的接口,而后者却无须了解前者的接口。统的接口,而后者却无须了解前者的接口。平等伙伴关系平等伙伴关系:在这种关系中,每个子系统都可能调用其:在这种关系中,每个子系统都可能调用其他子系统,因此每个子系统都必须了解其他子系统的接口。他子系统,因此每个子系统都必须了解其他子系统的接口。与第一种方案相比,这种方案中,子系统间的交互更加复与第一种方案相比,这种方案中,子系统间的交互更加复杂。杂。176.2 系统分解组织系统的两种方案组织系统的两种方案分层组织分层组织:这种组织方案把软件系统组织成一个层次系统,:这种组织方案把软件系统组织成一个层次系统,每层是一个子系统。上层在下层的基础上建立,下层为实每层是一个子系统。上层在下层的基础上建立,下层为实现上层功能而提供必要的服务。每一层内所包含的对象,现上层功能而提供必要的服务。每一层内所包含的对象,彼此间相互独立,而处于不同层次上的对象,彼此间往往彼此间相互独立,而处于不同层次上的对象,彼此间往往有关联。有关联。块状组织块状组织:这种组织方案把软件系统垂直地分解成若干个:这种组织方案把软件系统垂直地分解成若干个相对独立的、弱耦合的子系统,一个子系统相当于一块,相对独立的、弱耦合的子系统,一个子系统相当于一块,每块提供一种类型的服务。每块提供一种类型的服务。混合使用层次结构和块状结构,可以成功地由多混合使用层次结构和块状结构,可以成功地由多个子系统组成一个完整的软件系统。个子系统组成一个完整的软件系统。186.3 问题域部分的设计典型的面向对象系统一般由三层组成,即数据库层、业务典型的面向对象系统一般由三层组成,即数据库层、业务逻辑层及用户界面层。那么,在这三层中,首先从哪一层逻辑层及用户界面层。那么,在这三层中,首先从哪一层开始设计呢?开始设计呢?实际上,面向对象的设计也是以面向对象分析的模型为基实际上,面向对象的设计也是以面向对象分析的模型为基础的。础的。面向对象的分析模型包括有用例图、类图、顺序图和包图,面向对象的分析模型包括有用例图、类图、顺序图和包图,主要是对问题领域进行描述,基本上不考虑技术实现,当主要是对问题领域进行描述,基本上不考虑技术实现,当然也不考虑数据库层和用户界面层。然也不考虑数据库层和用户界面层。面向对象分析所得到的问题域模型可以直接应用于系统的面向对象分析所得到的问题域模型可以直接应用于系统的问题域部分的设计。问题域部分的设计。所以,面向对象设计应该从问题域部分的设计开始,也就所以,面向对象设计应该从问题域部分的设计开始,也就是三层结构的中间层是三层结构的中间层应用逻辑层。应用逻辑层。196.3 问题域部分的设计在面向对象设计过程中,可能对面向对象分析在面向对象设计过程中,可能对面向对象分析所得出的问题域模型做以下方面的补充或调整。所得出的问题域模型做以下方面的补充或调整。(1)调整需求。有两种情况会导致修改通过面向对调整需求。有两种情况会导致修改通过面向对象分析所确定的系统需求:象分析所确定的系统需求:一是用户需求或外部环境发生变化;一是用户需求或外部环境发生变化;二是分析员对问题理解不透彻,导致分析模型不能完整、二是分析员对问题理解不透彻,导致分析模型不能完整、准确地反映用户的真实需求。准确地反映用户的真实需求。206.3 问题域部分的设计(2)复用已有的类复用已有的类从类库选择已有的类,从供应商那里购买商业外购构件,从类库选择已有的类,从供应商那里购买商业外购构件,从网络、组织、小组或个人那里搜集适用的遗留软构件,从网络、组织、小组或个人那里搜集适用的遗留软构件,把它们增加到问题域部分的设计中去。把它们增加到问题域部分的设计中去。在被复用的已有类和问题域类之间添加泛化(一般化在被复用的已有类和问题域类之间添加泛化(一般化特特殊化)关系,继承被复用类或构件属性和方法。殊化)关系,继承被复用类或构件属性和方法。标出在问题域类中因继承被复用的已有类或构件而成为多标出在问题域类中因继承被复用的已有类或构件而成为多余的属性和服务。余的属性和服务。修改与问题域类相关的关联。修改与问题域类相关的关联。216.3 问题域部分的设计(3)把问题域类组合在一起把问题域类组合在一起在进行面向对象设计时,通常需要先引入一个类,以便将在进行面向对象设计时,通常需要先引入一个类,以便将问题域专用的类组合在一起,它起到问题域专用的类组合在一起,它起到“根根”类的作用,将类的作用,将全部下层的类组合在一起。全部下层的类组合在一起。当没有一种更满意的组合机制可用时,可以从类库中引进当没有一种更满意的组合机制可用时,可以从类库中引进一个根类,作为包容类,把所有与问题领域有关的类关联一个根类,作为包容类,把所有与问题领域有关的类关联到一起,建立类的层次。到一起,建立类的层次。之后,将同一问题领域的一些类集合起来,存于类库中。之后,将同一问题领域的一些类集合起来,存于类库中。226.3 问题域部分的设计(4)增添泛化类以建立类间的协议增添泛化类以建立类间的协议有时某些问题域的类要求一组类似的服务(以及相应的属有时某些问题域的类要求一组类似的服务(以及相应的属性)。此时,以这些问题域的类作为特化的类,定义一个性)。此时,以这些问题域的类作为特化的类,定义一个泛化类。泛化类。该泛化类定义了为所有这些特化类共用的一组服务名,作该泛化类定义了为所有这些特化类共用的一组服务名,作为公共的协议,用来与数据管理或其他外部系统部件通信。为公共的协议,用来与数据管理或其他外部系统部件通信。这些服务都是虚函数。在各个特化类中定义其实现。这些服务都是虚函数。在各个特化类中定义其实现。236.3 问题域部分的设计(5)调整继承的支持级别调整继承的支持级别如果在分析模型中一个泛化关系中的特化类继承了多个类如果在分析模型中一个泛化关系中的特化类继承了多个类的属性或服务,就产生了多继承关系,如图所示。的属性或服务,就产生了多继承关系,如图所示。246.3 问题域部分的设计1)1)针对单继承语言的调整。对于只支持单继承关系的编程针对单继承语言的调整。对于只支持单继承关系的编程语言,可以使用两种方法将多继承结构转换为单继承结构。语言,可以使用两种方法将多继承结构转换为单继承结构。把特化类看做是泛化类所扮演的角色,如图把特化类看做是泛化类所扮演的角色,如图(a)(a)和图和图(b)(b)所所示。示。256.3 问题域部分的设计 把多继承的层次结构平铺为单继承的层次结构,如图所示。把多继承的层次结构平铺为单继承的层次结构,如图所示。这意味着该泛化关系在设计中就不再那么清晰了。同时某这意味着该泛化关系在设计中就不再那么清晰了。同时某些属性和服务在特化类中重复出现,造成冗余。些属性和服务在特化类中重复出现,造成冗余。266.3 问题域部分的设计2)2)针对无继承语言的调整。针对无继承语言的调整。编程语言中的继承属性提供了表达问题域的一般化编程语言中的继承属性提供了表达问题域的一般化特殊特殊化语义的语法,它明确地表示了公共属性和服务,还为通化语义的语法,它明确地表示了公共属性和服务,还为通过可扩展性而达到可复用性提供了基础。过可扩展性而达到可复用性提供了基础。对于一个不支持继承的编程语言来说,只能将每一个泛化对于一个不支持继承的编程语言来说,只能将每一个泛化关系的层次展开,成为一组类及对象,之后再使用命名惯关系的层次展开,成为一组类及对象,之后再使用命名惯例将它们组合在一起。例将它们组合在一起。276.3 问题域部分的设计(6)改进性能改进性能 提高执行效率是系统设计的目标之一。为以提高效率有时提高执行效率是系统设计的目标之一。为以提高效率有时必须改变问题域的结构。必须改变问题域的结构。1)1)如果类之间经常需要传送大量消息,可合并相关的类,如果类之间经常需要传送大量消息,可合并相关的类,使得通信成为对象内的通信,而不是对象之间的通信,或使得通信成为对象内的通信,而不是对象之间的通信,或者使用全局数据作用域,打破封装的原则,以减少消息传者使用全局数据作用域,打破封装的原则,以减少消息传递引起的速度损失。递引起的速度损失。2)2)增加某些属性到原来的类中,或增加低层的类,以保增加某些属性到原来的类中,或增加低层的类,以保存临时结果,避免每次都要重复计算造成速度损失。存临时结果,避免每次都要重复计算造成速度损失。286.3 问题域部分的设计(7)存储对象存储对象 通常的作法是,每个对象将自己传送给数据管理通常的作法是,每个对象将自己传送给数据管理部分,让数据管理部分来存储对象本身。部分,让数据管理部分来存储对象本身。296.4 人机交互部分的设计用户界面设计步骤用户界面设计步骤(1)(1)从系统的输入、输出及与用户的交互中获得信息,定义从系统的输入、输出及与用户的交互中获得信息,定义界面对象和行为(操作)。界面对象和行为(操作)。(2)(2)定义那些导致用户界面状态发生变化的事件,对事件建定义那些导致用户界面状态发生变化的事件,对事件建模。模。(3)(3)描述最终向用户展示的每一个界面的状态。描述最终向用户展示的每一个界面的状态。(4)(4)简要说明用户如何从界面提供的界面信息来解释系统状简要说明用户如何从界面提供的界面信息来解释系统状态。态。30WebWeb应用系统的界面设计应用系统的界面设计界面设计目标界面设计目标(1)(1)简单性:尽量做到适度和简单,不要在页面上提供太多简单性:尽量做到适度和简单,不要在页面上提供太多的东西。的东西。(2)(2)一致性:这一设计目标几乎适用于设计模型的每一个元一致性:这一设计目标几乎适用于设计模型的每一个元素。素。(3)(3)确定性:确定性:WebWeb应用系统的美学、界面和导航设计必须与应用系统的美学、界面和导航设计必须与将要构造的应用系统所处的领域保持一致。将要构造的应用系统所处的领域保持一致。(4)(4)健壮性:在已经建立的确定性的基础上,健壮性:在已经建立的确定性的基础上,WebWeb应用系统应用系统通常会给用户明确的通常会给用户明确的“承诺承诺”。31WebWeb应用系统的界面设计应用系统的界面设计界面设计目标界面设计目标(5)(5)导航性:我们已经在前面提及了导航应该简单和一致,导航性:我们已经在前面提及了导航应该简单和一致,也应该以直观的和可预测的方式来设计。也就是说,用户也应该以直观的和可预测的方式来设计。也就是说,用户不必搜索导航链接和帮助就知道如何使用不必搜索导航链接和帮助就知道如何使用WebWeb应用系统。应用系统。(6)(6)视觉吸引:在所有类型的软件中,视觉吸引:在所有类型的软件中,WebWeb应用系统毫无疑应用系统毫无疑问是最具有视觉效果的、最生动的、也是最具有审美感的。问是最具有视觉效果的、最生动的、也是最具有审美感的。(7)(7)兼容性:兼容性:WebWeb应用系统会应用于不同的环境应用系统会应用于不同的环境(例如,不同例如,不同的硬件、的硬件、InternetInternet连接类型、操作系统、浏览器连接类型、操作系统、浏览器),并且,并且必须互相兼容。必须互相兼容。32WebWeb应用系统的界面设计应用系统的界面设计界面设计工作流界面设计工作流(1)(1)回顾那些在分析模型中的信息,并根据需要进行优化。回顾那些在分析模型中的信息,并根据需要进行优化。(2)(2)开发开发WebWeb应用系统界面布局的草图。应用系统界面布局的草图。(3)(3)将用户目标映射到特定的界面行为。将用户目标映射到特定的界面行为。(4)(4)定义与每个行为相关的一组用户任务。定义与每个行为相关的一组用户任务。(5)(5)为每个界面行为设计情节串联图板屏像。为每个界面行为设计情节串联图板屏像。(6)(6)利用从美学设计中的输入来优化界面布局和情节串联图利用从美学设计中的输入来优化界面布局和情节串联图板。板。33WebWeb应用系统的界面设计应用系统的界面设计界面设计工作流界面设计工作流(7)(7)明确实现界面功能的界面对象。明确实现界面功能的界面对象。(8)(8)开发用户与界面交互的过程表示。开发用户与界面交互的过程表示。(9)(9)开发界面的行为表示法。开发界面的行为表示法。(10)(10)描述每种状态的界面布局。描述每种状态的界面布局。(11)(11)优化和评审界面设计模型。优化和评审界面设计模型。346.5 任务管理部分的设计任务管理主要包括任务的选择和调整。常见的任任务管理主要包括任务的选择和调整。常见的任务有务有事件驱动型任务事件驱动型任务、时钟驱动型任务时钟驱动型任务、优先任优先任务务、关键任务关键任务和和协调任务协调任务等。等。设计任务管理子系统时,需要确定各类任务,并设计任务管理子系统时,需要确定各类任务,并将任务分配给适当的硬件或软件去执行。将任务分配给适当的硬件或软件去执行。356.5 任务管理部分的设计1.识别事件驱动任务识别事件驱动任务有些任务是事件驱动的,这些任务可能是负责与设备、其有些任务是事件驱动的,这些任务可能是负责与设备、其他处理机或其他系统通信的。他处理机或其他系统通信的。这类任务可以设计成由一个事件来触发,该事件常常针对这类任务可以设计成由一个事件来触发,该事件常常针对一些数据的到达发出信号。一些数据的到达发出信号。数据可能来自数据行或者来自另一个任务写入的数据缓冲数据可能来自数据行或者来自另一个任务写入的数据缓冲区。区。366.5 任务管理部分的设计(1)识别事件驱动任务识别事件驱动任务当系统运行时,这类任务的工作过程如下:当系统运行时,这类任务的工作过程如下:任务处于睡眠状态,等待来自数据行或其他数据源的中断;任务处于睡眠状态,等待来自数据行或其他数据源的中断;一旦接收到中断就唤醒该任务,接收数据并将数据放入内一旦接收到中断就唤醒该任务,接收数据并将数据放入内存缓冲区或其他目的地,通知需要知道这件事的对象,然存缓冲区或其他目的地,通知需要知道这件事的对象,然后该任务又回到睡眠状态。后该任务又回到睡眠状态。376.5 任务管理部分的设计(2)识别时钟驱动任务识别时钟驱动任务以固定的时间间隔激发这种事件,以执行某些处理。某些以固定的时间间隔激发这种事件,以执行某些处理。某些人机界面、子系统、任务、处理机或其他系统可能需要周人机界面、子系统、任务、处理机或其他系统可能需要周期性的通信,因此时钟驱动任务应运而生。期性的通信,因此时钟驱动任务应运而生。当系统运行时,这类任务的工作过程如下:当系统运行时,这类任务的工作过程如下:任务设置了唤醒时间后进入睡眠状态;任务设置了唤醒时间后进入睡眠状态;等待来自系统的一个时钟中断,一旦接收到这种中断,任等待来自系统的一个时钟中断,一旦接收到这种中断,任务就被唤醒,并做它的工作,通知有关的对象,然后该任务就被唤醒,并做它的工作,通知有关的对象,然后该任务又回到睡眠状态。务又回到睡眠状态。386.5 任务管理部分的设计(3)识别优先任务识别优先任务根据处理的优先级别来安排各个任务。优先任务可以满足根据处理的优先级别来安排各个任务。优先任务可以满足高优先级或低优先级的处理需求。高优先级或低优先级的处理需求。高优先级高优先级:某些服务具有很高的优先级,为了在严格限定:某些服务具有很高的优先级,为了在严格限定的时间内完成这种服务,可能需要把这类服务分离成独立的时间内完成这种服务,可能需要把这类服务分离成独立的任务。的任务。低优先级低优先级:与高优先级相反,有些服务是低优先级的,属:与高优先级相反,有些服务是低优先级的,属于低优先级处理(通常称为后台处理)。设计时可能用额于低优先级处理(通常称为后台处理)。设计时可能用额外的任务把这样的处理分离出来。外的任务把这样的处理分离出来。396.5 任务管理部分的设计(4)识别关键任务识别关键任务关键任务是有关系统成功或失败的关键处理,这类处理通关键任务是有关系统成功或失败的关键处理,这类处理通常都有严格的可靠性要求。常都有严格的可靠性要求。在设计过程中可能用额外的任务把这样的关键处理分离出在设计过程中可能用额外的任务把这样的关键处理分离出来,以满足高可靠性处理的要求。来,以满足高可靠性处理的要求。对高可靠性处理应该精心设计和编码,并且应该严格测试。对高可靠性处理应该精心设计和编码,并且应该严格测试。406.5 任务管理部分的设计(5)识别协调任务识别协调任务当有三个或更多的任务时,可考虑另外增加一个任务,这当有三个或更多的任务时,可考虑另外增加一个任务,这个任务起协调者的作用,将不同任务之间的协调控制封装个任务起协调者的作用,将不同任务之间的协调控制封装在协调任务中。在协调任务中。可以用状态转换矩阵来描述协调任务的行为。可以用状态转换矩阵来描述协调任务的行为。416.5 任务管理部分的设计(6)审查每个任务审查每个任务要使任务数保持到最少。要使任务数保持到最少。对每个任务要进行审查,确保它能满足一个或多个选择任对每个任务要进行审查,确保它能满足一个或多个选择任务的工程标准务的工程标准事件驱动、时钟驱动、优先任务事件驱动、时钟驱动、优先任务关键关键任务或协调者。任务或协调者。426.5 任务管理部分的设计(7)定义每个任务定义每个任务1)1)它是什么任务它是什么任务。首先要为任务命名,并对任务做简要描。首先要为任务命名,并对任务做简要描述。为面向对象设计部分的每个服务增加一个新的约束述。为面向对象设计部分的每个服务增加一个新的约束任务名。如果一个服务被分裂,交叉在多个任务中,则任务名。如果一个服务被分裂,交叉在多个任务中,则要修改服务名及其描述,使每个服务能映射到一个任务。要修改服务名及其描述,使每个服务能映射到一个任务。2)2)如何协调任务如何协调任务。定义每个任务如何协调工作。指出它是。定义每个任务如何协调工作。指出它是事件驱动的,还是时钟驱动的;对于事件驱动的任务,描事件驱动的,还是时钟驱动的;对于事件驱动的任务,描述触发该任务的事件;对时钟驱动的任务,描述在触发之述触发该任务的事件;对时钟驱动的任务,描述在触发之前所经过的时间间隔,同时指出它是一次性的,还是重复前所经过的时间间隔,同时指出它是一次性的,还是重复的事件间隔。的事件间隔。3)3)如何通信如何通信。定义每个任务如何通信,任务从哪里取数据。定义每个任务如何通信,任务从哪里取数据及往哪里送数据。及往哪里送数据。436.6 数据管理部分的设计在传统的结构化设计方法中,很容易将实体在传统的结构化设计方法中,很容易将实体-关系图映射关系图映射到关系数据库中。到关系数据库中。在面向对象设计中,我们可以将在面向对象设计中,我们可以将UMLUML类图看作是数据库的类图看作是数据库的概念模型,但在概念模型,但在UMLUML类图中除了类之间的关联关系外,还类图中除了类之间的关联关系外,还有继承关系。有继承关系。在映射时可以按下面的规则进行:在映射时可以按下面的规则进行:446.6 数据管理部分的设计(1)(1)一个普通的类可以映射为一个表或多个表,当分解为多一个普通的类可以映射为一个表或多个表,当分解为多个表时,可以采用个表时,可以采用横切和竖切横切和竖切的方法。的方法。竖切常用于实例较少而属性很多的对象,一般是现实中的竖切常用于实例较少而属性很多的对象,一般是现实中的事物,将不同分类的属性映射成不同的表。通常将经常使事物,将不同分类的属性映射成不同的表。通常将经常使用的属性放在主表中,而将其他一些次要的属性放到其他用的属性放在主表中,而将其他一些次要的属性放到其他表中。表中。横切常常用于记录与时间相关的对象,如成绩记录、运行横切常常用于记录与时间相关的对象,如成绩记录、运行记录等。由于一段时间后,这些对象很少被查看,所以往记录等。由于一段时间后,这些对象很少被查看,所以往往在主表中只记录最近的对象,而将以前的记录转到对应往在主表中只记录最近的对象,而将以前的记录转到对应的历史表中。的历史表中。456.6 数据管理部分的设计(2)关联关系的映射关联关系的映射 一对一关联的映射一对一关联的映射:对于一对一关联,可以在两个表中都:对于一对一关联,可以在两个表中都引入外键,这样两个表之间可以进行双向导航。也可以根引入外键,这样两个表之间可以进行双向导航。也可以根据具体情况,将类组合成一张单独的表。据具体情况,将类组合成一张单独的表。一对多关联的映射一对多关联的映射:可以将关联中的:可以将关联中的“一一”端毫无变化地端毫无变化地映射到一张表,将关联中表示映射到一张表,将关联中表示“多多”的端上的类映射到带的端上的类映射到带有外键的另一张表,使外键满足关系引用的完整性。有外键的另一张表,使外键满足关系引用的完整性。多对多关联的映射多对多关联的映射:由于记录的一个外键最多只能引用另:由于记录的一个外键最多只能引用另一条记录的一个主键值,因此关系数据库模型不能在表之一条记录的一个主键值,因此关系数据库模型不能在表之间直接维护一个多对多联系。为了表示多对多关联,关系间直接维护一个多对多联系。为了表示多对多关联,关系模型必须引入一个关联表,将两个类之间的多对多关联转模型必须引入一个关联表,将两个类之间的多对多关联转换成表上的两个一对多关联。换成表上的两个一对多关联。466.6 数据管理部分的设计(3)继承关系的映射:通常使用以下两种方法来映射继承关系的映射:通常使用以下两种方法来映射继承关系。继承关系。将基类映射到一张表,每个子类映射到一张表。在基类对将基类映射到一张表,每个子类映射到一张表。在基类对应的表中定义主键,而在子类定义的表中定义外键。应的表中定义主键,而在子类定义的表中定义外键。将每个子类映射到一张表,没有基类表。在每个子类的表将每个子类映射到一张表,没有基类表。在每个子类的表中包括基类的所有属性。这种方法适用于子类的个数不多,中包括基类的所有属性。这种方法适用于子类的个数不多,基类属性比较少的情况。基类属性比较少的情况。476.7 对象设计对象设计过程包括对象设计过程包括使用模式设计对象使用模式设计对象、接口规格接口规格说明说明、对象模型重构对象模型重构、对象模型优化对象模型优化4组活动。组活动。(1)(1)使用模式设计对象:设计者可以选择合适的设计模式,使用模式设计对象:设计者可以选择合适的设计模式,复用已有的解决方案,以提高系统的灵活性,并确保在系复用已有的解决方案,以提高系统的灵活性,并确保在系统开发过程中,特定类不会因要求的变化而被修改。统开发过程中,特定类不会因要求的变化而被修改。(2)(2)接口规格说明:在系统设计中所标识的子系统功能,都接口规格说明:在系统设计中所标识的子系统功能,都需要在类接口中详细说明,包括操作、参数、类型规格说需要在类接口中详细说明,包括操作、参数、类型规格说明和异常情况等。明和异常情况等。486.7 对象设计(3)(3)对象模型重构:重构的目的是改进对象设计模型,提高对象模型重构:重构的目的是改进对象设计模型,提高该模型的可读性和扩展性。如将两个相似的类归并为一个该模型的可读性和扩展性。如将两个相似的类归并为一个类;将没有明显活动特征的类转为属性;将复杂的类分解类;将没有明显活动特征的类转为属性;将复杂的类分解为简单的类;重新组合类和操作来增进封装性和继承性等。为简单的类;重新组合类和操作来增进封装性和继承性等。(4)(4)对象模型优化:优化活动是为了改进对象设计模型,以对象模型优化:优化活动是为了改进对象设计模型,以实现系统模型中的性能要求。包括选择更好的算法、提高实现系统模型中的性能要求。包括选择更好的算法、提高系统执行的速度、更好地使用存储系统、减少连接中的重系统执行的速度、更好地使用存储系统、减少连接中的重数来提高查询的速度、为了增加效率而增加额外的连接、数来提高查询的速度、为了增加效率而增加额外的连接、改变执行的顺序等。改变执行的顺序等。49使用模式设计对象使用模式设计对象设计模式包括设计模式包括4个要素:个要素:(1)(1)名字:用来将一设计模式与其他设计模式区分开。名字:用来将一设计模式与其他设计模式区分开。(2)(2)问题描述:用来描述该设计模式适用于何种情况。通常问题描述:用来描述该设计模式适用于何种情况。通常设计模式所解决的问题是对可更改性、可扩展性设计目标、设计模式所解决的问题是对可更改性、可扩展性设计目标、以及非功能性需求的实现。以及非功能性需求的实现。(3)(3)解决方案:描述解决该问题所需要的、结合在一起的类解决方案:描述解决该问题所需要的、结合在一起的类和接口的集合。和接口的集合。(4)(4)结果:描述将要解决设计目标的协议和可供选择的办法。结果:描述将要解决设计目标的协议和可供选择的办法。50使用模式设计对象使用模式设计对象设计模式中的继承设计模式中的继承在对象设计中,继承的核心是为了减少冗余和增加扩展性。在对象设计中,继承的核心是为了减少冗余和增加扩展性。通过将一些相似的类定义为子类,它们中的共有属性和操通过将一些相似的类定义为子类,它们中的共有属性和操作集中放到继承结构的父类中,就能减少由于引入变化而作集中放到继承结构的父类中,就能减少由于引入变化而引起的不一致。引起的不一致。尽管继承能够让对象模型更加容易理解和修改,并具有更尽管继承能够让对象模型更加容易理解和修改,并具有更好的扩展性,但有些时候使用继承也会带来一些副作用,好的扩展性,但有些时候使用继承也会带来一些副作用,特别是,它增加了类之间的耦合性。特别是,它增加了类之间的耦合性。51使用模式设计对象使用模式设计对象例如,假设例如,假设JavaJava没有提供对集合的没有提供对集合的操作,现在编写操作,现在编写MysetMyset类来实现这类来实现这些操作。些操作。如果我们选择想继承如果我们选择想继承java.util.Hashtablejava.util.Hashtable类,那么,类,那么,在在MysetMyset类中插入一个新元素首先类中插入一个新元素首先需要检查在表中是否存在一个表项,需要检查在表中是否存在一个表项,它的键值等于元素的键值,如果查它的键值等于元素的键值,如果查找失败,新元素就可以插入到表中。找失败,新元素就可以插入到表中。使用继承机制实现使用继承机制实现MySetMySet类的类图类的类图如图所示。如图所示。52使用模式设计对象使用模式设计对象使用继承机制实现使用继承机制实现MySet的代码如下:的代码如下:使用这种方式,让人们可以通过使用这种方式,让人们可以通过复用代码来实现他们所需的功能,复用代码来实现他们所需的功能,但同样会提供一些他们并不需要但同样会提供一些他们并不需要的功能。的功能。53使用模式设计对象使用模式设计对象授权授权授权是实现复用的另一种方法。授权是实现复用的另一种方法。A A类授权类授权B B类,是指类,是指A A类为了完成类为了完成一个操作需要向一个操作需要向B B类发一个消息。类发一个消息。可以使用两个类之间的关联关可以使用两个类之间的关联关系实现授权机制,在系实现授权机制,在A A类中增加类中增加一个类型为一个类型为B B的属性。的属性。54使用模式设计对象使用模式设计对象使用授权机制实现使用授权机制实现MySet的代码如下:的代码如下:55使用模式设计对象使用模式设计对象使用授权机制解决了我们在前面讨论的问题:使用授权机制解决了我们在前面讨论的问题:(1)(1)扩展性:使用授权机制实现的扩展性:使用授权机制实现的MySetMySet类没有包含类没有包含containsKeycontainsKey()()操作,并且属性操作,并且属性tabletable是私有的。这样,如果是私有的。这样,如果MySetMySet的内的内部实现使用的是链表而不是哈希表,也不会影响任何使用部实现使用的是链表而不是哈希表,也不会影响任何使用MySetMySet类的地方。类的地方。(2)(2)子类型化:子类型化:MySetMySet类不是从类不是从HashtableHashtable类继承来的,因此类继承来的,因此程序中的程序中的MySetMySet对象不能被替换为对象不能被替换为HashtableHashtable对象。以前使对象。以前使用用HashtableHashtable类的程序也不用改变。类的程序也不用改变。56使用模式设计对象使用模式设计对象对于上面所讨论的问题,我们可以定义一个新类对于上面所讨论的问题,我们可以定义一个新类MySetMySet,让让MySetMySet类遵从一个已存在的类遵从一个已存在的SetSet接口,并复用接口,并复用HashtableHashtable类所提供的活动功能。类所提供的活动功能。适配器(适配器(AdapterAdapter)设计模式就是解决这些问题的一个模)设计模式就是解决这些问题的一个模板化方案。使用适配器设计模式解决板化方案。使用适配器设计模式解决MySetMySet问题的方法如问题的方法如图所示。图所示。57接口规格说明设计接口规格说明设计在对象设计过程中,要标识和求精解对象,以实现在概要在对象设计过程中,要标识和求精解对象,以实现在概要设计期间定义的子系统。设计期间定义的子系统。对象设计的重点在于标识对象之间的界限。这个时期依然对象设计的重点在于标识对象之间的界限。这个时期依然存在向设计中引入错误的可能性。存在向设计中引入错误的可能性。接口规格说明的目标是能够清晰地描述每一个对象的接口,接口规格说明的目标是能够清晰地描述每一个对象的接口,这样开发者就能够独立地实现这些对象,以满足最小集成这样开发者就能够独立地实现这些对象,以满足最小集成的需求。的需求。58接口规格说明设计接口规格说明设计接口规格说明包括以下活动:接口规格说明包括以下活动:(1)(1)确定遗漏的属性和操作:在这个活动中,将检查每个子确定遗漏的属性和操作:在这个活动中,将检查每个子系统提供的服务及每一个分析对象,标识出被遗漏的操作系统提供的服务及每一个分析对象,标识出被遗漏的操作和属性。需要对当前的对象设计模型求精,同时也对这些和属性。需要对当前的对象设计模型求精,同时也对这些操作所用到的参数进行求精。操作所用到的参数进行求精。(2)(2)描述可见性和签名:在这个过程中,将决定哪一个操作描述可见性和签名:在这个过程中,将决定哪一个操作对其他对象和子系统是可用的,哪一个操作仅仅是对本子对其他对象和子系统是可用的,哪一个操作仅仅是对本子系统是可用的。并说明操作的签名。这个活动的目标是减系统是可用的。并说明操作的签名。这个活动的目标是减少子系统之间的偶合度,并提供一个较小且简单的接口,少子系统之间的偶合度,并提供一个较小且简单的接口,这个接口可被独立的开发者理解。这个接口可被独立的开发者理解。(3)(3)描述契约:描述每一个对象操作应该遵守的约束条件。描述契约:描述每一个对象操作应该遵守的约束条件。契约包括不变式、前置条件和后置条件三种类型的约束。契约包括不变式、前置条件和后置条件三种类型的约束。59接口规格说明设计接口规格说明设计开发者角色的分类开发者角色的分类在进一步研究对象设计和实现的细节时,则需要区分不同在进一步研究对象设计和实现的细节时,则需要区分不同的开发者。的开发者。当所有开发者都利用接口规格说明进行通信时,就需要从当所有开发者都利用接口规格说明进行通信时,就需要从各自不同的观点去看待规格说明。如图所示。各自不同的观点去看待规格说明。如图所示。60接口规格说明设计接口规格说明设计契约。契约。是在一个类上定义的,确保有关该类的类实现者、是在一个类上定义的,确保有关该类的类实现者、类使用者、类扩展者都要遵守的假定条件。契约说明了类类使用者、类扩展者都要遵守的假定条件。契约说明了类使用者在使用该类之前必须遵守的约束。使用者在使用该类之前必须遵守的约束。契约包括契约包括3种类型的约束:种类型的约束:(1)不变式:不变式是对该类的所有实例而言都为真的谓词。不变式:不变式是对该类的所有实例而言都为真的谓词。不变式是和类或接口有关的约束。不变式通常用来说明类不变式是和类或接口有关的约束。不变式通常用来说明类属性之间的一致性约束。属性之间的一致性约束。(2)前置条件:是在调用操作之前,必须为真的谓词。前置前置条件:是在调用操作之前,必须为真的谓词。前置条件和某个特定操作有关,用来说明类使用者在调用操作条件和某个特定操作有关,用来说明类使用者在调用操作之前必须满足的约束。之前必须满足的约束。(3)后置条件:是在调用操作之后必须为真的谓词。后置条后置条件:是在调用操作之后必须为真的谓词。后置条件与某个特定操作有关,用来说明类实现者和类扩展者在件与某个特定操作有关,用来说明类实现者和类扩展者在调用操作之后必须满足的约束。调用操作之后必须满足的约束。61重构对象设计模型重构对象设计模型重构是对源代码的转换,在不影响系统行为的前重构是对源代码的转换,在不影响系统行为的前提下,提高源代码的可读性和可修改性。提下,提高源代码的可读性和可修改性。重构通过考虑类的属性和方法,达到改进系统设重构通过考虑类的属性和方法,达到改进系统设计的目的。计的目的。62重构对象设计模型重构对象设计模型典型的重构活动的例子包括:典型的重构活动的例子包括:将将N N元关联转换成一组二元关联;元关联转换成一组二元关联;将两个不同子系统中相似的类合并为一个通用的类;将两个不同子系统中相似的类合并为一个通用的类;将没有明显活动特征的类转换为属性;将没有明显活动特征的类转换为属性;将复杂类分解为几个相互关联的简单类;将复杂类分解为几个相互关联的简单类;重新组合类和操作,增加封装性和继承性。重新组合类和操作,增加封装性和继承性。63优化对象设计模型优化对象设计模型在对象设计期间,对象模型需要进行优化,以达在对象设计期间,对象模型需要进行优化,以达到系统的设计目标,如最小化响应时间、执行时到系统的设计目标,如最小化响应时间、执行时间或内存资源等。间或内存资源等。一般情况下,系统的各项质量指标并不是同等重一般情况下,系统的各项质量指标并不是同等重要的,设计人员必须确定各项质量指标的相对重要的,设计人员必须确定各项质量指标的相对重要性(即确定优先级),以便在优化设计时制定要性(即确定优先级),以便在优化设计时制定折衷方案。折衷方案。在进行优化时,设计者应该在效率与清晰度之间在进行优化时,设计者应该在效率与清晰度之间寻找平衡。寻找平衡。优化可以提高系统的效率,但同时会增加系统的优化可以提高系统的效率,但同时会增加系统的复杂度。复杂度。64优化对象设计模型优化对象设计模型几种常用的优化方法包括:几种常用的优化方法包括:(1)(1)增加冗余关联以提高访问效率增加冗余关联以提高访问效率在面向对象设计过程中,当考虑用户的访问模式,及不同在面向对象设计过程中,当考虑用户的访问模式,及不同类型的访问彼此间的依赖关系时,就会发现,分析阶段确类型的访问彼此间的依赖关系时,就会发现,分析阶段确定的关联可能并没有构成效率最高的访问路径。定的关联可能并没有构成效率最高的访问路径。下面用设计公司雇员技能数据库的例子,说明分析访问路下面用设计公司雇员技能数据库的例子,说明分析访问路径及提高访问效率的方法。径及提高访问效率的方法。65优化对象设计模型优化对象设计模型公司、雇员及技能之间的关联链如图所示。公司、雇员及技能之间的关联链如图所示。公司类中服务公司类中服务find_skillfind_skill返回具有指定技能的雇员集合。返回具有指定技能的雇员集合。例如,用户可能询问公司中会讲日语的雇员有哪些人。例如,用户可能询问公司中会讲日语的雇员有哪些人。假设某公司共有假设某公司共有20002000名雇员,平均每名雇员会名雇员,平均每名雇员会1010种技能,种技能,则简单的嵌套查询将遍历雇员对象则简单的嵌套查询将遍历雇员对象20002000次,针对每名雇员次,针对每名雇员平均再遍历技能对象平均再遍历技能对象1010次。如果全公司仅有次。如果全公司仅有5 5名雇员精通名雇员精通日语,则查询命中率仅有日语,则查询命中率仅有1/40001/4000。66优化对象设计模型优化对象设计模型针对上面的例子,我们可以增加一个额外的限定关联针对上面的例子,我们可以增加一个额外的限定关联“精精通语言通语言”,用来联系公司与雇员这两类对象,如图所示。,用来联系公司与雇员这两类对象,如图所示。利用冗余关联,可以立即查到精通某种具体语言的雇员,利用冗余关联,可以立即查到精通某种具体语言的雇员,当然,索引也必然带来多余的内存开销。当然,索引也必然带来多余的内存开销。67优化对象设计模型优化对象设计模型(2)(2)调整查询次序调整查询次序例如,假设用户在使用上述的雇员技能数据库的过程中,例如,假设用户在使用上述的雇员技能数据库的过程中,希望找出既会讲日语,又会讲法语的所有雇员。希望找出既会讲日语,又会讲法语的所有雇员。如果某公司只有如果某公司只有5 5位雇员会讲日语,会讲法语的雇员却有位雇员会讲日语,会讲法语的雇员却有200200人,则应该先查找会讲日语的雇员,然后再从这些会人,则应该先查找会讲日语的雇员,然后再从这些会讲日语的雇员中查找同时会讲法语的人。讲日语的雇员中查找同时会讲法语的人。68优化对象设计模型优化对象设计模型(3)(3)保留派生属性保留派生属性通过某种运算而从其他数据派生出来的数据,可以把这类通过某种运算而从其他数据派生出来的数据,可以把这类冗余数据作为派生属性保存起来。冗余数据作为派生属性保存起来。69
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!