DSL定义:Domain-specific language (名词,简称DSL): 是一种专注特定领域的有限表达法。
Martin Fowler 认为DSL区别于通常语义上的领域模型,通过一些内部的DSL表达式可以导入或构建领域模型。(DSL类似领域模型的Builder)。
这种内部DSL表达式有下面几种:
1. Method Chaining 方法链 Fluent Style流畅风格
2. Functional Sequence
3. Nested Functions 嵌套函数
4.Lambda Expressions/Closures
在Java 8中创建Martin Fowler的内部DSL Creating Internal DSLs in Java, Java 8- Adopting Martin Fowler’s approach | Java, JVM and beyond
一文以Java 8为例说明了这种内部表达式的使用。
下面以三个语义模型为例:
Graph
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 = toVertex; this.weight = weight; } @Override public String toString() { return fromVertex.getLabel()+" to "+ toVertex.getLabel()+" with weight "+ getWeight(); } public Vertex getFromVertex() { return fromVertex; } public void setFromVertex(Vertex fromVertex) { this.fromVertex = fromVertex; } public Vertex getToVertex() { return toVertex; } public void setToVertex(Vertex toVertex) { this.toVertex = toVertex; } public Double getWeight() { return weight; } public void setWeight(Double weight) { this.weight = weight; } }
|
Vertex.java
ublic class Vertex implements Comparable<Vertex> { private String label; public Vertex(String label) { this.label = label.toUpperCase(); } @Override public int compareTo(Vertex o) { return (this.getLabel().compareTo(o.getLabel())); } public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } }
|