java8采用martinfowler的方法创建内部dsl-java开发java经验技巧

java8采用martinfowler的方法创建内部dsl-java开发java经验技巧

ID:30776400

大小:140.74 KB

页数:14页

时间:2019-01-03

java8采用martinfowler的方法创建内部dsl-java开发java经验技巧_第1页
java8采用martinfowler的方法创建内部dsl-java开发java经验技巧_第2页
java8采用martinfowler的方法创建内部dsl-java开发java经验技巧_第3页
java8采用martinfowler的方法创建内部dsl-java开发java经验技巧_第4页
java8采用martinfowler的方法创建内部dsl-java开发java经验技巧_第5页
资源描述:

《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()

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。