资源描述:
《java8采用martinfowler的方法创建内部dsl-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Java8采用MartinFowler的方法创建内部DSL-编程开发技术Java8采用MartinFowler的方法创建内部DSL本文illImportNew-赖信涛翻译口javacodegeekso欢迎加入翻译小组。转载诘见文末要求。我最近在读MartinFlower写的一本非常棒的关于DSLs(DomainSpecificLanguages)的书。围绕DSLs及语言的内容使得我们可以很方便地创建DSLs,DSLs的使用让我对DSLs的概念更加好奇,这本书让人印象深刻。在MartinFowler一书的开始是
2、这样定义DSLs的:Domain-specificlanguage(noun):一种专注于某一领域,仅针对部分表达方式的计算机编程语言。(译者注:求专不求全。)DSL不是什么新鲜玩意,很久以前,人们就将XML作为--种DSL的--种形式来使用了。将XML作为DSL来使用非常便捷,因为我们可用来检查DSL的XSD,有解释DSL的解释器,还有能将DSL转换成其他语言的XSLTo并且,多数的语言都对解释XML和获取该语言领域屮模型对象的内容捉供了很好的支持。像是Ruby,Groovy等等这些语言的出现使得DSL被更
3、广泛的接受。比如Rails,—个使用Ruby写的Web框架,广泛地采用了DSLs。MartinFowler在他的书中将DSLs分为三类:内部的DSL,外部的DSL,和语言工作平台的DSL。当我读到内部DSL概念时,使用Jewel作为宿主语言,用我口己简单的DSL小试牛刀了一下。内部DSLs驻于宿主语言屮,并月.遵守宿主语言的语法。尽管使用Java作为宿主语言没有让我非常清楚的了解DSL,但却有效地让我以一种合适的方式来了解DSLo我打算写一个能产生图表的DSLo在Java中有两种接收输入并产生表格的方法:Ad
4、jacencyList和AdjacencyMatrixo然血我发现,在没有将矩阵作为"一等公民”提供支持的语言(尤其是Java)实现是非常困难的,所以,我就尝试着在Java中写一个内部DSL來实现对表格的操作。在他的书中,MartinFowler强调需要保持语义模型不同于DSL,并且引入了一个中间表达式构造器來从DSL中产生语义模型。所以为了遵守上述内容,我通过写不同的DSL语法和表达式构造器实现了三种不同的DSLs形式,同时又使用了相同的语义模型。理解语义模型在这种情景卜•,语义模型就是包含了Edge实例数
5、组的Graph类,每一个Edge对象又存放了从Vertex到Vertex的数据和一个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()