用Java和Java 8创建内部DSL,采用Martin Fowler的方法

本文介绍了如何使用Java和Java 8创建内部DSL,遵循Martin Fowler的指导。通过方法链接、嵌套功能和Lambda表达式展示了三种构建内部DSL的方法,并通过创建图形的DSL进行了示例说明。
摘要由CSDN通过智能技术生成

目前,我正在阅读Martin Fowler撰写的有关DSL- 特定域的语言的精彩书籍。 围绕DSL的嗡嗡声,围绕轻松支持DSL创建的语言,以及DSL的使用使我好奇地了解和了解DSL的这一概念。 到目前为止,这本书的使用经验令人印象深刻。

马丁·福勒(Martin Fowler)在他的书中提到的DSL定义:

特定领域的语言(名词):一种表达能力有限的计算机编程语言,专注于特定领域。


DSL并不是什么新鲜事物,它已经存在了很长时间。 人们使用XML作为DSL的一种形式。 使用XML作为DSL很容易,因为我们有XSD来验证DSL,有解析器来解析DSL,还有XSLT来将DSL转换成其他语言。 而且大多数语言为解析XML和填充其域模型对象提供了很好的支持。 诸如Ruby,Groovy等语言的出现增加了DSL的采用。 例如,使用Ruby编写的Web框架Rails广泛使用DSL。

Martin Fowler在他的书中将DSL分为内部,外部和语言工作台。 当我阅读了内部DSL概念时,我使用Java作为宿主语言在自己的简单DSL上进行了一些尝试。 内部DSL位于宿主语言中,并受宿主语言的语法功能约束。 使用Java作为宿主语言并不能给我真正清晰的DSL,但是我努力使它更接近可以舒适地理解DSL的形式。

我试图创建用于创建图的DSL。 据我所知,输入和表示图形的不同方式是: 邻接表邻接矩阵 。 我一直发现这很难使用,尤其是在Java等语言中,这些语言没有作为一等公民的矩阵。 在这里,我试图创建一个内部DSL,以用Java填充图形。

马丁·福勒(Martin Fowler)在他的书中强调,需要保持语义模型与DSL不同,并引入一种中间表达构建器,该构建器可以从DSL填充语义模型。 通过保持这种状态,我能够通过编写不同的DSL语法和表达式构建器并同时使用相同的语义模型来实现3种不同形式的DSL。

了解语义模型

在这种情况下,语义模型是Graph类,它包含Edge实例的列表,每个Edge包含从VertexVertex以及权重。 让我们看一下相同的代码:

Graph.java
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

public class Graph {

  private List<Edge> edges;
  private Set<Vertex> vertices;

  public Graph() {
    edges = new ArrayList<>();
    vertices = new TreeSet<>();
  }
  public void addEdge(Edge edge){
    getEdges().add(edge);
  }

  public void addVertice(Vertex v){
    getVertices().add(v);
  }

  public List<Edge> getEdges() {
    return edges;
  }

  public Set<Vertex> getVertices() {
    return vertices;
  }

  public static void printGraph(Graph g){
    System.out.println("Vertices...");
    for (Vertex v : g.getVertices()) {
      System.out.print(v.getLabel() + " ");
    }
    System.out.println("");
    System.out.println("Edges...");
    for (Edge e : g.getEdges()) {
      System.out.println(e);
    }
  }
}
Edge.java
public class Edge {
  private Vertex fromVertex;
  private Vertex toVertex;
  private Double weight;

  public Edge() {
  }

  public Edge(Vertex fromVertex, Vertex toVertex, Double weight) {
    this.fromVertex = fromVertex;
    this.toVertex = toVe
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值