关于Visual Studio DSL改善状态机实例说明(2)

发表于:2010-03-29来源:作者:点击数: 标签:状态DSLStudioVisualvisual
关于Visual Studio DSL改善状态机实例说明(2) 软件测试 文章将主要介绍Visual Studio DSL的一些基本的知识,包括域类,域关系,图形符号,图形映射等,虽然这些东西看起来有些抽象,但是其是 开发 我们自己的Visual Studio DSL之前必须要掌握的。 接下来,我

  关于Visual Studio DSL改善状态机实例说明(2)  软件测试

  文章将主要介绍Visual Studio DSL的一些基本的知识,包括域类,域关系,图形符号,图形映射等,虽然这些东西看起来有些抽象,但是其是开发我们自己的Visual Studio DSL之前必须要掌握的。

  接下来,我们添加一个新的域类(从工具条中选择Domain Class拖到左侧域类区),更名为Action,这就是我们的元数据“操作”,为这个域类添加两个string类型的属性Label,Code。

  现在我们需要考虑一下元数据中提到的进入操作和退出操作,在进入一个状态前,对于这个状态可以有进入操作,在退出一个状态时,可以有退出操作,很明显,在状态和操作之间,应该是嵌入关系而非引用关系,也就是我们的状态可以包含零或多个进入操作,零或多个退出操作,那我们这个进入操作和退出操作怎么来用DSL的域类表示呢?如果我们也象描述状态State那样,由一个属性来区分是进入操作还是退出操作是否可行呢?如果是这样的话,对操作Action的添加等就需要特殊处理。另外一点,如果我们针对状态State与操作Action建立多个零至多的嵌入关系会导致DSL编译时就会发生错误,这是Visual Studio DSL所不允许的,这会造成歧义.[包含域类方面和图形映射方面都会有问题]。在这里我们打算用DSL的另外一个特性来实现,也就是域类的继承,我们建立两个新的域类来表示进入操作和退出操作,他们都继承操作Action:

  10.添加两个新域类EntryAction和ExitAction,并不需要给他们添加任何属性。

  11.建立它们与Action的继承关系,选中工具箱中的Inheritance,先选中EntryAction,再指向选中Action。

Action的继承关系

  上图就是完成后Action,我们可以通过Bring Tree Here更简化域类显示(上右图)。

  12.建立EntryAction和ExitAction和State的嵌入关系,注意选中工具箱中的embedding relationship后,要从State指向EntryAction.注意左边的重数是0…*,右边的重数是1..1.也就是说一个状态可以没有进入操作或退出操作,也可以有多个。而且对于每个进入操作和退出操作,它们只能从属于一个状态State。我们现在来看一下我们完成的整个DSL元数据:

整个DSL元数据

  保存整个DSL文件后,我们点击转换所有模板(Transform All Templates),Visual Studio DSL根据我们的DSL文件中的元数据,用T4模板文件生成对应的C#代码,注意我们在以后每当修改完DSL文件中的元数据后,都要记得转换模板,才会使更改起作用.当然,你也可以选中某一个tt文件,右键运行自定义工具(Run Custom Tool),针对这个文件单独生成,尤其当你的DSL文件相当庞大时,这样能够提高生成速度。转换完成后,可以重新编译整个解决方案,查看是否有错误发生。我们象第五节那样,查看一下DomainClasses.cs文件类图:

原文转自:http://www.ltesting.net