软件工程讲义-第10章-构件级设计建模要点课件.ppt

上传人(卖家):三亚风情 文档编号:3008584 上传时间:2022-06-21 格式:PPT 页数:72 大小:1.48MB
下载 相关 举报
软件工程讲义-第10章-构件级设计建模要点课件.ppt_第1页
第1页 / 共72页
软件工程讲义-第10章-构件级设计建模要点课件.ppt_第2页
第2页 / 共72页
软件工程讲义-第10章-构件级设计建模要点课件.ppt_第3页
第3页 / 共72页
软件工程讲义-第10章-构件级设计建模要点课件.ppt_第4页
第4页 / 共72页
软件工程讲义-第10章-构件级设计建模要点课件.ppt_第5页
第5页 / 共72页
点击查看更多>>
资源描述

1、现代软件工程第10章 构件级设计建模主要内容v什么是构件什么是构件v设计基于类的构件设计基于类的构件v实施构件级设计实施构件级设计v对象约束语言对象约束语言v设计传统构件设计传统构件v小结小结构件级设计建模v一套完整的软件构件是在体系结构设计过一套完整的软件构件是在体系结构设计过程中定义的。但是没有在接近代码的抽象程中定义的。但是没有在接近代码的抽象级上表示内部数据结构和每个构件的处理级上表示内部数据结构和每个构件的处理细节。构件级设计定义了数据结构、算法、细节。构件级设计定义了数据结构、算法、接口特征和分配给每个软件构件的通信机接口特征和分配给每个软件构件的通信机制。制。构件级设计建模v必须

2、能够在建造软件之前就确定该软件是必须能够在建造软件之前就确定该软件是否可以工作。为了保证设计的正确性,以否可以工作。为了保证设计的正确性,以及与早期设计表示(即数据、体系结构和及与早期设计表示(即数据、体系结构和接口设计)的一致性,构件级设计需要以接口设计)的一致性,构件级设计需要以一种可以评审设计细节的方式来表示软件。一种可以评审设计细节的方式来表示软件。它提供了一种评估数据结构、接口和算法它提供了一种评估数据结构、接口和算法是否能够工作的方法。是否能够工作的方法。构件级设计建模v 数据、体系结构和接口的设计表示构成数据、体系结构和接口的设计表示构成了构件级设计的基础。每个构件的类定义了构件

3、级设计的基础。每个构件的类定义或者处理叙述都转化为一种详细设计,该或者处理叙述都转化为一种详细设计,该设计采用图形或基于文本的形式来详细说设计采用图形或基于文本的形式来详细说明内部的数据结构、局部接口细节和处理明内部的数据结构、局部接口细节和处理逻辑。设计符号包括逻辑。设计符号包括UML图和一些辅助表图和一些辅助表示。通过使用一系列结构化编程结构来说示。通过使用一系列结构化编程结构来说明程序的设计。明程序的设计。构件级设计建模v每个软件的设计都以图形的、图表的或基每个软件的设计都以图形的、图表的或基于文本的方式表示,这是构件级设计阶段于文本的方式表示,这是构件级设计阶段产生的主要工作产品。产生

4、的主要工作产品。v采用设计走查或审查机制。对设计执行检采用设计走查或审查机制。对设计执行检查以确定数据结构、接口、处理顺序和逻查以确定数据结构、接口、处理顺序和逻辑条件等是否都正确,并且给出早期设计辑条件等是否都正确,并且给出早期设计中与构件相关的数据或控制变换。中与构件相关的数据或控制变换。构件级设计建模v体系结构设计第一次迭代完成之后,就应体系结构设计第一次迭代完成之后,就应该开始构件级设计。在这个阶段,全部的该开始构件级设计。在这个阶段,全部的数据和软件的程序结构都已经建立起来,数据和软件的程序结构都已经建立起来,其目的是把设计模型转化为运行软件。但其目的是把设计模型转化为运行软件。但是

5、现有设计模型的抽象层次相对较高,而是现有设计模型的抽象层次相对较高,而可运行程序的抽象层次相对较低。这种转可运行程序的抽象层次相对较低。这种转化具有挑战性,因为可能会在软件过程后化具有挑战性,因为可能会在软件过程后期阶段引入难于发现和改正的微小错误。期阶段引入难于发现和改正的微小错误。构件级设计建模v用编程语言表示构件级设计是可以的。其用编程语言表示构件级设计是可以的。其实,程序的创建是以体系结构设计模型作实,程序的创建是以体系结构设计模型作为指南的。一种可供考虑的方法是使用某为指南的。一种可供考虑的方法是使用某些能够容易转化为代码的中间表示来表示些能够容易转化为代码的中间表示来表示构件级设计

6、。无论采用何种机制来表示构构件级设计。无论采用何种机制来表示构件级设计,定义的数据结构、接口和算法件级设计,定义的数据结构、接口和算法应该遵守各种已经精心规定好的设计指导应该遵守各种已经精心规定好的设计指导准则,以避免在过程设计演化中犯错误。准则,以避免在过程设计演化中犯错误。什么是构件v通常来讲,构件是计算机软件中的一个模通常来讲,构件是计算机软件中的一个模块化的构造块。块化的构造块。OMG UML规范将构件定规范将构件定义为义为“系统中某一定型化的、可配置的和系统中某一定型化的、可配置的和可替换的部件,该部件封装了实现并暴露可替换的部件,该部件封装了实现并暴露一系列接口一系列接口”。v构件

7、存在于软件体系结构中,因而构件在构件存在于软件体系结构中,因而构件在完成所建系统的需求和目标中起重要作用。完成所建系统的需求和目标中起重要作用。由于构件驻留于软件体系结构的内部,它由于构件驻留于软件体系结构的内部,它们必须与其他的构件和存在于软件边界以们必须与其他的构件和存在于软件边界以外的实体进行通信和合作。外的实体进行通信和合作。面向对象的观点v在面向对象软件工程环境中,构件包括一个在面向对象软件工程环境中,构件包括一个协作类集合。构件中的每一个类都被详细阐协作类集合。构件中的每一个类都被详细阐述,包括所有的属性和与其实现相关的操作。述,包括所有的属性和与其实现相关的操作。作为细节设计的一

8、部分,所有与其他设计类作为细节设计的一部分,所有与其他设计类相互通信协作的接口必须予以定义。为了完相互通信协作的接口必须予以定义。为了完成这些,设计师从分析模型开始,详细描述成这些,设计师从分析模型开始,详细描述分析类和基础类。分析类和基础类。面向对象的观点v考虑为一个高级印刷车间构建软件。软件考虑为一个高级印刷车间构建软件。软件的目的是为了收集前台的客户需求,对印的目的是为了收集前台的客户需求,对印刷业务进行定价,然后把印刷任务交给自刷业务进行定价,然后把印刷任务交给自动生产设备。在需求工程中得到了一个被动生产设备。在需求工程中得到了一个被称为称为PrintJob的分析类,如图的分析类,如图

9、10-1所示。所示。PrintJob有两个接口:有两个接口:computeJob具有具有对任务进行定价的功能,对任务进行定价的功能,initiateJob能够能够把任务传给生产设备。把任务传给生产设备。面向对象的观点图10-1设计构件的细化面向对象的观点v构件级设计将由此开始。必须对构件级设计将由此开始。必须对PrintJob构件构件的细节进行细化,以提供指导实现的充分信息。的细节进行细化,以提供指导实现的充分信息。通过不断补充作为构件通过不断补充作为构件PrintJob的类的全部属的类的全部属性和操作,来逐步细化最初的分析类。性和操作,来逐步细化最初的分析类。v定义为体系结构设计组成部分的每

10、一个构件都定义为体系结构设计组成部分的每一个构件都要实施细化。细化一旦完成,要对每一个属性、要实施细化。细化一旦完成,要对每一个属性、每一个操作和每一个接口进行更进一步的细化。每一个操作和每一个接口进行更进一步的细化。适合每个属性的数据结构必须予以详细说明。适合每个属性的数据结构必须予以详细说明。另外还要说明实现与操作相关的处理逻辑的算另外还要说明实现与操作相关的处理逻辑的算法细节。最后是实现接口所需机制的设计。对法细节。最后是实现接口所需机制的设计。对于面向对象软件,还包含对实现系统内部对象于面向对象软件,还包含对实现系统内部对象间消息通信机制的描述。间消息通信机制的描述。传统观点v在传统软

11、件工程环境中,一个构件就是程序的在传统软件工程环境中,一个构件就是程序的一个功能要素,程序由处理逻辑及实现处理逻一个功能要素,程序由处理逻辑及实现处理逻辑所需的内部数据结构以及能够保证构件被调辑所需的内部数据结构以及能够保证构件被调用和实现数据传递的接口构成。传统构件也被用和实现数据传递的接口构成。传统构件也被称为模块,作为软件体系结构的一部分,它承称为模块,作为软件体系结构的一部分,它承担如下三个重要角色之一:担如下三个重要角色之一:(1)控制构件,协调控制构件,协调问题域中所有其他构件的调用问题域中所有其他构件的调用;(2)问题域构件,问题域构件,完成部分或全部用户的需求完成部分或全部用户

12、的需求;(3)基础设施构件,基础设施构件,负责完成问题域中所需相关处理的功能。负责完成问题域中所需相关处理的功能。传统观点v与面向对象的构件相类似,传统的软件构件也与面向对象的构件相类似,传统的软件构件也来自于分析模型。不同的是在该种情况下,是来自于分析模型。不同的是在该种情况下,是以分析模型中的数据流要素作为导出构件的基以分析模型中的数据流要素作为导出构件的基础。数据流图最低层的每个变换都被映射为某础。数据流图最低层的每个变换都被映射为某一层次上的模块。一般来讲,控制构件位于层一层次上的模块。一般来讲,控制构件位于层次结构顶层附近,而问题域构件则倾向位于层次结构顶层附近,而问题域构件则倾向位

13、于层次结构的底层。为了获得有效的模块化,在构次结构的底层。为了获得有效的模块化,在构件细化过程中采用了功能独立性的设计概念。件细化过程中采用了功能独立性的设计概念。传统观点再来考虑为一个高级影印中心构建软件。再来考虑为一个高级影印中心构建软件。在分析模型建立过程中导出一组数据流图。在分析模型建立过程中导出一组数据流图。假设这些数据流图已经被映射到图假设这些数据流图已经被映射到图10-2中中所显示的体系结构中。图中每个方框都表所显示的体系结构中。图中每个方框都表示一个软件构件。示一个软件构件。传统观点图10-2 一个传统系统的结构图传统观点v考虑考虑ComputePageCost模块。该模块的目

14、的在模块。该模块的目的在于根据用户提供的规格说明来计算每页的印刷费用。于根据用户提供的规格说明来计算每页的印刷费用。为了实现该功能需要以下数据:文档的页数,文档为了实现该功能需要以下数据:文档的页数,文档的印刷份数,单面或者双面印刷,颜色,纸张大小。的印刷份数,单面或者双面印刷,颜色,纸张大小。这些数据通过该模块的接口传递给这些数据通过该模块的接口传递给ComputePageCost。ComputePageCost根据任根据任务量和复杂度,使用这些数据来决定一页的费用务量和复杂度,使用这些数据来决定一页的费用这是一个通过接口将所有数据传递给模块的功能。这是一个通过接口将所有数据传递给模块的功能

15、。每一页的费用与任务的大小成反比,与任务的复杂每一页的费用与任务的大小成反比,与任务的复杂度成正比。度成正比。传统观点v图图10-3给出了使用给出了使用UML建模符号描述的构件级建模符号描述的构件级设计。其中设计。其中ComputePageCost模块通过调用模块通过调用getJobData模块和数据库接口模块和数据库接口accessCostDB来访问数据。接着,对来访问数据。接着,对ComputePageCost模模块进一步细化,给出算法和接口的细节描述。块进一步细化,给出算法和接口的细节描述。其中算法的细节可以由图中显示的伪代码或者其中算法的细节可以由图中显示的伪代码或者UML活动图来表示

16、。接口被表示为一组输入和活动图来表示。接口被表示为一组输入和输出的数据对象或者数据项的集合。设计细化输出的数据对象或者数据项的集合。设计细化的过程需要一直进行到获得构件的导向结构为的过程需要一直进行到获得构件的导向结构为止。止。传统观点图10-3 ComputePageCost的构件级设计过程相关的观点v上面提及的关于构件级设计的面向对象观点和传上面提及的关于构件级设计的面向对象观点和传统观点,都假定从头开始设计构件。即设计者必须统观点,都假定从头开始设计构件。即设计者必须根据从分析模型中导出的规格说明创建新构件。当根据从分析模型中导出的规格说明创建新构件。当然,还存在另外一种方法。然,还存在

17、另外一种方法。v在过去的在过去的10年间,软件工程已经开始强调使用已年间,软件工程已经开始强调使用已有构件来构造系统的必要性。实际上,软件工程师有构件来构造系统的必要性。实际上,软件工程师在设计过程中可以使用已经过验证的设计或代码构在设计过程中可以使用已经过验证的设计或代码构件的目录。当软件体系结构设计完后,就可以从目件的目录。当软件体系结构设计完后,就可以从目录中选出构件或者设计模式,并用于组装体系结构。录中选出构件或者设计模式,并用于组装体系结构。由于这些构件是根据复用思想来创建的,所以其接由于这些构件是根据复用思想来创建的,所以其接口的完整描述、要实现的功能和需要的通信与协作口的完整描述

18、、要实现的功能和需要的通信与协作等对于设计者来说都是可以得到的。等对于设计者来说都是可以得到的。设计基于类的构件v构件级设计利用了分析模型开发的信息和构件级设计利用了分析模型开发的信息和体系结构模型表示的信息。当选择了面向体系结构模型表示的信息。当选择了面向对象软件工程方法后,构件级设计主要关对象软件工程方法后,构件级设计主要关注分析类的细化和基础类的定义和精化。注分析类的细化和基础类的定义和精化。这些类的属性、操作和接口的详细描述是这些类的属性、操作和接口的详细描述是开始构建活动之前所需的设计细节。开始构建活动之前所需的设计细节。基本设计原则v有四种适用于构件级设计的基本设计原则,这有四种适

19、用于构件级设计的基本设计原则,这些原则在使用面向对象软件工程方法时被广泛些原则在使用面向对象软件工程方法时被广泛采用。使用这些原则的根本动机在于,使得产采用。使用这些原则的根本动机在于,使得产生的设计在发生变更时能够适应变更并且减少生的设计在发生变更时能够适应变更并且减少副作用的传播。副作用的传播。v开关原则开关原则(OCP):模块应该对外延具有开放性,:模块应该对外延具有开放性,对修改具有封闭性。简单地说,设计者应该采对修改具有封闭性。简单地说,设计者应该采用一种无需对构件自身内部做修改就可以进行用一种无需对构件自身内部做修改就可以进行扩展的方式来说明构件。扩展的方式来说明构件。SAFEHO

20、ME实例500SAFEHOME实例51图10-4 遵循OCP原则基本设计原则vLiskov替换原则替换原则(LSP):“子类可以替换子类可以替换它们的基类它们的基类”。最早提出该原则的。最早提出该原则的LIS88建议,将子类传递给构件来代替建议,将子类传递给构件来代替基类时,使用基类的构件应该仍然能够正基类时,使用基类的构件应该仍然能够正确完成其功能。确完成其功能。LSP原则要求源自基类的原则要求源自基类的任何子类必须遵守基类与使用该基类的构任何子类必须遵守基类与使用该基类的构件之间的隐含约定。件之间的隐含约定。基本设计原则v依赖倒置原则依赖倒置原则(DIP):“依赖于抽象,而非具依赖于抽象,

21、而非具体实现体实现”。抽象可以比较容易地对设计进行扩。抽象可以比较容易地对设计进行扩展,又不会导致大的混乱。构件依赖的具体构展,又不会导致大的混乱。构件依赖的具体构件越多,其扩展起来就越困难。件越多,其扩展起来就越困难。v接口分离原则接口分离原则(ISP):“多个用户专用接口比一多个用户专用接口比一个通用接口要好个通用接口要好”。多个客户构件使用一个服。多个客户构件使用一个服务器类提供的操作的实例很多。务器类提供的操作的实例很多。ISP原则建议设原则建议设计者应该为每一个主要的客户类型都设计一个计者应该为每一个主要的客户类型都设计一个特定的接口。只有那些与特定客户类型相关的特定的接口。只有那些

22、与特定客户类型相关的操作,才应该出现在该客户的接口说明中。如操作,才应该出现在该客户的接口说明中。如果多个客户要求相同的操作,则这些操作应该果多个客户要求相同的操作,则这些操作应该在每一个特定的接口中都加以说明。在每一个特定的接口中都加以说明。基本设计原则v发布复用等价性原则发布复用等价性原则:”复用的粒度就是复用的粒度就是发布的粒度发布的粒度”。当类或构件被设计用以复。当类或构件被设计用以复用时,在可复用实体的开发者和使用者之用时,在可复用实体的开发者和使用者之间就建立了一种隐含的约定关系。开发者间就建立了一种隐含的约定关系。开发者承诺建立一个发布控制系统,用来支持和承诺建立一个发布控制系统

23、,用来支持和维护实体的各种老版本,同时用户缓慢地维护实体的各种老版本,同时用户缓慢地将其升级到最新版本。明智的方法是将可将其升级到最新版本。明智的方法是将可复用的类分组打包成能够管理和控制的包复用的类分组打包成能够管理和控制的包作为一个更新的版本,而不是对每个类分作为一个更新的版本,而不是对每个类分别进行升级。别进行升级。基本设计原则v共同封装原则共同封装原则:”一同变更的类应该合在一同变更的类应该合在一起一起”。类应该根据其内聚性进行打包。类应该根据其内聚性进行打包。即当类被打包成设计的一部分时,它们应即当类被打包成设计的一部分时,它们应该处理相同的功能或者行为域。当域的一该处理相同的功能或

24、者行为域。当域的一些特征必须变更时,只有那些包中的类才些特征必须变更时,只有那些包中的类才有可能需要修改。这样可以进行更加有效有可能需要修改。这样可以进行更加有效的变更控制和发布管理。的变更控制和发布管理。基本设计原则v共同复用原则共同复用原则:”不能一起复用的类不能不能一起复用的类不能被分到一组被分到一组”。当包中的一个或者多个类。当包中的一个或者多个类变更时,包的发布版本数量也会发生。所变更时,包的发布版本数量也会发生。所有那些依赖于已经发生变更的包的类或者有那些依赖于已经发生变更的包的类或者包,都必须升级到最新的版本,并且都需包,都必须升级到最新的版本,并且都需要进行测试以保证新发布的版

25、本能够无故要进行测试以保证新发布的版本能够无故障运转。如果类没有根据内聚性进行分组,障运转。如果类没有根据内聚性进行分组,那么这个包中与其他类无关联的类有可能那么这个包中与其他类无关联的类有可能会发生变更,而这往往会导致进行没有必会发生变更,而这往往会导致进行没有必要的集成和测试。因此,只有那些一起被要的集成和测试。因此,只有那些一起被复用的类才应该包含在一个包中。复用的类才应该包含在一个包中。构件级设计指导方针v构件构件。对那些已经被确定为体系结构模型一部。对那些已经被确定为体系结构模型一部分的构件应该建立命名约定,并对其做进一步分的构件应该建立命名约定,并对其做进一步的细化和精化,使其成为

26、构件级模型的一部分。的细化和精化,使其成为构件级模型的一部分。体系结构构件的名字来源于问题域,并且应该体系结构构件的名字来源于问题域,并且应该能够被查看体系结构模型的所有共利益者理解。能够被查看体系结构模型的所有共利益者理解。v在详细设计层面使用构造型帮助识别构件的特在详细设计层面使用构造型帮助识别构件的特性也很有价值。性也很有价值。构件级设计指导方针v接口接口。接口提供关于通信和协作的重要信息。接口提供关于通信和协作的重要信息。然而接口表示的随意性会使构件图趋于复杂化。然而接口表示的随意性会使构件图趋于复杂化。AMB02建议:建议:(1)当构件图变得复杂时,在较当构件图变得复杂时,在较正式的

27、正式的UML框和虚箭头记号方法中使用接口的棒框和虚箭头记号方法中使用接口的棒棒糖式记号;棒糖式记号;(2)为了保持一致,接口都放在构为了保持一致,接口都放在构件框的左边;件框的左边;(3)即使其他的接口也适用,也只即使其他的接口也适用,也只表示出那些与构件相关的接口。表示出那些与构件相关的接口。v依赖与继承依赖与继承。为了提高可读性,依赖关系是自。为了提高可读性,依赖关系是自左向右,继承关系是自下而上。另外,构件之间左向右,继承关系是自下而上。另外,构件之间的依赖关系通过接口来表示,而不是采用的依赖关系通过接口来表示,而不是采用“构件构件到构件到构件”的方法来表示。遵照的方法来表示。遵照OCP

28、的思想,这种的思想,这种方法使得系统更易于维护。方法使得系统更易于维护。内聚性v内聚性意味着构件或者类只封装那些相互内聚性意味着构件或者类只封装那些相互关联密切,以及与构件或类自身有密切关关联密切,以及与构件或类自身有密切关系的属性和操作。系的属性和操作。LET01定义了许多不定义了许多不同类型的内聚性。同类型的内聚性。内聚性v功能内聚功能内聚v分层内聚分层内聚v通信内聚通信内聚v顺序内聚顺序内聚v过程内聚过程内聚v暂时内聚暂时内聚v实用内聚实用内聚耦合性v耦合性是类之间彼此联系程度的一种定性耦合性是类之间彼此联系程度的一种定性度量。随着类相互依赖越来越多。类之间度量。随着类相互依赖越来越多。

29、类之间的耦合程度亦会增加。在构件级设计中,的耦合程度亦会增加。在构件级设计中,一个重要的目标就是尽可能保持低耦合。一个重要的目标就是尽可能保持低耦合。vLET01定义了如下耦合分类:定义了如下耦合分类:耦合性v内容耦合内容耦合v共用耦合共用耦合v控制耦合控制耦合v印记耦合印记耦合v数据耦合数据耦合v例程调用耦合例程调用耦合v类型使用耦合类型使用耦合v包含或者导入耦合包含或者导入耦合v外部耦合外部耦合实施构件级设计v构件级设计本质上是细化的。设计者必须构件级设计本质上是细化的。设计者必须将分析模型和架构模型中的信息转化为一将分析模型和架构模型中的信息转化为一种设计表示,这种表示提供了用来指导构种

30、设计表示,这种表示提供了用来指导构建活动的充分信息。建活动的充分信息。实施构件级设计v步骤步骤1:标识出所有与问题域相对应的类。标识出所有与问题域相对应的类。使用分析模型和架构模型,每个分析类和使用分析模型和架构模型,每个分析类和体系结构构件都要细化。体系结构构件都要细化。v步骤步骤2:确定所有与基础设施域相对应的设确定所有与基础设施域相对应的设计类。计类。在分析模型中并没有描述这些类,在分析模型中并没有描述这些类,并且在体系结构设计中也经常忽略这些类,并且在体系结构设计中也经常忽略这些类,但是此时必须对它们进行描述。这种类型但是此时必须对它们进行描述。这种类型的类和构件包括的类和构件包括GU

31、I构件、操作系统构件、构件、操作系统构件、对象和数据管理构件等。对象和数据管理构件等。实施构件级设计v步骤步骤3:细化所有不能作为复用构件的设计类。细化所有不能作为复用构件的设计类。详细描述实现类需要的所有接口、属性和操详细描述实现类需要的所有接口、属性和操作。在实现这个任务时,必须考虑采用设计作。在实现这个任务时,必须考虑采用设计试探法。试探法。v步骤步骤3a:在类或构件的协作时说明消息的细在类或构件的协作时说明消息的细节。节。分析模型中用协作图来显示分析类之间分析模型中用协作图来显示分析类之间的相互协作。在构件级设计过程中,某些情的相互协作。在构件级设计过程中,某些情况下通过对系统中对象间

32、传递消息的结构进况下通过对系统中对象间传递消息的结构进行说明,来表现协作细节是必要的。这可作行说明,来表现协作细节是必要的。这可作为接口规格说明的前提,这些接口显示了系为接口规格说明的前提,这些接口显示了系统中构件通信和协作的方式。统中构件通信和协作的方式。实施构件级设计v图图10-6给出了前述印刷系统的一个简单给出了前述印刷系统的一个简单协作图。协作图。ProductionJob、WorkOrder和和JobQueue三个对象相互协作为生产线三个对象相互协作为生产线准备印刷作业。图中的箭头表示对象间传准备印刷作业。图中的箭头表示对象间传递的消息。递的消息。v随着设计的进行,消息通过下列方式的

33、扩随着设计的进行,消息通过下列方式的扩展语法来细化:展语法来细化:guard condition sequence expression(return value):=message name(argument list)实施构件级设计图10-6 带消息的协作图实施构件级设计vguard condition采用对象约束语言采用对象约束语言OCL来来书写,并且说明了在消息发出之前应该满足什书写,并且说明了在消息发出之前应该满足什么样的条件集合;么样的条件集合;vSequence expression是一个表明消息发送序是一个表明消息发送序号的整数或其他样式的表明发送顺序的指示符;号的整数或其他样

34、式的表明发送顺序的指示符;v(return value)是由消息唤醒操作返回的信息是由消息唤醒操作返回的信息名;名;vmessage name表示唤醒的操作,表示唤醒的操作,(argument list)是传递给操作的属性列表。是传递给操作的属性列表。实施构件级设计v步骤步骤3b:为每一个构件确定适当的接口为每一个构件确定适当的接口。在构件级设计中,一个在构件级设计中,一个UML接口是接口是“一组一组外部可见的(即公共的)操作。接口不包外部可见的(即公共的)操作。接口不包括内部结构,没有属性,没有关联括内部结构,没有属性,没有关联。接口是某个抽象类的等价物,该抽象类提接口是某个抽象类的等价物,

35、该抽象类提供了设计类之间的可控连接。实际上,为供了设计类之间的可控连接。实际上,为设计类定义的操作可以归结为一个或者更设计类定义的操作可以归结为一个或者更多的抽象类。抽象类内的每个操作应该是多的抽象类。抽象类内的每个操作应该是内聚的,即它应该展示那些关注于一个有内聚的,即它应该展示那些关注于一个有限功能或者子功能的处理。限功能或者子功能的处理。实施构件级设计v参照图参照图10-1,由于,由于initiateJob接口没有展现出足够的接口没有展现出足够的内聚性而受到争议。实际上,它完成三个不同的子功能:内聚性而受到争议。实际上,它完成三个不同的子功能:建立工作单,检查任务的优先级建立工作单,检查

36、任务的优先级,并将任务传递给生产,并将任务传递给生产线。接口设计应该重构。一种方法是重新检查设计类并线。接口设计应该重构。一种方法是重新检查设计类并定义一个新类定义一个新类WorkOrder,该类用来处理与装配工作,该类用来处理与装配工作单相关的所有活动。单相关的所有活动。buildWorkOrder()操作操作成为该类成为该类的一部分。另外可能要定义一个的一部分。另外可能要定义一个合并了操作合并了操作checkPriority()的的JobQueue类类。ProductionJob类类包括传递给生产线的生产任务的所有相关信息。包括传递给生产线的生产任务的所有相关信息。initiateJob接

37、口将采用图接口将采用图10-7所示的形式。所示的形式。initiateJob现在是内聚的现在是内聚的,集中在一个功能上。与,集中在一个功能上。与ProductionJob、WorkOrder和和JobQueue相关的接相关的接口都是近乎专诚的。口都是近乎专诚的。实施构件级设计图10-7 为PrintJob重构接口和类定义实施构件级设计v步骤步骤3c:细化属性并且定义相应的数据类细化属性并且定义相应的数据类型和数据结构型和数据结构。UML采用下面的语法来定采用下面的语法来定义属性的数据类型:义属性的数据类型:name:type-expression=initial-valueproperty s

38、tring其中其中name是属性名,是属性名,type expression是数据类型;是数据类型;initial-value是创建对象时是创建对象时属性的初始值;属性的初始值;property string用于定用于定义属性的特征或特性。义属性的特征或特性。实施构件级设计v在构件级设计的第一轮迭代中,属性通常在构件级设计的第一轮迭代中,属性通常用名字来描述。随着设计的进一步细化,用名字来描述。随着设计的进一步细化,使用使用UML的属性格式注释来定义每一个属的属性格式注释来定义每一个属性。如可以下列方式来定义性。如可以下列方式来定义paperType-weight:paperType-weig

39、ht:string=“A”contains 1 of 4 values A,B,C or Dv如果某一属性在多个设计类中重复出现,如果某一属性在多个设计类中重复出现,并且其自身具有比较复杂的结构,最好是并且其自身具有比较复杂的结构,最好是为这个属性创建一个单独的类。为这个属性创建一个单独的类。实施构件级设计v步骤步骤3d:详细描述每个操作中的处理流。详细描述每个操作中的处理流。可以用可以用流程图、伪代码或者流程图、伪代码或者UML活动图来完成。每个活动图来完成。每个软件构件都需要应用逐步求精概念通过大量的软件构件都需要应用逐步求精概念通过大量的迭代进行细化。迭代进行细化。v第一轮迭代中,将每个

40、操作都定义为设计类的第一轮迭代中,将每个操作都定义为设计类的一部分。任何情况下,操作应该采用确保高内一部分。任何情况下,操作应该采用确保高内聚性的方式来刻画;即,一个操作应该完成单聚性的方式来刻画;即,一个操作应该完成单一的目标功能或者子功能。接下来的一轮迭代,一的目标功能或者子功能。接下来的一轮迭代,只是完成对操作名的详细扩展。如对图只是完成对操作名的详细扩展。如对图10-1中中的操作的操作computePaperCost()可以采用如下方可以采用如下方式进行扩展式进行扩展:computePaperCost(weight,size,color):numeric实施构件级设计v如果实现如果实现

41、computePaperCost()的算法简单而的算法简单而且易于理解,则没有必要开展进一步的设计细且易于理解,则没有必要开展进一步的设计细化。软件编码人员将会提供实现这些操作的必化。软件编码人员将会提供实现这些操作的必要细节。如果算法比较复杂或者难于理解,则要细节。如果算法比较复杂或者难于理解,则需要进行设计细化。图需要进行设计细化。图10-8给出了操作给出了操作computePaperCost()的一个的一个UML活动图。当活动图。当活动图用于构件级设计的规格说明时,通常都活动图用于构件级设计的规格说明时,通常都在比源码更高的抽象级上表示。另外,还可以在比源码更高的抽象级上表示。另外,还可

42、以在设计规格说明中使用伪代码。在设计规格说明中使用伪代码。实施构件级设计图10-8 computePaperCost()操作的UML活动图实施构件级设计v步骤步骤4:说明持久数据源说明持久数据源(数据库和文件数据库和文件)并确定并确定管理数据源所需要的类。管理数据源所需要的类。数据库和文件通常都数据库和文件通常都凌架于单独的构件设计描述之上。在多数情况凌架于单独的构件设计描述之上。在多数情况下,这些持久数据存储起初都被指定为体系结下,这些持久数据存储起初都被指定为体系结构设计的一部分,然而,随着设计细化过程的构设计的一部分,然而,随着设计细化过程的不断深入,提供关于这些持久数据源的结构和不断深

43、入,提供关于这些持久数据源的结构和组织等额外细节常常是有用的。组织等额外细节常常是有用的。实施构件级设计v步骤步骤5:开发并且细化类或构件的行为表示。开发并且细化类或构件的行为表示。UML状态图状态图被用作分析模型的一部分,以表示系统的外部可观察的被用作分析模型的一部分,以表示系统的外部可观察的行为和更多的分析类个体的局部行为。在构件级设计过行为和更多的分析类个体的局部行为。在构件级设计过程中,有些时候对设计类的行为进行建模是必要的。程中,有些时候对设计类的行为进行建模是必要的。v对象对象(程序执行时的设计类实例程序执行时的设计类实例)的动态行为受到外部事的动态行为受到外部事件和对象当前状态件

44、和对象当前状态(行为方式行为方式)的影响。为了理解对象的的影响。为了理解对象的动态行为,设计者必须检查设计类生命周期中所有相关动态行为,设计者必须检查设计类生命周期中所有相关的用例,这些用例提供的信息可以帮助设计者描绘影响的用例,这些用例提供的信息可以帮助设计者描绘影响对象的事件,以及随着时间流逝和事件的发生对象所处对象的事件,以及随着时间流逝和事件的发生对象所处的状态。图的状态。图10-9描述了使用描述了使用UML状态图表示的状态之状态图表示的状态之间的转换。间的转换。实施构件级设计图10-9 PrintJob类的状态图实施构件级设计v从一种状态到另一种状态的转换,都表示为如下形式的事件从一

45、种状态到另一种状态的转换,都表示为如下形式的事件序列:序列:event-name(parameter-list)guard-conditon/action expressionv其中其中event-name表示事件;表示事件;parameter-list包含了与事件包含了与事件相关的数据;相关的数据;guard-condition采用对象约束语言书写,并采用对象约束语言书写,并描述了一个在事件发生前必须满足的条件,描述了一个在事件发生前必须满足的条件,action expression定义了一个状态转换时发生的动作。定义了一个状态转换时发生的动作。v针对状态的进入和离开两种情形,每个状态都可以

46、定义针对状态的进入和离开两种情形,每个状态都可以定义entry/和和exit/两个动作。多数情况下,这些动作与正在建模两个动作。多数情况下,这些动作与正在建模的类的相关操作相对应。的类的相关操作相对应。do/指示符提供了一种机制,用来指示符提供了一种机制,用来显示伴随此种状态的相关活动;而显示伴随此种状态的相关活动;而include/指示符则提供了指示符则提供了通过在状态定义中嵌入更多状态图细节的方式细化的手段。通过在状态定义中嵌入更多状态图细节的方式细化的手段。实施构件级设计v行为模型经常包含一些在其他设计模型中不明行为模型经常包含一些在其他设计模型中不明显的信息。例如,通过仔细查看图显的信

47、息。例如,通过仔细查看图10-9中的状中的状态图可以知道,当得出印刷任务的价钱和进度态图可以知道,当得出印刷任务的价钱和进度数据时,数据时,PrintJob类的动态行为取决于用户对类的动态行为取决于用户对此是否认可。如果没有同意,印刷工作就不能此是否认可。如果没有同意,印刷工作就不能提交,因为不可能到达提交,因为不可能到达submittingJob状态。状态。实施构件级设计v步骤步骤6:细化部署图以提供额外的实现细节。细化部署图以提供额外的实现细节。部部署图用作体系结构设计的一部分,并且部署图署图用作体系结构设计的一部分,并且部署图采用描述符形式来表示。在这种表示形式中,采用描述符形式来表示。

48、在这种表示形式中,主要的系统功能都表示在容纳这些功能的计算主要的系统功能都表示在容纳这些功能的计算环境中。环境中。v在构件级设计过程中,部署图应该被细化以表在构件级设计过程中,部署图应该被细化以表示主要构件包的位置。然而,构件一般在构件示主要构件包的位置。然而,构件一般在构件图中不被单独表示,目的在于避免图的复杂性。图中不被单独表示,目的在于避免图的复杂性。某些情况下,部署图在这个时候被细化成实例某些情况下,部署图在这个时候被细化成实例形式。这意味着指定的硬件和要使用的操作系形式。这意味着指定的硬件和要使用的操作系统环境应加以说明,而构件包在这个环境中的统环境应加以说明,而构件包在这个环境中的

49、位置等也需要指出。位置等也需要指出。实施构件级设计v步骤步骤7:考虑每一个构件级设计表示,并且时刻考虑每一个构件级设计表示,并且时刻考虑其他选择。考虑其他选择。设计是一个迭代过程。创建的设计是一个迭代过程。创建的第一个构件级模型总没有迭代第一个构件级模型总没有迭代N次之后得到的模次之后得到的模型那么全面、一致或精确。在进行设计工作时,型那么全面、一致或精确。在进行设计工作时,重构是十分必要的。重构是十分必要的。v设计中经常存在其他的设计方案,在没有决定设计中经常存在其他的设计方案,在没有决定最终设计模型之前,最好的设计师会考虑所有最终设计模型之前,最好的设计师会考虑所有(或大部分或大部分)的方

50、案,并且仔细考虑和分析这些方的方案,并且仔细考虑和分析这些方案。案。对象约束语言v作为作为UML一部分的各种图为设计得提供一部分的各种图为设计得提供了丰富的设计模型表示形式。然而,图形了丰富的设计模型表示形式。然而,图形表示往往是不够的,设计者还需要一种机表示往往是不够的,设计者还需要一种机制,以明确和规范地表示那些可以约束设制,以明确和规范地表示那些可以约束设计模型元素的信息。计模型元素的信息。v对象约束语言对象约束语言OCL通过允许软件工程师使通过允许软件工程师使用用形式化的语法和文法形式化的语法和文法构建各种设计模型构建各种设计模型元素元素(如类和对象、事件、消息、接口如类和对象、事件、

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(软件工程讲义-第10章-构件级设计建模要点课件.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|