Step2:共通処理のメソッド抽出
まずは共通的に使用されている処理を別メソッドに抽出しましょう。リスト2③④の個所で
ここで前号の本連載で紹介した変数の
node.appendChild(createElement(doc));
...
private Element createElement(
Document doc, Division div) {
Element idNode = doc.createElement("id");
idNode.setTextContent(div.getId());
return idNode;
}
Element idNode = doc.createElement("id"); ┓
idNode.setTextContent(div.getId()); |idNodeが使用される範囲
node.appendChild(idNode); ┛
とりあえず、
ただし、
...
public ActionResult index() throws Exception {
...
int rowIndex = 1;
Document doc = newDocument(); ―①
Element rootNode = doc.createElement("data");
doc.appendChild(rootNode);
Element divisionsNode = doc.createElement("divisions");
for (Division div: divs) {
Element node = doc.createElement("division");
node.setAttribute("index", String.valueOf(rowIndex++));
node.appendChild(createElement(doc, "id", div.getId()));
node.appendChild(createElement(doc, "name", div.getName()));
divisionsNode.appendChild(node);
}
rootNode.appendChild(divisionsNode);
...
}
private Document newDocument() { ┓
DocumentBuilderFactory factory = |
DocumentBuilderFactory.newInstance(); |
DocumentBuilder builder = factory.newDocumentBuilder(); |
return builder.newDocument(); |
} ┛②
private Element createElement(
Document doc, String nodeName, String textContent) {
Element node = doc.createElement(nodeName);
node.setTextContent(textContent);
return node;
}
...

また、
このように
考察1:appendChildの呼び出しをcreateElementに持っていく? いかない?
リスト4 を見て、
createElement(doc, "id", div.getId(), node);
...
private void createElement(Document doc, String
nodeName, String textContent, Element parent) {
Element node = doc.createElement(nodeName);
node.setTextContent(textContent);
parent.appendChild(node); // 外部の状態を変更!!
}
変更前のコードのcreateElementメソッドは、
「要素を親要素へ追加する処理」
今回の例ならどちらでもあまり問題はないのですが、
考察2:createElementメソッドはユーティリティメソッドにしないの?
ユーティリティメソッド
Element elem =
DomUtils.createElement(doc, "id",div.getId());