新聞中心
本文將列數(shù)Visual Studio中的DSL,也就是特定領(lǐng)域開(kāi)發(fā)的方面會(huì)用到的工具,包括微軟以及其他企業(yè)開(kāi)發(fā)的平臺(tái)。這些工具能為大家的.NET開(kāi)發(fā)之路提供更多的便利。

什么是特定領(lǐng)域開(kāi)發(fā)和DSL
特定領(lǐng)域開(kāi)發(fā)是用來(lái)解決重復(fù)發(fā)生的問(wèn)題的方法,針對(duì)每次發(fā)生的問(wèn)題,通過(guò)進(jìn)行總結(jié)和分析,他們之間相同的方面可以一次性的解決.而經(jīng)常變化的方面,可以采用一種特殊的語(yǔ)言表達(dá).針對(duì)這個(gè)特殊語(yǔ)言,我們可以建立模型或者表達(dá)式,然后插入到固定部分.
對(duì)于我們軟件行業(yè)的解決方案來(lái)說(shuō),固定部分一般采用傳統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)方式,可以為框架,平臺(tái),解釋器或者編程接口.提供可擴(kuò)展性,具有高度的抽象性和可復(fù)用性.而特定領(lǐng)域語(yǔ)言專(zhuān)門(mén)用來(lái)創(chuàng)建變化的部分,從而使整個(gè)解決方案可具有可應(yīng)用性.
特定領(lǐng)域語(yǔ)言(DSL,Domain Specific Language)是一種特別用來(lái)描述某一專(zhuān)業(yè)領(lǐng)域內(nèi)涵的描述語(yǔ)言,其實(shí)它并不陌生, HTML ,SQL都算的上是DSL的例子.
幾種其它DSL
MPS http://www.jetbrains.com/mps/ JetBrains公司的DSL工具,通過(guò)這個(gè)平臺(tái)可以直接定義規(guī)則,生成代碼
MetaEdit+ http://www.metacase.com/ 圖形化的DSL工具
Oslo http://msdn.microsoft.com/zh-cn/data/ee460940(en-us).aspx 微軟新推出的圖形化DSL語(yǔ)言,但是Oslo和我們要介紹的DSL Toolkit還是有些區(qū)別的,這里有一些介紹http://blogs.msdn.com/keith_short/archive/2008/11/06/oslo-and-the-dsl-toolkit.aspx .Oslo由 “M"語(yǔ)言,工具Quadrant,關(guān)系存儲(chǔ)組成.
GMF,EMF http://www.eclipse.org/modeling/gmf/ 使用 Eclipse Modeling Framework (EMF) 和 Graphical Modeling Framework (GMF) 技術(shù)來(lái)為領(lǐng)域特定語(yǔ)言(DSL)產(chǎn)生領(lǐng)域特定建模(DSM)輔助工具
什么是Visual Studio DSL
Vistual Studio DSL 工具,是微軟針對(duì)特定領(lǐng)域開(kāi)發(fā)而專(zhuān)門(mén)設(shè)計(jì)的.包含在Vistual Studio SDK中(vs 2010中將是單獨(dú)安裝),允許開(kāi)發(fā)人員自行設(shè)計(jì)專(zhuān)屬的圖形化工具,它內(nèi)置了模型的相關(guān)支持,以及模型與圖形之間的支持,還包括對(duì)模型的驗(yàn)證,規(guī)則,事務(wù)的支持,同時(shí)還允許開(kāi)發(fā)人員在結(jié)合VS.NET的一些擴(kuò)展VSX一同使用.比如工具條,菜單等.可以將模型與T4一同使用,從而生成目標(biāo)代碼.Vs.Net現(xiàn)在的類(lèi)設(shè)計(jì)器,分布式系統(tǒng)設(shè)計(jì)器(Distributed System Designer),LinqToSql設(shè)計(jì)器,EntityFramework設(shè)計(jì)器都是基于VS.NET DSL開(kāi)發(fā)的,VS 2010新增了UML Modeling Project,終于提供了對(duì)類(lèi)圖,時(shí)序圖,用例圖等的支持,這也是基于Vs.NET DSL來(lái)實(shí)現(xiàn)的。
#T#
為什么要使用DSL工具
上面介紹了幾種DSL工具,但是我們?yōu)槭裁匆褂盟?它又能給我們帶來(lái)什么呢? 很關(guān)鍵的一點(diǎn),DSL和UML不同,是用來(lái)解決問(wèn)題的,而不是描述問(wèn)題.如果你正在你的工作和解決方案中重復(fù)編寫(xiě)著相同或者相似的代碼,而且這些重復(fù)的代碼能夠單獨(dú)出來(lái)采用生成的方式,那么你就可以考慮結(jié)合DSL工具來(lái)生成這些代碼.
可能有人會(huì)說(shuō),那這和使用現(xiàn)有的這些基于數(shù)據(jù)庫(kù)的代碼生成工具(Codesmith,李天平的codematic等)又有何不同呢?DSL是站在領(lǐng)域?qū)<业母叨龋擒浖_(kāi)發(fā)專(zhuān)家來(lái)開(kāi)始解決問(wèn)題,如果需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行設(shè)計(jì),然后再生成代碼Coding,那么你這個(gè)工具只能說(shuō)是開(kāi)發(fā)人員的一個(gè)輔助工具,只是面對(duì)實(shí)際開(kāi)發(fā)人員,而這在大型的軟件系統(tǒng)當(dāng)中會(huì)有些力不從心.
采用DSL的開(kāi)發(fā)過(guò)程定制
1.找出問(wèn)題的固定部分,并把這些固定固定部分放在通用架構(gòu)或平臺(tái)中.通用的部分基本上都是我們根據(jù)長(zhǎng)期的經(jīng)驗(yàn)和積累抽象出來(lái)固定的.比如我們使用的Enterprise Library中已經(jīng)將數(shù)據(jù)訪問(wèn)操作,日志操作,驗(yàn)證緩存等封裝起來(lái)提供調(diào)用.
2.識(shí)別可變性和發(fā)現(xiàn)DSL. 找出其中變化的部分,并設(shè)計(jì)DSL, 通過(guò)DSL的表達(dá)式或模型提供給問(wèn)題一個(gè)解決方案. 在使用Enterprise Library過(guò)程中,你發(fā)現(xiàn)其中大部分的變化的部分其實(shí)也相對(duì)"固定",他們還是基于你的模型,基于你的實(shí)體模型,服務(wù)模型,如果把這些元數(shù)據(jù)抽象出來(lái),通過(guò)DSL來(lái)實(shí)現(xiàn)這些元數(shù)據(jù)的配置,那么就可以把這些部分直接生成到你的目標(biāo)解決方案中.
優(yōu)勢(shì)
1.大幅度的提高生產(chǎn)率. 生成代碼可比人工復(fù)制粘貼快多了。
2.使系統(tǒng)的規(guī)范性更強(qiáng). 每個(gè)開(kāi)發(fā)人員對(duì)某一個(gè)功能的都會(huì)有不同的實(shí)現(xiàn)方式,采用DSL設(shè)計(jì)模型,結(jié)合代碼生成能夠使功能的實(shí)現(xiàn)相對(duì)固定.
3.降低了犯錯(cuò)的機(jī)會(huì).
4.使非開(kāi)發(fā)人員,那些顧問(wèn)和售前,也能夠直接了解模型。使開(kāi)發(fā)過(guò)程提前,甚至顧問(wèn)的調(diào)研需求時(shí),就可以使用工具和客戶(hù)溝通,抽象需求,從而提供給二次開(kāi)發(fā)人員使用.
5.能夠在較高的抽象層次對(duì)解決方案進(jìn)行驗(yàn)證,過(guò)早的發(fā)現(xiàn)問(wèn)題.
6.可以基于同一個(gè)模型配置不同的技術(shù)實(shí)現(xiàn)過(guò)程.降低技術(shù)難度和工作量。比如上次介紹的Sculpture,就可以針對(duì)不同的層次,提供不同的技術(shù)選擇。針對(duì)同一個(gè)模型,我們可以選擇使用Entity Framework或者NHibernate。UI層可以選擇Asp.net MVC,Sliverlight,WPF等不同的實(shí)現(xiàn)方式.
7.DSL不局限于生成我們的技術(shù)方案,還可以用來(lái)生成構(gòu)建腳本,文檔,計(jì)劃等。
8.使解決方案進(jìn)行技術(shù)轉(zhuǎn)移變得相對(duì)容易,通過(guò)修改生成器或解釋器就可以做到。模型元數(shù)據(jù)相對(duì)固定,使我們的解決方案相對(duì)規(guī)范。我們只需要生成不同的代碼就可以了。
當(dāng)然,這也是有前提的,一是開(kāi)發(fā)DSL,進(jìn)行抽象整合需要成本。二是并不是所有的解決方案都適合使用DSL,比如一個(gè)門(mén)戶(hù)網(wǎng)站,可能相對(duì)固定的部門(mén)很少,可以定制的部分也很少,就不適合使用,如果對(duì)不適合使用的強(qiáng)制使用就會(huì)陷進(jìn)定制化陷阱。在設(shè)計(jì)和開(kāi)發(fā)時(shí),一定要保留一定的靈活性,因?yàn)椴豢赡芩械拇a都能夠生成,你必須提供一定的擴(kuò)展性,保證能夠?qū)ι傻拇a進(jìn)行擴(kuò)展。另外就是一定要保證實(shí)現(xiàn)的規(guī)范,實(shí)現(xiàn)方式太多,會(huì)導(dǎo)致你的DSL過(guò)于復(fù)雜。有些時(shí)候你甚至需要舍棄一些實(shí)現(xiàn),舍棄一些需求?!昂?jiǎn)單的問(wèn)題的解決應(yīng)該簡(jiǎn)單化,復(fù)雜問(wèn)題的解決應(yīng)該可能化”(smalltalk的創(chuàng)始人AlianKay).
系列介紹
本系列一開(kāi)始將通過(guò)一個(gè)案例簡(jiǎn)單的介紹DSL的開(kāi)發(fā)流程,這個(gè)案例來(lái)源于DSL Tools Lab,主要介紹DSL的一些簡(jiǎn)單開(kāi)發(fā)方法,其中也包括T4與DSL結(jié)合完成代碼生成,DSL工具的部署. 主要是完成一個(gè)狀態(tài)機(jī)的DSL應(yīng)用,具體我們會(huì)在接下來(lái)一一介紹。
對(duì)DSL的開(kāi)發(fā)有過(guò)簡(jiǎn)單的了解后,我們會(huì)對(duì)完成一個(gè)實(shí)際使用的完整的開(kāi)發(fā)工具的開(kāi)發(fā)。在這個(gè)過(guò)程中也會(huì)包含介紹DSL設(shè)計(jì)和開(kāi)發(fā)過(guò)程以及應(yīng)該注意的問(wèn)題,當(dāng)然也會(huì)包括DSL以及VSX的一些比較深層次的應(yīng)用。
參考
Visual Studio DSL 工具特定領(lǐng)域開(kāi)發(fā)指南 Doamin-Specific Development With Visual Studio DSL Tools
鏈接:http://www.cnblogs.com/lonely7345/archive/2010/01/24/1655495.html
本文題目:淺析VisualStudio中的特定領(lǐng)域開(kāi)發(fā)
URL標(biāo)題:http://fisionsoft.com.cn/article/dppsgse.html


咨詢(xún)
建站咨詢(xún)
