您好,登錄后才能下訂單哦!
這篇“Visual Studio DSL改善狀態(tài)機(jī)的方法是什么”文章的知識點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Visual Studio DSL改善狀態(tài)機(jī)的方法是什么”文章吧。
Vistual Studio DSL是微軟針對特定領(lǐng)域開發(fā)而專門設(shè)計的,其主要作用是允許開發(fā)人員自行設(shè)計專屬的圖形化工具,DSL是微軟為特定領(lǐng)域開發(fā)的方面會用到的工具。
首先,按照第三節(jié)創(chuàng)建一個Minimal Lanauge模板項目,打開DSLDefinition.DSL文件:
1. 把根域類ExampleModel的名稱修改StateMachine.同時簽入關(guān)系ExampleModelHasElements也會自動重命名為StateMachineHasElements.
2. 修改域關(guān)系StateMachineHasElements左側(cè)的域角色Elements的屬性名(Property Name 注意不是修改Name--域角色名)改成States.同時簽入關(guān)系StateMachineHasElements自動更新為StateMachineHasStates. [你也可以直接在域角色上點(diǎn)擊修改,因為圖的域角色上顯示的是屬性名而非角色名).
3. 修改域關(guān)系StateMachineHasStates的右側(cè)已經(jīng)更名的域角色StateMachine,修改屬性Name為State.[注意,這里修改的是Name,而不是Property Name].
4. 修改域類ExampleElement的Name為State。
注意這里是基于模板項目進(jìn)行更改,當(dāng)然,你也可以刪除這些自動生成的域類而是全新重新添加.另外或許你對這里的屬性名(property name)和域角色名(name)有些迷惑,請看前面的詳細(xì)區(qū)分。其實(shí)到這一步我們已經(jīng)完成了狀態(tài)機(jī)與狀態(tài)之間元數(shù)據(jù)的DSL描述,接下來我們來完成狀態(tài)之間的關(guān)系。
5.我們可以看到,圖中的State與State之間已經(jīng)是引用關(guān)系,這正是我們想要的,我們修改關(guān)系StateReferencesTargets為Transition。
6.修改Targets為屬性名為Successors,域角色名為Predecessor。
7.修改Sources的屬性名為Predecessors,域角色名為Successor。
同樣,如果不是基于修改,而是重新添加域類也是完全可以的,我們接下來給域類添加一些屬性:
8.給域關(guān)系Transition右鍵添加域?qū)傩?DomainProperty)Event,Condition,Action,Label.類型都為string?,F(xiàn)在來看一下我們的DSL,狀態(tài)機(jī)StateMachine,狀態(tài)State.State之間的有引用關(guān)系Transition,也就是我們需求中描述的轉(zhuǎn)移,它的屬性也就是狀態(tài)機(jī)元數(shù)數(shù)據(jù)---事件Event,警戒條件Condition,操作Action。
接下來,我們還需要給狀態(tài)添加一個屬性,來表示狀態(tài)機(jī)中的狀態(tài)分類,是起始狀態(tài),結(jié)束狀態(tài),還是普通狀態(tài).那么這個屬性就需要是枚舉類型,下面我們需要添加一個自定義的枚舉類型:
9.打開DSL Explorer,在根結(jié)點(diǎn)LanguageSm(這個代表我們的DSL)上右鍵,選擇添加Domain Enumeration。
選中剛添加的域枚舉類型,右鍵選擇屬性,修改Name為StateKind,這樣在DSL瀏覽器的Domain Types下面除了通用的類型外,就多了我們的StateKind枚舉類型,同樣,我們可用同樣的方式添加其它外部類型(External Type),供我們的元數(shù)據(jù)所用。我們?yōu)檫@個枚舉類型添加枚舉值,右鍵添加Enumeration Literal,添加三個枚舉值Normal,Initial,Final,值分別對應(yīng)0,1,2.為我們的域類State添加一個屬性Kind,數(shù)據(jù)類型Type選擇我們剛剛添加的StateKind。
接下來,我們添加一個新的域類(從工具條中選擇Domain Class拖到左側(cè)域類區(qū)),更名為Action,這就是我們的元數(shù)據(jù)“操作”,為這個域類添加兩個string類型的屬性Label,Code。
現(xiàn)在我們需要考慮一下元數(shù)據(jù)中提到的進(jìn)入操作和退出操作,在進(jìn)入一個狀態(tài)前,對于這個狀態(tài)可以有進(jìn)入操作,在退出一個狀態(tài)時,可以有退出操作,很明顯,在狀態(tài)和操作之間,應(yīng)該是嵌入關(guān)系而非引用關(guān)系,也就是我們的狀態(tài)可以包含零或多個進(jìn)入操作,零或多個退出操作,那我們這個進(jìn)入操作和退出操作怎么來用DSL的域類表示呢?如果我們也象描述狀態(tài)State那樣,由一個屬性來區(qū)分是進(jìn)入操作還是退出操作是否可行呢?如果是這樣的話,對操作Action的添加等就需要特殊處理。另外一點(diǎn),如果我們針對狀態(tài)State與操作Action建立多個零至多的嵌入關(guān)系會導(dǎo)致DSL編譯時就會發(fā)生錯誤,這是Visual Studio DSL所不允許的,這會造成歧義.[包含域類方面和圖形映射方面都會有問題]。在這里我們打算用DSL的另外一個特性來實(shí)現(xiàn),也就是域類的繼承,我們建立兩個新的域類來表示進(jìn)入操作和退出操作,他們都繼承操作Action:
10.添加兩個新域類EntryAction和ExitAction,并不需要給他們添加任何屬性。
11.建立它們與Action的繼承關(guān)系,選中工具箱中的Inheritance,先選中EntryAction,再指向選中Action。
上圖就是完成后Action,我們可以通過Bring Tree Here更簡化域類顯示(上右圖)。
12.建立EntryAction和ExitAction和State的嵌入關(guān)系,注意選中工具箱中的embedding relationship后,要從State指向EntryAction.注意左邊的重數(shù)是0…*,右邊的重數(shù)是1..1.也就是說一個狀態(tài)可以沒有進(jìn)入操作或退出操作,也可以有多個。而且對于每個進(jìn)入操作和退出操作,它們只能從屬于一個狀態(tài)State。我們現(xiàn)在來看一下我們完成的整個DSL元數(shù)據(jù):
保存整個DSL文件后,我們點(diǎn)擊轉(zhuǎn)換所有模板(Transform All Templates),Visual Studio DSL根據(jù)我們的DSL文件中的元數(shù)據(jù),用T4模板文件生成對應(yīng)的C#代碼,注意我們在以后每當(dāng)修改完DSL文件中的元數(shù)據(jù)后,都要記得轉(zhuǎn)換模板,才會使更改起作用.當(dāng)然,你也可以選中某一個tt文件,右鍵運(yùn)行自定義工具(Run Custom Tool),針對這個文件單獨(dú)生成,尤其當(dāng)你的DSL文件相當(dāng)龐大時,這樣能夠提高生成速度。轉(zhuǎn)換完成后,可以重新編譯整個解決方案,查看是否有錯誤發(fā)生。我們象第五節(jié)那樣,查看一下DomainClasses.cs文件類圖:
可以看到,元數(shù)據(jù)中的域類,域關(guān)系都體現(xiàn)在生成的代碼中了。
以上就是關(guān)于“Visual Studio DSL改善狀態(tài)機(jī)的方法是什么”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。