什麼是特定領域開發和DSL
特定領域開發是用來解決重複發生的問題的方法,針對每次發生的問題,通過進行總結和分析,他們之間相同的方面可以一次性的解決.而經常變化的方面,可以採用一種特殊的語言表達.針對這個特殊語言,我們可以建立模型或者運算式,然後插入到固定部分.
對於我們軟體行業的解決方案來說,固定部分一般採用傳統的設計和實現方式,可以為架構,平台,解譯器或者編程介面.提供可擴充性,具有高度的抽象性和可複用性.而特定領域語言專門用來建立變化的部分,從而使整個解決方案可具有可應用性.
特定領域語言(DSL,Domain Specific Language)是一種特別用來描述某一專業領域內涵的描述語言,其實它並不陌生, HTML ,SQL都算的上是DSL的例子.
幾種其它DSL
MPS http://www.jetbrains.com/mps/ JetBrains公司的DSL工具,通過這個平台可以直接定義規則,產生代碼
MetaEdit+ http://www.metacase.com/ 圖形化的DSL工具
Oslo http://msdn.microsoft.com/zh-cn/data/ee460940(en-us).aspx 微軟新推出的圖形化DSL語言,但是Oslo和我們要介紹的DSL Toolkit還是有些區別的,這裡有一些介紹http://blogs.msdn.com/keith_short/archive/2008/11/06/oslo-and-the-dsl-toolkit.aspx .Oslo由 “M"語言,工具Quadrant,關係儲存群組成.
GMF,EMF http://www.eclipse.org/modeling/gmf/ 使用 Eclipse Modeling Framework (EMF) 和 Graphical Modeling Framework (GMF) 技術來為領特定領域語言(DSL)產生領域特定建模(DSM)協助工具輔助
什麼是Visual Studio DSL
Vistual Studio DSL 工具,是微軟針對特定領域開發而專門設計的.包含在Vistual Studio SDK中(vs 2010中將是單獨安裝),允許開發人員自行設計專屬的圖形化工具,它內建了模型的相關支援,以及模型與圖形之間的支援,還包括對模型的驗證,規則,事務的支援,同時還允許開發人員在結合VS.NET的一些擴充VSX一同使用.比如工具條,菜單等.可以將模型與T4一同使用,從而產生目標代碼.Vs.Net現在的類別設計工具,分散式系統設計工具(Distributed System Designer),LinqToSql設計器,EntityFramework設計器都是基於VS.NET DSL開發的,VS 2010新增了UML Modeling Project,終於提供了對類圖,時序圖,使用案例圖等的支援,這也是基於Vs.NET DSL來實現的.
為什麼要使用DSL工具
上面介紹了幾種DSL工具,但是我們為什麼要使用它呢?它又能給我們帶來什麼呢? 很關鍵的一點,DSL和UML不同,是用來解決問題的,而不是描述問題.如果你正在你的工作和解決方案中重複編寫著相同或者相似的代碼,而且這些重複的代碼能夠單獨出來採用產生的方式,那麼你就可以考慮結合DSL工具來產生這些代碼.
可能有人會說,那這和使用現有的這些基於資料庫的代碼產生工具(Codesmith,李天平的codematic等)又有何不同呢?DSL是站在領域專家的高度,而非軟體開發專家來開始解決問題,如果需要對資料庫進行設計,然後再產生代碼Coding,那麼你這個工具只能說是開發人員的一個協助工具輔助,只是面對實際開發人員,而這在大型的軟體系統當中會有些力不從心.
採用DSL的開發過程定製
1.找出問題的固定部分,並把這些固定固定部分放在通用架構或平台中.通用的部分基本上都是我們根據長期的經驗和積累抽象出來固定的.比如我們使用的Enterprise Library中已經將資料訪問操作,日誌操作,驗證緩衝等封裝起來提供調用.
2.識別可變性和發現DSL. 找出其中變化的部分,並設計DSL, 通過DSL的運算式或模型提供給問題一個解決方案. 在使用Enterprise Library過程中,你發現其中大部分的變化的部分其實也相對"固定",他們還是基於你的模型,基於你的實體模型,服務模型,如果把這些中繼資料抽象出來,通過DSL來實現這些中繼資料的配置,那麼就可以把這些部分直接產生到你的目標解決方案中.
優勢
1.大幅度的提高生產率. 產生代碼可比人工複製粘貼快多了。
2.使系統的規範性更強. 每個開發人員對某一個功能的都會有不同的實現方式,採用DSL設計模型,結合代碼產生能夠使功能的實現相對固定.
3.降低了犯錯的機會.
4.使非開發人員,那些顧問和售前,也能夠直接瞭解模型。使開發過程提前,甚至顧問的調研需求時,就可以使用工具和客戶溝通,抽象需求,從而提供給二次開發人員使用.
5.能夠在較高的抽象層次對解決方案進行驗證,過早的發現問題.
6.可以基於同一個模型配置不同的技術實現過程.降低技術難度和工作量。比如上次介紹的Sculpture,就可以針對不同的層次,提供不同的技術選擇。針對同一個模型,我們可以選擇使用Entity Framework或者NHibernate。UI層可以選擇Asp.net MVC,Sliverlight,WPF等不同的實現方式.
7.DSL不局限於產生我們的技術方案,還可以用來產生構建指令碼,文檔,計劃等。
8.使解決方案進行技術轉移變得相對容易,通過修改產生器或解譯器就可以做到。模型中繼資料相對固定,使我們的解決方案相對規範。我們只需要產生不同的代碼就可以了。
當然,這也是有前提的,一是開發DSL,進行抽象整合需要成本。二是並不是所有的解決方案都適合使用DSL,比如一個門戶網站,可能相對固定的部門很少,可以定製的部分也很少,就不適合使用,如果對不適合使用的強制使用就會陷進定製化陷阱。在設計和開發時,一定要保留一定的靈活性,因為不可能所有的代碼都能夠產生,你必須提供一定的擴充性,保證能夠對產生的程式碼進行擴充。另外就是一定要保證實現的規範,實現方式太多,會導致你的DSL過於複雜。有些時候你甚至需要捨棄一些實現,捨棄一些需求。“簡單的問題的解決應該簡單化,複雜問題的解決應該可能化”(smalltalk的創始人AlianKay).
系列介紹
本系列一開始將通過一個案例簡單的介紹DSL的開發流程,這個案例來源於DSL Tools Lab,主要介紹DSL的一些簡單開發方法,其中也包括T4與DSL結合完成代碼產生,DSL工具的部署. 主要是完成一個狀態機器的DSL應用,具體我們會在接下來一一介紹。
對DSL的開發有過簡單的瞭解後,我們會對完成一個實際使用的完整的開發工具的開發。在這個過程中也會包含介紹DSL設計和開發過程以及應該注意的問題,當然也會包括DSL以及VSX的一些比較深層次的應用。
參考
Visual Studio DSL 工具特定領域開發指南 Doamin-Specific Development With Visual Studio DSL Tools
作者:孤獨俠客(似水流年)
出處:http://lonely7345.cnblogs.com/
本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,否則保留追究法律責任的權利。