软件工程讲义-第10章-构件级设计建模要点课件.ppt
-
资源ID:69541058
资源大小:1.48MB
全文页数:72页
- 资源格式: PPT
下载积分:20金币
快捷下载
会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
软件工程讲义-第10章-构件级设计建模要点课件.ppt
现代软件工程第10章 构件级设计建模主要内容v什么是构件什么是构件v设计基于基于类的构件的构件v实施构件施构件级设计v对象象约束束语言言v设计传统构件构件v小小结构件级设计建模v一套完整的一套完整的软件构件是在体系件构件是在体系结构构设计过程中定程中定义的。但是没有在接近代的。但是没有在接近代码的抽的抽象象级上表示内部数据上表示内部数据结构和每个构件的构和每个构件的处理理细节。构件。构件级设计定定义了数据了数据结构、算构、算法、接口特征和分配法、接口特征和分配给每个每个软件构件的通件构件的通信机制。信机制。构件级设计建模v必必须能能够在建造在建造软件之前就确定件之前就确定该软件件是否可以工作。是否可以工作。为了保了保证设计的正确性,的正确性,以及与早期以及与早期设计表示(即数据、体系表示(即数据、体系结构构和接口和接口设计)的一致性,构件)的一致性,构件级设计需要需要以一种可以以一种可以评审设计细节的方式来表示的方式来表示软件。它提供了一种件。它提供了一种评估数据估数据结构、接口和构、接口和算法是否能算法是否能够工作的方法。工作的方法。构件级设计建模v 数据、体系数据、体系结构和接口的构和接口的设计表示构成表示构成了构件了构件级设计的基的基础。每个构件的。每个构件的类定定义或者或者处理叙述都理叙述都转化化为一种一种详细设计,该设计采用采用图形或基于文本的形式来形或基于文本的形式来详细说明内部的数据明内部的数据结构、局部接口构、局部接口细节和和处理理逻辑。设计符号包括符号包括UML图和一些和一些辅助表助表示。通示。通过使用一系列使用一系列结构化构化编程程结构来构来说明程序的明程序的设计。构件级设计建模v每个每个软件的件的设计都以都以图形的、形的、图表的或表的或基于文本的方式表示,基于文本的方式表示,这是构件是构件级设计阶段段产生的主要工作生的主要工作产品。品。v采用采用设计走走查或或审查机制。机制。对设计执行行检查以确定数据以确定数据结构、接口、构、接口、处理理顺序和序和逻辑条件等是否都正确,并且条件等是否都正确,并且给出早期出早期设计中与构件相关的数据或控制中与构件相关的数据或控制变换。构件级设计建模v体系体系结构构设计第一次迭代完成之后,就第一次迭代完成之后,就应该开始构件开始构件级设计。在。在这个个阶段,全部段,全部的数据和的数据和软件的程序件的程序结构都已构都已经建立起来,建立起来,其目的是把其目的是把设计模型模型转化化为运行运行软件。但件。但是是现有有设计模型的抽象模型的抽象层次相次相对较高,而高,而可运行程序的抽象可运行程序的抽象层次相次相对较低。低。这种种转化具有挑化具有挑战性,因性,因为可能会在可能会在软件件过程后程后期期阶段引入段引入难于于发现和改正的微小和改正的微小错误。构件级设计建模v用用编程程语言表示构件言表示构件级设计是可以的。是可以的。其其实,程序的,程序的创建是以体系建是以体系结构构设计模型模型作作为指南的。一种可供考指南的。一种可供考虑的方法是使用的方法是使用某些能某些能够容易容易转化化为代代码的中的中间表示来表表示来表示构件示构件级设计。无。无论采用何种机制来表示采用何种机制来表示构件构件级设计,定,定义的数据的数据结构、接口和算构、接口和算法法应该遵守各种已遵守各种已经精心精心规定好的定好的设计指指导准准则,以避免在,以避免在过程程设计演化中犯演化中犯错误。什么是构件v通常来通常来讲,构件是,构件是计算机算机软件中的一个件中的一个模模块化的构造化的构造块。OMG UML规范将构件范将构件定定义为“系系统中某一定型化的、可配置的中某一定型化的、可配置的和可替和可替换的部件,的部件,该部件封装了部件封装了实现并暴并暴露一系列接口露一系列接口”。v构件存在于构件存在于软件体系件体系结构中,因而构件构中,因而构件在完成所建系在完成所建系统的需求和目的需求和目标中起重要作中起重要作用。由于构件用。由于构件驻留于留于软件体系件体系结构的内部,构的内部,它它们必必须与其他的构件和存在于与其他的构件和存在于软件件边界界以外的以外的实体体进行通信和合作。行通信和合作。面向对象的观点v在面向在面向对象象软件工程件工程环境中,构件包括一境中,构件包括一个个协作作类集合。构件中的每一个集合。构件中的每一个类都被都被详细阐述,包括所有的属性和与其述,包括所有的属性和与其实现相关的操相关的操作。作作。作为细节设计的一部分,所有与其他的一部分,所有与其他设计类相互通信相互通信协作的接口必作的接口必须予以定予以定义。为了完成了完成这些,些,设计师从分析模型开始,从分析模型开始,详细描述分析描述分析类和基和基础类。面向对象的观点v考考虑为一个高一个高级印刷印刷车间构建构建软件。件。软件的目的是件的目的是为了收集前台的客了收集前台的客户需求,需求,对印刷印刷业务进行定价,然后把印刷任行定价,然后把印刷任务交交给自自动生生产设备。在需求工程中得到了一个。在需求工程中得到了一个被称被称为PrintJob的分析的分析类,如,如图10-1所所示。示。PrintJob有两个接口:有两个接口:computeJob具有具有对任任务进行定价的功能,行定价的功能,initiateJob能能够把任把任务传给生生产设备。面向对象的观点图10-1设计构件的细化面向对象的观点v构件构件级设计将由此开始。必将由此开始。必须对PrintJob构件构件的的细节进行行细化,以提供指化,以提供指导实现的充分信息。的充分信息。通通过不断不断补充作充作为构件构件PrintJob的的类的全部属的全部属性和操作,来逐步性和操作,来逐步细化最初的分析化最初的分析类。v定定义为体系体系结构构设计组成部分的每一个构件都成部分的每一个构件都要要实施施细化。化。细化一旦完成,要化一旦完成,要对每一个属性、每一个属性、每一个操作和每一个接口每一个操作和每一个接口进行更行更进一步的一步的细化。化。适合每个属性的数据适合每个属性的数据结构必构必须予以予以详细说明。另明。另外外还要要说明明实现与操作相关的与操作相关的处理理逻辑的算法的算法细节。最后是。最后是实现接口所需机制的接口所需机制的设计。对于面向于面向对象象软件,件,还包含包含对实现系系统内部内部对象象间消息通消息通信机制的描述。信机制的描述。传统观点v在在传统软件工程件工程环境中,一个构件就是程序的境中,一个构件就是程序的一个功能要素,程序由一个功能要素,程序由处理理逻辑及及实现处理理逻辑所需的内部数据所需的内部数据结构以及能构以及能够保保证构件被构件被调用和用和实现数据数据传递的接口构成。的接口构成。传统构件也被称构件也被称为模模块,作,作为软件体系件体系结构的一部分,它承担如下三构的一部分,它承担如下三个重要角色之一:个重要角色之一:(1)控制构件,控制构件,协调问题域中域中所有其他构件的所有其他构件的调用用;(2)问题域构件,完成部分域构件,完成部分或全部用或全部用户的需求的需求;(3)基基础设施构件,施构件,负责完成完成问题域中所需相关域中所需相关处理的功能。理的功能。传统观点v与面向与面向对象的构件相象的构件相类似,似,传统的的软件构件也件构件也来自于分析模型。不同的是在来自于分析模型。不同的是在该种情况下,是以种情况下,是以分析模型中的数据流要素作分析模型中的数据流要素作为导出构件的基出构件的基础。数据流数据流图最低最低层的每个的每个变换都被映射都被映射为某一某一层次次上的模上的模块。一般来。一般来讲,控制构件位于,控制构件位于层次次结构构顶层附近,而附近,而问题域构件域构件则倾向位于向位于层次次结构的底构的底层。为了了获得有效的模得有效的模块化,在构件化,在构件细化化过程中程中采用了功能独立性的采用了功能独立性的设计概念。概念。传统观点再来考再来考虑为一个高一个高级影印中心构建影印中心构建软件。件。在分析模型建立在分析模型建立过程中程中导出一出一组数据流数据流图。假假设这些数据流些数据流图已已经被映射到被映射到图10-2中中所所显示的体系示的体系结构中。构中。图中每个方框都表中每个方框都表示一个示一个软件构件。件构件。传统观点图10-2 一个传统系统的结构图传统观点v考考虑ComputePageCost模模块。该模模块的目的在的目的在于根据用于根据用户提供的提供的规格格说明来明来计算每算每页的印刷的印刷费用。用。为了了实现该功能需要以下数据:文档的功能需要以下数据:文档的页数,文档数,文档的印刷份数,的印刷份数,单面或者双面印刷,面或者双面印刷,颜色,色,纸张大小。大小。这些数据通些数据通过该模模块的接口的接口传递给ComputePageCost。ComputePageCost根据任根据任务量和复量和复杂度,使用度,使用这些数据来决定一些数据来决定一页的的费用用这是一个通是一个通过接口将所有数据接口将所有数据传递给模模块的功能。的功能。每一每一页的的费用与任用与任务的大小成反比,与任的大小成反比,与任务的复的复杂度成正比。度成正比。传统观点v图10-3给出了使用出了使用UML建模符号描述的构件建模符号描述的构件级设计。其中。其中ComputePageCost模模块通通过调用用getJobData模模块和数据和数据库接口接口accessCostDB来来访问数据。接着,数据。接着,对ComputePageCost模模块进一步一步细化,化,给出算出算法和接口的法和接口的细节描述。其中算法的描述。其中算法的细节可以由可以由图中中显示的示的伪代代码或者或者UML活活动图来表示。接口来表示。接口被表示被表示为一一组输入和入和输出的数据出的数据对象或者数据象或者数据项的集合。的集合。设计细化的化的过程需要一直程需要一直进行到行到获得构得构件的件的导向向结构构为止。止。传统观点图10-3 ComputePageCost的构件级设计过程相关的观点v上面提及的关于构件上面提及的关于构件级设计的面向的面向对象象观点和点和传统观点,都假定从点,都假定从头开始开始设计构件。即构件。即设计者必者必须根据从分析模型中根据从分析模型中导出的出的规格格说明明创建新构件。当建新构件。当然,然,还存在另外一种方法。存在另外一种方法。v在在过去的去的10年年间,软件工程已件工程已经开始开始强调使用已使用已有构件来构造系有构件来构造系统的必要性。的必要性。实际上,上,软件工程件工程师在在设计过程中可以使用已程中可以使用已经过验证的的设计或代或代码构构件的目件的目录。当。当软件体系件体系结构构设计完后,就可以从目完后,就可以从目录中中选出构件或者出构件或者设计模式,并用于模式,并用于组装体系装体系结构。构。由于由于这些构件是根据复用思想来些构件是根据复用思想来创建的,所以其接建的,所以其接口的完整描述、要口的完整描述、要实现的功能和需要的通信与的功能和需要的通信与协作作等等对于于设计者来者来说都是可以得到的。都是可以得到的。设计基于类的构件v构件构件级设计利用了分析模型开利用了分析模型开发的信息的信息和体系和体系结构模型表示的信息。当构模型表示的信息。当选择了面了面向向对象象软件工程方法后,构件件工程方法后,构件级设计主要主要关注分析关注分析类的的细化和基化和基础类的定的定义和精化。和精化。这些些类的属性、操作和接口的的属性、操作和接口的详细描述是描述是开始构建活开始构建活动之前所需的之前所需的设计细节。基本设计原则v有四种适用于构件有四种适用于构件级设计的基本的基本设计原原则,这些原些原则在使用面向在使用面向对象象软件工程方法件工程方法时被广泛采被广泛采用。使用用。使用这些原些原则的根本的根本动机在于,使得机在于,使得产生的生的设计在在发生生变更更时能能够适适应变更并且减少副作用更并且减少副作用的的传播。播。v开关原开关原则(OCP):模:模块应该对外延具有开放性,外延具有开放性,对修改具有封修改具有封闭性。性。简单地地说,设计者者应该采用采用一种无需一种无需对构件自身内部做修改就可以构件自身内部做修改就可以进行行扩展展的方式来的方式来说明构件。明构件。SAFEHOME实例500SAFEHOME实例51图10-4 遵循OCP原则基本设计原则vLiskov替替换原原则(LSP):“子子类可以替可以替换它它们的基的基类”。最早提出。最早提出该原原则的的LIS88建建议,将子,将子类传递给构件来代替构件来代替基基类时,使用基,使用基类的构件的构件应该仍然能仍然能够正正确完成其功能。确完成其功能。LSP原原则要求源自基要求源自基类的的任何子任何子类必必须遵守基遵守基类与使用与使用该基基类的构的构件之件之间的的隐含含约定。定。基本设计原则v依依赖倒置原倒置原则(DIP):“依依赖于抽象,而非具于抽象,而非具体体实现”。抽象可以比。抽象可以比较容易地容易地对设计进行行扩展,展,又不会又不会导致大的混乱。构件依致大的混乱。构件依赖的具体构件越多,的具体构件越多,其其扩展起来就越困展起来就越困难。v接口分离原接口分离原则(ISP):“多个用多个用户专用接口比用接口比一个通用接口要好一个通用接口要好”。多个客。多个客户构件使用一个服构件使用一个服务器器类提供的操作的提供的操作的实例很多。例很多。ISP原原则建建议设计者者应该为每一个主要的客每一个主要的客户类型都型都设计一个特一个特定的接口。只有那些与特定客定的接口。只有那些与特定客户类型相关的操作,型相关的操作,才才应该出出现在在该客客户的接口的接口说明中。如果多个客明中。如果多个客户要求相同的操作,要求相同的操作,则这些操作些操作应该在每一个特在每一个特定的接口中都加以定的接口中都加以说明。明。基本设计原则v发布复用等价性原布复用等价性原则:”复用的粒度就是复用的粒度就是发布的粒度布的粒度”。当。当类或构件被或构件被设计用以复用以复用用时,在可复用,在可复用实体的开体的开发者和使用者之者和使用者之间就建立了一种就建立了一种隐含的含的约定关系。开定关系。开发者者承承诺建立一个建立一个发布控制系布控制系统,用来支持和,用来支持和维护实体的各种老版本,同体的各种老版本,同时用用户缓慢地慢地将其升将其升级到最新版本。明智的方法是将可到最新版本。明智的方法是将可复用的复用的类分分组打包成能打包成能够管理和控制的包管理和控制的包作作为一个更新的版本,而不是一个更新的版本,而不是对每个每个类分分别进行升行升级。基本设计原则v共同封装原共同封装原则:”一同一同变更的更的类应该合在合在一起一起”。类应该根据其内聚性根据其内聚性进行打包。行打包。即当即当类被打包成被打包成设计的一部分的一部分时,它,它们应该处理相同的功能或者行理相同的功能或者行为域。当域的一域。当域的一些特征必些特征必须变更更时,只有那些包中的,只有那些包中的类才才有可能需要修改。有可能需要修改。这样可以可以进行更加有效行更加有效的的变更控制和更控制和发布管理。布管理。基本设计原则v共同复用原共同复用原则:”不能一起复用的不能一起复用的类不能不能被分到一被分到一组”。当包中的一个或者多个。当包中的一个或者多个类变更更时,包的,包的发布版本数量也会布版本数量也会发生。所生。所有那些依有那些依赖于已于已经发生生变更的包的更的包的类或者或者包,都必包,都必须升升级到最新的版本,并且都需到最新的版本,并且都需要要进行行测试以保以保证新新发布的版本能布的版本能够无故无故障运障运转。如果。如果类没有根据内聚性没有根据内聚性进行分行分组,那么那么这个包中与其他个包中与其他类无关无关联的的类有可能有可能会会发生生变更,而更,而这往往会往往会导致致进行没有必行没有必要的集成和要的集成和测试。因此,只有那些一起被。因此,只有那些一起被复用的复用的类才才应该包含在一个包中。包含在一个包中。构件级设计指导方针v构件构件。对那些已那些已经被确定被确定为体系体系结构模型一部构模型一部分的构件分的构件应该建立命名建立命名约定,并定,并对其做其做进一步的一步的细化和精化,使其成化和精化,使其成为构件构件级模型的一部分。体模型的一部分。体系系结构构件的名字来源于构构件的名字来源于问题域,并且域,并且应该能能够被被查看体系看体系结构模型的所有共利益者理解。构模型的所有共利益者理解。v在在详细设计层面使用构造型帮助面使用构造型帮助识别构件的特构件的特性也很有价性也很有价值。构件级设计指导方针v接口接口。接口提供关于通信和。接口提供关于通信和协作的重要信息。作的重要信息。然而接口表示的随意性会使构件然而接口表示的随意性会使构件图趋于复于复杂化。化。AMB02建建议:(1)当构件当构件图变得复得复杂时,在,在较正式的正式的UML框和虚箭框和虚箭头记号方法中使用接口的棒号方法中使用接口的棒棒糖式棒糖式记号;号;(2)为了保持一致,接口都放在构了保持一致,接口都放在构件框的左件框的左边;(3)即使其他的接口也适用,也只即使其他的接口也适用,也只表示出那些与构件相关的接口。表示出那些与构件相关的接口。v依依赖与与继承承。为了提高可了提高可读性,依性,依赖关系是自关系是自左向右,左向右,继承关系是自下而上。另外,构件之承关系是自下而上。另外,构件之间的依的依赖关系通关系通过接口来表示,而不是采用接口来表示,而不是采用“构件构件到构件到构件”的方法来表示。遵照的方法来表示。遵照OCP的思想,的思想,这种种方法使得系方法使得系统更易于更易于维护。内聚性v内聚性意味着构件或者内聚性意味着构件或者类只封装那些相只封装那些相互关互关联密切,以及与构件或密切,以及与构件或类自身有密切自身有密切关系的属性和操作。关系的属性和操作。LET01定定义了了许多多不同不同类型的内聚性。型的内聚性。内聚性v功能内聚功能内聚v分分层内聚内聚v通信内聚通信内聚v顺序内聚序内聚v过程内聚程内聚v暂时内聚内聚v实用内聚用内聚耦合性v耦合性是耦合性是类之之间彼此彼此联系程度的一种定系程度的一种定性度量。随着性度量。随着类相互依相互依赖越来越多。越来越多。类之之间的耦合程度亦会增加。在构件的耦合程度亦会增加。在构件级设计中,中,一个重要的目一个重要的目标就是尽可能保持低耦合。就是尽可能保持低耦合。vLET01定定义了如下耦合分了如下耦合分类:耦合性v内容耦合内容耦合v共用耦合共用耦合v控制耦合控制耦合v印印记耦合耦合v数据耦合数据耦合v例程例程调用耦合用耦合v类型使用耦合型使用耦合v包含或者包含或者导入耦合入耦合v外部耦合外部耦合实施构件级设计v构件构件级设计本本质上是上是细化的。化的。设计者必者必须将分析模型和架构模型中的信息将分析模型和架构模型中的信息转化化为一种一种设计表示,表示,这种表示提供了用来指种表示提供了用来指导构建活构建活动的充分信息。的充分信息。实施构件级设计v步步骤1:标识出所有与出所有与问题域相域相对应的的类。使用分析模型和架构模型,每个分析使用分析模型和架构模型,每个分析类和和体系体系结构构件都要构构件都要细化。化。v步步骤2:确定所有与基确定所有与基础设施域相施域相对应的的设计类。在分析模型中并没有描述在分析模型中并没有描述这些些类,并且在体系并且在体系结构构设计中也中也经常忽略常忽略这些些类,但是此但是此时必必须对它它们进行描述。行描述。这种种类型型的的类和构件包括和构件包括GUI构件、操作系构件、操作系统构件、构件、对象和数据管理构件等。象和数据管理构件等。实施构件级设计v步步骤3:细化所有不能作化所有不能作为复用构件的复用构件的设计类。详细描述描述实现类需要的所有接口、属性需要的所有接口、属性和操作。在和操作。在实现这个任个任务时,必,必须考考虑采用采用设计试探法。探法。v步步骤3a:在在类或构件的或构件的协作作时说明消息的明消息的细节。分析模型中用分析模型中用协作作图来来显示分析示分析类之之间的相互的相互协作。在构件作。在构件级设计过程中,某些情程中,某些情况下通况下通过对系系统中中对象象间传递消息的消息的结构构进行行说明,来表明,来表现协作作细节是必要的。是必要的。这可作可作为接口接口规格格说明的前提,明的前提,这些接口些接口显示了系示了系统中构件通信和中构件通信和协作的方式。作的方式。实施构件级设计v图10-6给出了前述印刷系出了前述印刷系统的一个的一个简单协作作图。ProductionJob、WorkOrder和和JobQueue三个三个对象相互象相互协作作为生生产线准准备印刷作印刷作业。图中的箭中的箭头表示表示对象象间传递的消息。的消息。v随着随着设计的的进行,消息通行,消息通过下列方式的下列方式的扩展展语法来法来细化:化:guard condition sequence expression(return value):=message name(argument list)实施构件级设计图10-6 带消息的协作图实施构件级设计vguard condition采用采用对象象约束束语言言OCL来来书写,并且写,并且说明了在消息明了在消息发出之前出之前应该满足什么足什么样的条件集合;的条件集合;vSequence expression是一个表明消息是一个表明消息发送送序号的整数或其他序号的整数或其他样式的表明式的表明发送送顺序的指示符;序的指示符;v(return value)是由消息是由消息唤醒操作返回的信息醒操作返回的信息名;名;vmessage name表示表示唤醒的操作,醒的操作,(argument list)是是传递给操作的属性列表。操作的属性列表。实施构件级设计v步步骤3b:为每一个构件确定适当的接口每一个构件确定适当的接口。在构件在构件级设计中,一个中,一个UML接口是接口是“一一组外部可外部可见的(即公共的)操作。接口不包的(即公共的)操作。接口不包括内部括内部结构,没有属性,没有关构,没有属性,没有关联。接口是某个抽象接口是某个抽象类的等价物,的等价物,该抽象抽象类提提供了供了设计类之之间的可控的可控连接。接。实际上,上,为设计类定定义的操作可以的操作可以归结为一个或者更一个或者更多的抽象多的抽象类。抽象。抽象类内的每个操作内的每个操作应该是是内聚的,即它内聚的,即它应该展示那些关注于一个有展示那些关注于一个有限功能或者子功能的限功能或者子功能的处理。理。实施构件级设计v参照参照图10-1,由于,由于initiateJob接口没有展接口没有展现出足出足够的的内聚性而受到争内聚性而受到争议。实际上,它完成三个不同的子功能:上,它完成三个不同的子功能:建立工作建立工作单,检查任任务的的优先先级,并将任,并将任务传递给生生产线。接口。接口设计应该重构。一种方法是重新重构。一种方法是重新检查设计类并并定定义一个新一个新类WorkOrder,该类用来用来处理与装配工作理与装配工作单相关的所有活相关的所有活动。buildWorkOrder()操作操作成成为该类的的一部分。另外可能要定一部分。另外可能要定义一个一个合并了操作合并了操作checkPriority()的的JobQueue类。ProductionJob类包括包括传递给生生产线的生的生产任任务的所有相关信息。的所有相关信息。initiateJob接口将采用接口将采用图10-7所示的形式。所示的形式。initiateJob现在是内聚的在是内聚的,集中,集中在一个功能上。与在一个功能上。与ProductionJob、WorkOrder和和JobQueue相关的接口都是近乎相关的接口都是近乎专诚的。的。实施构件级设计图10-7 为PrintJob重构接口和类定义实施构件级设计v步步骤3c:细化属性并且定化属性并且定义相相应的数据的数据类型和数据型和数据结构构。UML采用下面的采用下面的语法来定法来定义属性的数据属性的数据类型:型:name:type-expression=initial-valueproperty string其中其中name是属性名,是属性名,type expression是数据是数据类型;型;initial-value是是创建建对象象时属性的初始属性的初始值;property string用于定用于定义属性的特征或特性。属性的特征或特性。实施构件级设计v在构件在构件级设计的第一的第一轮迭代中,属性通迭代中,属性通常用名字来描述。随着常用名字来描述。随着设计的的进一步一步细化,化,使用使用UML的属性格式注的属性格式注释来定来定义每一个属每一个属性。如可以下列方式来定性。如可以下列方式来定义paperType-weight:paperType-weight:string=“A”contains 1 of 4 values A,B,C or Dv如果某一属性在多个如果某一属性在多个设计类中重复出中重复出现,并且其自身具有比并且其自身具有比较复复杂的的结构,最好是构,最好是为这个属性个属性创建一个建一个单独的独的类。实施构件级设计v步步骤3d:详细描述每个操作中的描述每个操作中的处理流。理流。可以可以用流程用流程图、伪代代码或者或者UML活活动图来完成。每来完成。每个个软件构件都需要件构件都需要应用逐步求精概念通用逐步求精概念通过大量的大量的迭代迭代进行行细化。化。v第一第一轮迭代中,将每个操作都定迭代中,将每个操作都定义为设计类的的一部分。任何情况下,操作一部分。任何情况下,操作应该采用确保高内聚采用确保高内聚性的方式来刻画;即,一个操作性的方式来刻画;即,一个操作应该完成完成单一的一的目目标功能或者子功能。接下来的一功能或者子功能。接下来的一轮迭代,只是迭代,只是完成完成对操作名的操作名的详细扩展。如展。如对图10-1中的操中的操作作computePaperCost()可以采用如下方式可以采用如下方式进行行扩展展:computePaperCost(weight,size,color):numeric实施构件级设计v如果如果实现computePaperCost()的算法的算法简单而且易于理解,而且易于理解,则没有必要开展没有必要开展进一步的一步的设计细化。化。软件件编码人人员将会提供将会提供实现这些操作的必要些操作的必要细节。如果算法比。如果算法比较复复杂或者或者难于理解,于理解,则需要需要进行行设计细化。化。图10-8给出了操作出了操作computePaperCost()的一个的一个UML活活动图。当活。当活动图用于构件用于构件级设计的的规格格说明明时,通常都在比源,通常都在比源码更高的抽象更高的抽象级上上表示。另外,表示。另外,还可以在可以在设计规格格说明中使用明中使用伪代代码。实施构件级设计图10-8 computePaperCost()操作的UML活动图实施构件级设计v步步骤4:说明持久数据源明持久数据源(数据数据库和文件和文件)并确定并确定管理数据源所需要的管理数据源所需要的类。数据数据库和文件通常都凌和文件通常都凌架于架于单独的构件独的构件设计描述之上。在多数情况下,描述之上。在多数情况下,这些持久数据存些持久数据存储起初都被指定起初都被指定为体系体系结构构设计的一部分,然而,随着的一部分,然而,随着设计细化化过程的不断深入,程的不断深入,提供关于提供关于这些持久数据源的些持久数据源的结构和构和组织等等额外外细节常常是有用的。常常是有用的。实施构件级设计v步步骤5:开开发并且并且细化化类或构件的行或构件的行为表示。表示。UML状状态图被用作分析模型的一部分,以表示系被用作分析模型的一部分,以表示系统的外部可的外部可观察察的行的行为和更多的分析和更多的分析类个体的局部行个体的局部行为。在构件。在构件级设计过程中,有些程中,有些时候候对设计类的行的行为进行建模是必要的。行建模是必要的。v对象象(程序程序执行行时的的设计类实例例)的的动态行行为受到外部事受到外部事件和件和对象当前状象当前状态(行行为方式方式)的影响。的影响。为了理解了理解对象的象的动态行行为,设计者必者必须检查设计类生命周期中所有相关生命周期中所有相关的用例,的用例,这些用例提供的信息可以帮助些用例提供的信息可以帮助设计者描者描绘影响影响对象的事件,以及随着象的事件,以及随着时间流逝和事件的流逝和事件的发生生对象所象所处的状的状态。图10-9描述了使用描述了使用UML状状态图表示的状表示的状态之之间的的转换。实施构件级设计图10-9 PrintJob类的状态图实施构件级设计v从一种状从一种状态到另一种状到另一种状态的的转换,都表示,都表示为如下形式的事件如下形式的事件序列:序列:event-name(parameter-list)guard-conditon/action expressionv其中其中event-name表示事件;表示事件;parameter-list包含了与事包含了与事件相关的数据;件相关的数据;guard-condition采用采用对象象约束束语言言书写,写,并描述了一个在事件并描述了一个在事件发生前必生前必须满足的条件,足的条件,action expression定定义了一个状了一个状态转换时发生的生的动作。作。v针对状状态的的进入和离开两种情形,每个状入和离开两种情形,每个状态都可以定都可以定义entry/和和exit/两个两个动作。多数情况下,作。多数情况下,这些些动作与正在建模作与正在建模的的类的相关操作相的相关操作相对应。do/指示符提供了一种机制,用来指示符提供了一种机制,用来显示伴随此种状示伴随此种状态的相关活的相关活动;而;而include/指示符指示符则提供了通提供了通过在状在状态定定义中嵌入更多状中嵌入更多状态图细节的方式的方式细化的手段。化的手段。实施构件级设计v行行为模型模型经常包含一些在其他常包含一些在其他设计模型中不明模型中不明显的信息。例如,通的信息。例如,通过仔仔细查看看图10-9中的状中的状态图可以知道,当得出印刷任可以知道,当得出印刷任务的价的价钱和和进度数度数据据时,PrintJob类的的动态行行为取决于用取决于用户对此此是否是否认可。如果没有同意,印刷工作就不能提交,可。如果没有同意,印刷工作就不能提交,因因为不可能到达不可能到达submittingJob状状态。实施构件级设计v步步骤6:细化部署化部署图以提供以提供额外的外的实现细节。部部署署图用作体系用作体系结构构设计的一部分,并且部署的一部分,并且部署图采采用描述符形式来表示。在用描述符形式来表示。在这种表示形式中,主要种表示形式中,主要的系的系统功能都表示在容功能都表示在容纳这些功能的些功能的计算算环境中。境中。v在构件在构件级设计过程中,部署程中,部署图应该被被细化以表化以表示主要构件包的位置。然而,构件一般在构件示主要构件包的位置。然而,构件一般在构件图中不被中不被单独表示,目的在于避免独表示,目的在于避免图的复的复杂性。某性。某些情况下,部署些情况下,部署图在在这个个时候被候被细化成化成实例形式。例形式。这意味着指定的硬件和要使用的操作系意味着指定的硬件和要使用的操作系统环境境应加以加以说明,而构件包在明,而构件包在这个个环境中的位置等也需境中的位置等也需要指出。要指出。实施构件级设计v步步骤7:考考虑每一个构件每一个构件级设计表示,并且表示,并且时刻刻考考虑其他其他选择。设计是一个迭代是一个迭代过程。程。创建的第建的第一个构件一个构件级模型模型总没有迭代没有迭代N次之后得到的模型次之后得到的模型那么全面、一致或精确。在那么全面、一致或精确。在进行行设计工作工作时,重,重构是十分必要的。构是十分必要的。v设计中中经常存在其他的常存在其他的设计方案,在没有决定方案,在没有决定最最终设计模型之前,最好的模型之前,最好的设计师会考会考虑所有所有(或大部分或大部分)的方案,并且仔的方案,并且仔细考考虑和分析和分析这些方些方案。案。对象约束语言v作作为UML一部分的各种一部分的各种图为设计得提供得提供了丰富的了丰富的设计模型表示形式。然而,模型表示形式。然而,图形形表示往往是不表示往往是不够的,的,设计者者还需要一种机需要一种机制,以明确和制,以明确和规范地表示那些可以范地表示那些可以约束束设计模型元素的信息。模型元素的信息。v对象象约束束语言言OCL通通过允允许软件工程件工程师使用使用形式化的形式化的语法和文法法和文法构建各种构建各种设计模模型元素型元素(如如类和和对象、事件、消息、接口象、事件、消息、接口),利用,利用这些无歧些无歧义描述描述语句作句作为UML的的补充。充。对象约束语言v最最简单的的OCL语言言语句由四个部分句由四个部分组成:成:(1)语境境(context)定定义了哪些情况了哪些情况语句是句是正确的正确的;(2)特性特性(property)描述描述语境的一境的一些特征(如,如果些特征(如,如果语境是一个境是一个类,那么特,那么特性可能就是一个属性);性可能就是一个属性);(3)操作操作(operation)用来操用来操纵和限定一个特性和限定一个特性(如,如,算算术运算、集合运算等运算、集合运算等);(4)关关键字字(keyword)用于用于说明条件表达式。明条件表达式。对象约束语言v作作为OCL表达式的一个例子,假表达式的一个例子,假设在在PrintJob类的状的状态图中,在一个能中,在一个能够引起引起computingJobCost与与formingJob之之间状状态转换的的jobCostAccepted事件上有一个警戒条件。事件上有一个警戒条件。在在图中,警戒条件以自然中,警戒条件以自然语言的形式表达,并且言的形式表达,并且意味着只有当客意味着只有当客户有有权批准任批准任务的的报价价时这个授个授权才会才会发生。在生。在OCL中,可以采用如下方式来描中,可以采用如下方式来描述述这个表达式:个表达式:customer self.authorizationAuthority=yesCustomer类(实际是是类的一个特定的一个特定实例例)的一个的一个布布尔属性属性authorizationAuthority必必须被被设为yes,才,才满足警戒条件。足警戒条件。对象约束语言v在在创建建设计模型模型时,经常有一些常有一些实例在完成例在完成设计规定的定的动作之前必作之前必须满足它足它们的前置条件或后的前置条件或后置条件。置条件。OCL提供了一个提供了一个强有力的工具,以形式有力的工具,以形式化的方式化的方式说明前置和后置条件。例如,假明前置和后置条件。例如,假设印刷印刷车间系系统要要进行行扩展,在展,在说明其他印刷任明其他印刷任务特性特性的同的同时,客,客户提供了印刷任提供了印刷任务价格上限和交付的价格上限和交付的最后期限。如果印刷价格与交付最后期限。如果印刷价格与交付时间超超过其上限,其上限,任任务就不能被提交并且必就不能被提交并且必须通知客通知客户。在。在OCL中,中,可以采用如下方式来可以采用如下方式来说明一系列前置条件和后置明一系列前置条件和后置条件:条件:对象约束语言对象约束语言v该OCL语句定句定义一个不一个不变量量也就是必也就是必须在一些行在一些行为之前之前(pre)和之后和之后(post)存在存在的条件。开始的的条件。开始的时候,前置条件建立了一候,前置条件建立了一个由客个由客户指定的价格上限和交付期限,并指定的价格上限和交付期限,并且任且任务授授权必必须设置置为”no”。确定价格上。确定价格上限和交付期限之后,将限和交付期限之后,将应用后置条件。用后置条件。还需要注意的是,表达式需要注意的是,表达式self.jobAuthorization=yes并不是用来并不是用来设置置”yes”值,而是声明在操作,而是声明在操作结束束时必必须将将jobAuthorization设置置为”yes”。设计传统构件v传统软件构件的构件件构件的构件级设计基基础在在20世世纪60年年代已代已经形成,形成,Dijkstra等人提出,所有程序都可等人提出,所有程序都可以建立在一以建立在一组限定好的限定好的逻辑构造之上,构造之上,这一一组逻辑构造构造强调了了“对功能域的支持功能域的支持”,其中每一个,其中每一个逻辑结构有可构有可预测的的逻辑结构构(structure),从,从顶端端进入,从底端退出,入,从底端退出,读者可以很容易地理解者可以很容易地