天天看點

艾偉_轉載:Visual Studio DSL 入門 2

     相信如果看過一上篇你已經對vs.net dsl有了一定的了解,接下來我們就來開始我們的這個系列的入門,Vs.net Dsl在國内可能使用的人少之又少,不過希望這個系列能夠使看到的人能夠對dsl有一定的了解,使之能夠成為産品方案選型時的一個參考,能夠對閱讀的人有所幫助.

準備環境

需求說明

    我們完成的這個簡單的Demo類似于UML中的狀态圖(Statechart Diagram),  這個狀态機由狀态(states)組成,各狀态由轉移(transitions)連結在一起。狀态是對象執行某項活動或等待某個事件時的條件。轉移是兩個狀态之間的關系,它由某個事件觸發,然後執行特定的操作或評估并導緻特定的結束狀态。

  狀态(State)的要素:

         名稱:    将一個狀态與其他狀态區分開來的文本字元串;狀态也可能是匿名的,這表示它沒有名稱。 

         分類:    狀态分為初始狀态(initial state)和結束狀态(end state).    

         進入/退出操作:    在進入和退出狀态時所執行的操作。

         内部轉移:        在不使狀态發生變更的情況下進行的轉移。

         子狀态:          狀态的嵌套結構,包括不相連的(依次處于活動狀态的)或并行的(同時處于活動狀态的)子狀态。

         延遲的事件:      未在該狀态中處理但被延遲處理(即列隊等待由另一個狀态中的對象來處理)的一系列事件。 

   轉移(Transitions)的要素: 

        源狀态:            轉移所影響的狀态;如果對象處于源狀态,當對象收到轉移的觸發事件并且滿足警戒條件(如果有)時,就可能會觸發輸出轉移。 

        事件觸發器:       使轉移滿足觸發條件的事件。當處于源狀态的對象收到該事件時(假設已滿足其警戒條件),就可能會觸發轉移。 事件一般都有一個名稱,但是有些轉移沒有事件名稱,稱為自動或隐式轉移.

        警戒條件:         一種布爾表達式。在接收到事件觸發器而觸發轉移時,将對該表達式求值;如果該表達式求值結果為 True,則說明轉移符合觸發條件;如果該表達式求值結果為False,則不觸發轉移。如果沒有其他轉移可以由同一事件來觸發,該事件就将被丢棄。 

        操作:              可執行的、不可分割的計算過程,該計算可能直接作用于擁有狀态機的對象,也可能間接作用于該對象可見的其他對象。

        目标狀态(可選):          在完成轉移後被激活的狀态。

        參數:              轉移可能有參數,這個參數為事件觸發器的事件方法的參數

事先弄清楚這段說明是很重要的,因為我們的模型,我們的中繼資料都來源于需求問題的描述.

計劃

      一個簡單的入門系列計劃大緻包含幾下幾步:

      1. 建立一個簡單的DSL模型

      2. 建立我們的中繼資料模型,包含狀态機(StateMachine),狀态(State),轉移(Transition).可能實際的會對我們需求有些取舍,比如不考慮子狀态等.

      3. 建立相對我們的中繼資料模型的圖形展現.

      4.規範我們的模型和圖.添加規則(Rule)和驗證(Validation).

      5.在Visual Studio實驗室環境中測試我們的Dsl項目

      6.改善我們的使用者界面.

      7.針對我們限定的中繼資料針對一個架構建立代碼生成.

      8.建立安裝程式釋出Dsl項目安裝包

資源

      3.Domain-Specific Development with Visual Studio DSL Tools   目前知道的唯一一本關于專門關于Vs.NET DSL的書,有對應的中文譯本.