次の 2 つのクラスに基づくツリーのような構造を取得しました。
public class SchemaNode
{
private SchemaNode parentNode;
private String elementName;
private List<Edge> edges;
/* constructors, getters/setters, etc. omitted to improve brevity */
}
public class Edge
{
private int minCardinality;
private int maxCardinality;
private SchemaNode targetNode;
/* constructors, getters/setters, etc. omitted to improve brevity */
}
ツリーの生成を簡素化するビルダーも作成しました。
public class SchemaTreeBuilder
{
private SchemaNode result;
private SchemaNode currentNode;
public SchemaTreeBuilder(String nodeName) {
result = new SchemaNode(nodeName);
currentNode = result;
}
public SchemaTreeBuilder addEdge(int minCardinality, int maxCardinality, String elementName)
{
SchemaNode targetNode = new SchemaNode(elementName, currentNode);
Edge edge = new Edge(minCardinality, maxCardinality, targetNode);
currentNode.addEdge(edge);
currentNode = targetNode;
return this;
}
public SchemaTreeBuilder addEdge(String elementName) {
this.addEdge(1, 1, elementName);
return this;
}
public SchemaTreeBuilder up()
{
SchemaNode parentNode = currentNode.getParent();
if (parentNode == null) {
throw new IllegalStateException("Called up on a root node.");
}
currentNode = parentNode;
return this;
}
public SchemaNode getResult() {
return result;
}
}
ここで、ビルダーが適切に機能することを確認するために、いくつかの単体テストを作成したいと思います。次のテストの始まりを作成しました。
@Test
public void buildsABasicSchemaTree()
{
SchemaNode tree =
new SchemaTreeBuilder("is")
.addEdge(1, 1, "people")
.addEdge(0, 100, "person")
.addEdge(1, 1, "id")
.up()
.addEdge(1, 1, "name")
.up()
.up()
.up()
.addEdge(1, 1, "courses")
.addEdge(1, 10, "course")
.addEdge(1, 1, "id")
.up()
.addEdge(1, 1, "teacher_id")
.up()
.addEdge(1, 1, "students")
.addEdge(1, 30, "student_id")
.getResult();
...
}
しかし、ツリーが適切に構築されたことを確認するために assert ステートメントを表現する最良の方法は何だろうと思っています。
コードを改善する方法に関するその他の提案 (たとえば、質問に関係のないもの) も同様に高く評価されます。質問へのコメントにそれらを残してください。