微軟在VS2005SDK中開始提供了DSL,也出了一本專門寫Visual Studio DSL的書籍,這本書較為詳細的介紹了一下DSL的內容,在目前DSL書籍較少的環境下,有這麼一本書可以參考還是不錯的。
我幾年前就看過了這本書了,由於最近開始考慮給OpenExpressApp增加模型驅動開發的建模支援OpenMetaEdit,所以又重新看了一下,現在把書中一些非Visual Studio特有的知識摘錄如下,對DSL感興趣的可以學習下。
- 特定領域開發是通過設計一種用於特定目的的語言,使軟體開發中遇到的大多數問題更容易解決。
- 如果僅適用通用程式設計語言,則每次只能解決一個問題,但如果應用特定領域開發方法設計並實現一些特殊語言,每個特殊語言可以高效地解決一類相似的問題
- 特定領域語言可以使文本語言,也可以是圖形語言。
- 圖形語言不只是圖表,否則使用Visio之類的畫圖軟體就行了,它實際上是要建立模型,這個模型要能夠從概念上描繪你正在建立的系統,並對其內容進行圖表化的表示。一個模型可以同時由多個圖表來表示,每個圖表表示模型的某個方面
- 文本語言使用者輸入,可以快速的打字。
- 文本語言的優勢在於可以進行比較和合并,而圖形運算式可以更容易的看出內容之間的關聯。
- 相對來說,文本語言比圖形複雜
- 特定領域開發時一種用於解決重複發生的問題的方法。對於問題的每次發生,就用這個特殊語言建立模型或運算式,然後把模型插入到解決方案中的固定部分。解決方案中的固定部分採用傳統的設計、編碼和測試技術實現,根據藥解決問題的規模和種類,固定部分可以是架構、平台、解譯器或API。固定部分確立了構成問題域的結構模式,同時也提供了可擴充性,從而可用到多個解決方案中。
- 軟體開發過程定製
- 找出所有問題中的固定部分,並把這些固定部分放在通用架構或平台中
- 找出所有問題的變化部分,並設計一種DSL,DSL的運算式或模型可以給出問題的一個解決方案
- DSL應用的優點
- 特定領域語言的定義:
特定領域語言是針對小的問題領域而定製的語言,它使用該領域特有的術語對問題進行描述和驗證
- 特定領域開發與許多其他作者和機構的創造密切相關,一下列出了其中一部分:
- 模型驅動開發 MDA
- 面向語言編程 LOP
- 語言工作平台 Language Workbenches
- 特定領域建模 DSM
- 產生式編程 Generative Rrogramming
- 意圖軟體 Intentional Software
- 軟體工廠 SOftware Factories
- 表示結構的規範:結構容器、隔間、連接線、重數、連接埠
- 表示行為的規範:生命線和箭頭、箭頭、泳道、小人
- 圖形DSL有幾個重要內容必須要定義:符號、領域模型(域類和關係、約束)、產生、序列化和工具整合
- DSL工具採用自舉的方式由DSL定義產生,系統的核心是那些自動產生的程式碼,並通過手寫代碼對其進行功能擴充
- 對於大多數情況,DSL主要是對通用架構參數化的途徑
- 為了降低風險,我們並不是馬上就從頭開始開發架構及其DSL,而是從現有的可以在某些應用中使用的代碼開始,逐步的對其進行參數化,逐步的發現那些在不同應用中變化的部分,然後使這些部分依賴於DSL
- 自上而下的方法傾向於快速建立一個完整且自包含的模型,具有更長遠的考慮,有助於保證結構的一致性。但是從另一方面看,這種方法容易導致在概念層設計出很複雜的模型,並且該模型難於實現。因此在實際應用中,將自上而下和自下而上兩種方法交替使用會更有效。採用漸進的方式可以避免早期投入過大風險,但是需要定期進行一致性檢查
- 採用DSL的一個作用就是,使工作更貼近於客戶的理解,而不是實現本身
- 展示層和底層模型相互分離的設計,使得DSL編寫者可以在不改動模型的情況下,合理改變領域模型的表示方式。在DSL儲存時產生兩個檔案,一個檔案包括域類和關係的執行個體,以及它們的屬性資訊,另一個檔案則包含用於圖形化顯示的布局資訊
- 當要產生大量的代碼時,用運行時參數化的通用代碼替代部分代碼會更有好處
- 由DSL驅動的應用程式:產生式應用,解釋式應用。在某些情況下,系統可能需要從產生式架構演變到解釋方式架構,以增強更多的運行時靈活性
- 一個DSL實現的結構主要分為三層:編譯好的架構,由DSL定義產生的程式碼,以及自動以代碼
Microsoft.VisualStudio.Modeling:領域模型架構時整個系統的核心,負責管理模型的元素和串連,也就是域類和域關係的執行個體。
Modeling.Disgrams:設計介面架構建立在領域模型架構之上,它負責處理圖形符號的顯示,包括處理圖表、圖形、連接器和裝飾等元素在設計介面上的顯示
Modeling.Validation:驗證架構負責執行關於模型元素和串連的驗證方法,如果驗證失敗,它還要負責建立錯誤對象。它與Shell架構互動,把錯誤資訊顯示到Visual Studio的錯誤視窗
Modeling.TextTemplation:模板引擎負責執行文本模板來產生代碼或其他的工件。模板引擎室一個獨立的組件,用於執行來自非DSL的模板輸入
Modeling.Shell:建模用的Shell負責管理將涉及器整合到Visual Studio中,例如處理工具視窗和菜單名利,以及檔案的開啟和關閉等
- 每一個DSL的核心都是一個領域模型,它定義了這一預言所代表的各種概念,這些概念的屬性,以及它們之間的關係
- 形狀:集合形狀、隔間形狀、映像形狀、連接埠、泳道
- 選擇硬約束還是軟約束
- 硬約束指的是工具從不讓使用者違反的那些約束,例如在一個形狀元素的“寬度”欄位中,只允許有效地數字
- 軟約束是指使用者在有時可以違反,而有時有不能違反的那些約束,例如模型中所有的元素都要有唯一的名字
- 大多數約束的計算量都不小,使用者並不是在任何時候都一直需要正確的模型
- 將重數的最大值作為硬約束,而把最小值作為軟約束
- 當使用DSL工具在概念層建模時,經驗證明,一個有用的做法是實用字串作為基本屬性類型,然後用一組軟約束檢驗屬性的值符合更為嚴格的類型集
- 單獨使用硬約束不會帶來最佳的使用者體驗,因為硬約束只是不讓使用者及逆行那個任何違反規則的操作,而不是引導使用者的使用體驗
- DSL的一個最重要的應用是用來生產簡單的文本形式的工件,例如原始碼、資料庫指令碼,或者是另一個DSL的持久化表示
- 目前DSL工具並不提供對同步的直接支援,這是因為除了少數DSL,同步的複雜程度通常超過了其帶來的收益。
- 設計DSL
- 識別可變性與發現DSL:DSL是用你的架構具體的實現你的體系架構模式中可變的部分
- 開發領域模型捕獲可變性
- 定義標記:在適當的地方使用常見標記法或與標記法相關的約定
- 開發驗證的約束:識別樹形之間的依賴性,認出快照中的強制或禁止的迴圈
- 開發並演化架構:理解你的DSL針對的代碼體繫結構,並在架構中編寫它
- 測試DSL:包括驗證的約束與規則、產生器與命令、以及產生的程式碼
- 演化和移植DSL:確保舊的模型在新版本的DSL中能夠使用
- 識別好的DSL:範圍、最小性、常見標記法,適度的冗餘,合理的使用句法空間,使用使用者術語
- 特殊樹是自頂下下考慮及捕獲變化的一種技術。
- 這棵樹概念上包括需求文檔的每一個特徵,其中有些特徵可能最終也是不可選的。
- 特徵樹是針對需求而不是設計的,每個特徵描述了系統中的一些客戶可見的東西。許多變動時關於設計抉擇的變化,而不是需求變更,例如在某處使用list代替array,這些變化不包含在特徵樹中
- 特徵樹不只包括終端使用者的可見特徵,當你設計某些類似通用嚮導構建器的東西是,你的客戶是調用你的子系統的開發人員,特徵是那些在你的API中對他們是可見的行為
歡迎轉載,轉載請註明:轉載自周金根 [ http://zhoujg.cnblogs.com/ ]