關于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.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97