UML软件工程组织

XDE中模式驱动的设计与开发(二)
刘武东yesky
  摘要:

  软件模式,特别是设计模式在现今的软件开发中越来越重要。在许多的标准,工具,以及开发方法中都引入了模式的概念。本文介绍了如何在UML中对软件模式进行建模,并结合具体的工具Rational XDE,对如何定义,如何应用模式作了详细地介绍,并指出了一些相关的问题。

  第二部分:XDE中的模式机制

  1 概述

  在前一期的系列文章中,我们对模式,特别是设计模式在UML中的建模方法作了简要地,理论上的介绍。现在该要进行实践了。现在支持模式建模并能够基于模式进行应用程序开发的工具并不是很多。Rational XDE是其中最为著名的一个,并且确实提供了极为优秀的功能。

  XDE的Java版有两种,一种是基于Eclipse内核的独立运行版本(目前只支持Eclipse1.0)。另为一个是集成在WASD中的,作为WASD的一个插件同其以其运行(目前只支持WASD 4.0)。实际上WASD使用的就是Eclipse的内核,所以,这两者在功能上(甚至外观上)都没有多大的区别。现在Rational已经被IBM所合并,所以有足够的理由可以相信,在未来的WSAD中,XDE的功能会被更加完美的整合到其中。

  XDE最大的卖点有两个,一个是分析设计同代码编写在是在同一个IDE中完成的,并可以进行正向-逆向工程,完美的实现迭代开发中所需要的模型-代码的映射。另外一个就是这篇文章的主题:模式的定义和应用。你不仅可以使用XDE中预定义好了的23个经典的GoF设计模式,还可以自己定义模式,在开发中应用它们,或者导出供其他人使用。

  模式机制是XDE中实现重用的核心技术。你可以通过这个机制来实现模型元素和其它制品的重用。它提供了Model-to-Model和Model-to-Code的变换功能。这使得你能够将一个涉及的模型作为来帮助一个特定的设计。它还是得你能够将一个模式中的元素内容合并到已存的设计模型中。
  2 XDE中的模式描述

  在XDE中,模式的描述基本上遵循了UML所定义的参数化协作标准。但是,由于UML中定义的只是如何来对模式建模,而对如何定义模式,应用模式,以及具体的代码生成并没有过多涉及。因而,XDE在UML的基础上,作了一些合理的扩展。

  首先,我们来看一看Asset的概念。一个Asset是一些软件制品的集合,它们被组织在一起以期能够解决某一个问题。Asset能够通过其定义的可变点(Variability Point)来进行扩展,在进行Asset重用的时候,开发者需要对这些可变点提供具体的内容来充实Asset,以完成Asset的重用。



  Rational现在推崇一种Asset Based Development过程方法,来作为其对RUP的一个补充,Asset就是其关键。这儿并不打算对Asset和Asset Based Development作过多地论述,那已经偏离了这篇文章的主题。从模式这个范畴而言,你可以简单的把Asset看作是模式的定义,描述及其具体的实现。

  在XDE中, Asset表示为一个构造型为<<Asset>>的包。被申明为<<Asset>>的包可以被导出以利于在不同的开发者,甚至不同的工具中重用,只要它们都遵循Asset的规范Reusable Asset Specification。

  模式是一种Asset,但是Asset并不一定是模式。一个模型可以被包装在一个Asset中,而其中并不带有任何的模式描述。XDE能够处理这两种可重用项目。在XDE中,模式表示为包含在一个<<Asset>>包中的,带有模板参数的合作图。有很多种方法可以创建一个<<Asset>>包,但需要注意的是,创建一个UML的包并手工地将其版型设置为<<Asset>>并不会将这个包注册为模式。

  在XDE中,<<Asset>>包可以被导出为一个.ras文件。一个.ras文件实际上就是一个zip文件,不过它有着自己的内容结构,这和J2EE中的.war文件很类似。它使用了rasset.xml和resource.xml这两个xml文件来提供对这个压缩文档的描述。RASAsset.xsd文件是RAS的XML Schema,定义rasset.xml和resource.xml这两个文档的内容格式和含义。其它的文件是模型和文档制品。

  在XDE中,模式由如下的一些部分组成:

   Asset

  在一个模式的底部是一个版型为<<Asset>>的包。模式中涉及到的所有内容都包含在这个包中,它也是用来导出符合RAS规范的可重用模式的逻辑单元(实际的物理封装单元可是一个包,也可以是一个模型)。模式也可以不存在于Asset包中,但是因为模式的创建目标,就是希望能够通过RAS规范来进行重用的,所以并不推荐使用这种方法。

   模板协作(Template Collaboration)

  在模式Asset中就是template collaboration,它是模式的核心。几乎模式所涉及的所有内容都定义在其中。模版参数的属性可以通过Pattern Explorer来查看。

   模板参数(Template Parameters)

  一个模板协作包含有一个或者多个模板参数,每一个定义一个特定的模式输入。例如,如果你想有一个名为MyClassInput的参数,你可以使用那个名字创建一个模板参数。

   类型元素(Type Element)

  每一个模板参数都有一个类型,通过其Type属性来定义。例如,如果模板参数的类型是class,那么这个模板参数就只接受类作为其参数值。这同在定义一个函数的参数时,需要指定其参数的类型(比如int)是一样的。

   基础上下文(Root Context)

  一个模式还有一个基础上下文,在创建模式时所引入的其它元素被组织在这个地方。这些元素通常都会被直接创建,需要很少或者根本不需要参数来创建它们。比如在一个模式中会被用到的一个支撑类。缺省情况下,基础上下文就是Asset包。你可以在Pattern Explorer中将其切换到其它的包中。

  实际上在模式所在的Asset包中,可以存在任何类型的元素,比如描述模式结构的类图,描述模式中参与者之间的交互的顺序图,等等,都可以被放在基础上下文中,在模式被扩展的时候一起被复制到扩展点处。

  为了提供对模型的可视化开发和表示,XDE在Eclipse的基础上,添加了新的Model透视图(Perspective)。实际上所有模型相关的内容,不仅仅是模式,都是在这个透视图中实现的。而对模式,除了所有模型公用的Model Explorer外,还有一个Pattern Explorer和Pattern Property视图来提供对模式的定义和描述。对这些界面的使用都还比较简单,关键的是要搞清楚那些属性,设置值是来做什么的。除了上面的那些标准的Eclipse图形元素外,XDE中还引入了Pattern Wizard来帮助你完成模式的应用。

  3. 模式的应用

  XDE模式的应用,可以看作是一种基于模版(Template)的方法:定义好的模版参数,通过创建,或者同已有模型中同模版参数类型一致的元素的融合,来完成对模式的扩展。模式中没有被定义为模版参数的元素,将在扩展点处被自动创建。

  在应用一个模式的时候,有两个基本概念:

  1、扩展点(expansion location):这是在模式被应用后,生成的类和其它元素被放置的地方。即使是模式并没有生成任何的元素,而且其基本上下文中也没有涉及到任何得元素,对于模式的应用而言,这个扩展点仍然是需要的。

  2、绑定(binding)和绑定点(binding location)。绑定是模式中的参数被赋予具体的参数值的过程,这个参数值可以是用户指定的一个模型元素,也可以是用缺省值自动创建的元素。当一个模式被应用之后,在指定的绑定点中就有一个绑定对象被创建,它被用来维护这个模式的模版参数和具体的参数值之间的绑定关系。通常绑定的作用是用来在修改了模式之后,重新应用模式,而不需要在通过Pattern Wizard来再次设定应用模式所需的参数值,你也可以直接在绑定对象中修改被绑定的参数值。在缺省的情况下,绑定点和扩展点是同一位置。

  有了这两个基本的概念后,我们可以把模式的应用简单的描述为如下的过程:在扩展点所在处,通过对模式中所定义的参数指定具体的参数值,并将这些参数值实例化到具体的模型中。而模式所在包中其它的除了模版参数外的其它元素也会被相应的创建,包括类图,顺序图等。

  我们还是以Command模式为例,来例示一个模式的定义和应用。

  要应用模式,我们在需要应用的模型上调出快捷菜单,选择Apply Favorite Pattern,然后再选(GOF)Command模式,如下图:



  然后出现Pattern Wizard,帮助你来输入模式的参数值:



  Pattern Wizard的第一个页面上给出了详细的模式说明,以及主要的参与者之间的交互,以帮助开发者选择合适的模式。点下一步之后,就是要输入参数值了:



  一般的参数值的指定有两种方法:

  Selected Element:如上图,需要在模型中指定一个类型相符的元素,这儿是一个类。这种方法将在已有的元素中融合入模版参数中定义的内容,而不对原有的元素造成任何的影响。

  Generated Value:如下图,需要为给定的参数提供一个字符串名字,并生成一个全新的相应名字的元素。



  当为每一个参数均指定了一个绑定值后,再分别指定扩展点和绑定点即可:



  这样,一个模式的应用就完成了。Command模式中所描述的语义信息,以及具体的模型元素都被引入到现有的模型中。

  实际上,在XDE中应用模式的方法有很多,但是使用Pattern Wizard是标准的也是最为简单的方法,而且XDE也允许在定义一个模式的时候,为Pattern Wizard中的每一个页面都做详细的定制,使得模式的应用更为方便简洁。其它的方法,比如使用构造型,使用绑定对象等方法,这儿不再详述。

  上面对在XDE中模式的应用过程作了一个简要地描述。而从XDE的内部工作机制来看,模式的应用是分为如下的三步来进行的:

  1. 绑定:为模式中的每个模版参数指定具体的参数值。

  2. 参数的计算/映射:计算参数相关的内容,比如约束,脚本等等。并根据所指定参数值的数目,进行参数值的映射和匹配。

  3. 展开:当所有的参数都确定之后,模式就能够被展开了。传递进去的参数值会被修改或创建,然后复制到扩展点处,模式的展开完成。

  对这个过程的理解是很重要的,因为我们不仅仅需要应用已有的模式,还需要来定义,创建模式。对这个过程的理解,能够让我们对模版参数以及其绑定之间的关系有了更清楚地认识。而这恰恰就是模式定义的核心。


  4. 模式的定义

  从上面的模式应用的例子可以很容易的看出,在XDE中,模式定义的关键在于对模版参数的定义,这包括有模版参数的类型,生成方式,等等。

  在XDE中开发模式之前,还应该对抽象出来的模式进行细化,以使之能够有具体的实现。比如,对于不同的语言,模式的实现也会有不同。细化的过程比较繁琐,而且也没有一个一定的准则,这儿就不多加讨论了。我们详细的关注,如何在XDE中开发一个模式。

  在XDE中,一个模式的开发,可以遵循如下的步骤:

  4.1 创建模式Asset

  前面说过,一个模式被包含在一个构造型为<<Asset>>的包中,所以在创建一个模式之前,首先需要创建这个包。可以通过在Model Explorer的上下文菜单中选择Add UML > Pattern Asset来创建这个包。如下图所示,会出现如下的对话框:



  上图要注意的是一个Asset可以被定义在一个包中,以可以被单独的定义在一个模型中。这将决定模式的基础上下文是包还是整个模型。

  4.2 为参与者定义模版参数

  模式的参与者是模式中各个职责的承担者,也就是模版参数所需要定义的地方。当然,模版参数还可以包含其他方面的信息,而不仅仅是模式的参与者。简单的说,模版参数定义了所有模式需要被定制的方面。要创建一个模版参数,可以在Model Explorer中新创建的模式协作的上下文菜单中选择Add UML > Template Parameter。再定义好模版参数后,还需要为其指定一个类型。在创建的模版参数的上下文菜单中选择Add UML,然后选择具体的类型:可以是类,方法,属性,接口,字符串,整数等等。基本上大部分的UML元素都可以被创建为一个模版参数。当然,对一个模式的参与者而言,它的类型通常是类,或者接口。对被设置为类类型的模版参数,我们可能还需要向其添加属性,方法等内容。对其中的方法,还可以为其指定代码模版。这些内容都会随着模版参数被引入到具体的模型开发中去。

  我们还可以设置参数的生成方式。判断模版参数值是需要选择一个以存在的模型元素,还是新创建一个,或者从其它的模版参数中衍生出来?这几种不同的生成方法取决于模版参数的Value Source值,它可以是上面的三种情况之一,或者是它们之间的组合。这在后面一节中的Value Source中有更细致的介绍。你可以在Pattern Explore中的Advanced Properties中设置Value Source的值。
  4.3 创建模式的结构类图

  可以在模式的定义中包含一个或则多个类图来定义模式的各个参与者之间的协作与关系。在Model Explorer中新创建的模式协作的上下文菜单中选择Add Diagram > Class。



  实际上,对于模式应用而言,这个类图并不是必需的。但是,这个类图能够很好的对模式的结构作出描述,因而也是很必要的。

  4.4 添加其它可选的模式元素

  你还可以在Model Explore中为模式添加其它非模版参数的模型元素。这些元素被放置在模式的基础上下文中,在模式被绑定展开的时候,他们也会被自动的创建,并放置在扩展点处。在Pattern Explorer中,你可以在模式的Root Context目录下看到这些内容。

  4.5 为模式参与者创建代码模版

  代码模版为参与者中的方法填充具体的代码实现。在某一个方法上调出其上下文菜单,选择Code Templates > Bind,可以为这个方法创建一个新的代码模版,或者选择一个已有的代码模版绑定到方法上。

  在后面的一节中将有对代码模版的专门描述。



  这样,一个完整的模式就被开发出来了。随后我们就可以使用XDE的Pattern Wizard来应用定义的模式到具体的模型开发中去了。

  4.6配置模式

  到现在为止,我们已经完成了大部分的模式开发的工作。但是,还有一些配置问题需要解决。在Pattern Explore中,我们可以对模式进行配置,以期其能够按照我们预想的那样工作。

  配置主要分布在两个地方,都在Pattern Explore中以树状目录显示。具体的设置值则可在Pattern P视图修改。一部分在模式的Advanced Properties下,还有一部分在模式中每个模版参数的Advanced Properties下。如下图:



  在这些地方,可以定制Pattern Wizard中出现的每个页面的内容(Application Wizard Properties & Application Wizard Icons),模式的描述(Custom Dialogs),参数的生成方式(Value Source),以及约束定义(Constraints),定义事件处理(Callouts)等等。基本上所有模式的属性,都能够在其中定义和修改。一些更为具体的内容,可以参见后续的高级话题部分。
 
  这样,就基本上完成了对一个模式的设计工作,我们可以把设计好的模式,通过XDE所提供的导入/导出功能,导出为一个标准的RAS文件,供其它的开发人员使用。


 

版权所有:UML软件工程组织