資源描述:
《java8采用martinfowler的方法創(chuàng)建內(nèi)部dsl-java開發(fā)java經(jīng)驗(yàn)技巧》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、Java8采用MartinFowler的方法創(chuàng)建內(nèi)部DSL-編程開發(fā)技術(shù)Java8采用MartinFowler的方法創(chuàng)建內(nèi)部DSL本文illImportNew-賴信濤翻譯口javacodegeekso歡迎加入翻譯小組。轉(zhuǎn)載詰見文末要求。我最近在讀MartinFlower寫的一本非常棒的關(guān)于DSLs(DomainSpecificLanguages)的書。圍繞DSLs及語(yǔ)言的內(nèi)容使得我們可以很方便地創(chuàng)建DSLs,DSLs的使用讓我對(duì)DSLs的概念更加好奇,這本書讓人印象深刻。在MartinFowler一書的開始是
2、這樣定義DSLs的:Domain-specificlanguage(noun):一種專注于某一領(lǐng)域,僅針對(duì)部分表達(dá)方式的計(jì)算機(jī)編程語(yǔ)言。(譯者注:求專不求全。)DSL不是什么新鮮玩意,很久以前,人們就將XML作為--種DSL的--種形式來(lái)使用了。將XML作為DSL來(lái)使用非常便捷,因?yàn)槲覀兛捎脕?lái)檢查DSL的XSD,有解釋DSL的解釋器,還有能將DSL轉(zhuǎn)換成其他語(yǔ)言的XSLTo并且,多數(shù)的語(yǔ)言都對(duì)解釋XML和獲取該語(yǔ)言領(lǐng)域屮模型對(duì)象的內(nèi)容捉供了很好的支持。像是Ruby,Groovy等等這些語(yǔ)言的出現(xiàn)使得DSL被更
3、廣泛的接受。比如Rails,—個(gè)使用Ruby寫的Web框架,廣泛地采用了DSLs。MartinFowler在他的書中將DSLs分為三類:內(nèi)部的DSL,外部的DSL,和語(yǔ)言工作平臺(tái)的DSL。當(dāng)我讀到內(nèi)部DSL概念時(shí),使用Jewel作為宿主語(yǔ)言,用我口己簡(jiǎn)單的DSL小試牛刀了一下。內(nèi)部DSLs駐于宿主語(yǔ)言屮,并月.遵守宿主語(yǔ)言的語(yǔ)法。盡管使用Java作為宿主語(yǔ)言沒(méi)有讓我非常清楚的了解DSL,但卻有效地讓我以一種合適的方式來(lái)了解DSLo我打算寫一個(gè)能產(chǎn)生圖表的DSLo在Java中有兩種接收輸入并產(chǎn)生表格的方法:Ad
4、jacencyList和AdjacencyMatrixo然血我發(fā)現(xiàn),在沒(méi)有將矩陣作為"一等公民”提供支持的語(yǔ)言(尤其是Java)實(shí)現(xiàn)是非常困難的,所以,我就嘗試著在Java中寫一個(gè)內(nèi)部DSL來(lái)實(shí)現(xiàn)對(duì)表格的操作。在他的書中,MartinFowler強(qiáng)調(diào)需要保持語(yǔ)義模型不同于DSL,并且引入了一個(gè)中間表達(dá)式構(gòu)造器來(lái)從DSL中產(chǎn)生語(yǔ)義模型。所以為了遵守上述內(nèi)容,我通過(guò)寫不同的DSL語(yǔ)法和表達(dá)式構(gòu)造器實(shí)現(xiàn)了三種不同的DSLs形式,同時(shí)又使用了相同的語(yǔ)義模型。理解語(yǔ)義模型在這種情景卜?,語(yǔ)義模型就是包含了Edge實(shí)例數(shù)
5、組的Graph類,每一個(gè)Edge對(duì)象又存放了從Vertex到Vertex的數(shù)據(jù)和一個(gè)weight。卜而看一卜代碼吧。Graph,javaimportjava.util.ArrayList;importjava.util.List;importjava.util.Set;importjava.util.TreeSet;publicclassGraph{privateListedges;privateSetvertices;publicGraph(){edges=newArrayLis
6、tO();vertices=newTreeSetO();}publicvoidaddEdge(Edgeedge){getEdges()?add(edge);}publicvoidaddVertice(Vertexv){getVertices().add(v);}publicListgetEdges(){returnedges;}publicSetgetVertices(){returnvertices;}publicstaticvoidprintGraph(Graphg){Syst
7、em,out.printin("Vertices.??〃);for(Vertexv:g.getVertices()){System,out.print(v.getLabel()+〃〃);}System,out.printIn(〃〃);System,out.printin("Edges.??〃);for(Edgee:g.getEdges()){System,out.println(e);}Edge,javapublicclassEdge{privateVertexfromVertex;privateVertex
8、toVcrtcx;privateDoubleweight;publicEdge(){}publicEdge(VertexfromVertex,VertextoVertex,Doubleweight){this.fromVertex=fromVertex;this.toVertex二toVertex;this.weight二weight;}?OverridepublicStringtoString()