ひがやすを技術ブログ

電通国際情報サービスのプログラマ

脱DTO

SAStrutsは、1ユースケースで1アクション。基本的には、Serviceクラスもなければ、DTOもありません。例えば、従業員の一覧に部署名も出力するには次のようになります。


<c:forEach var="e" items="${empItems}">
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</c:forEach>

@Result(name = "list", path="/employee/list.jsp")
public class EmployeeAction {

public List empItems;

public JdbcManager jdbcManager;

@Execute(validator = false)
public String execute() {
empItems = jdbcManager
.from(Employee.class)
.leftOuterJoin("department")
.getResultList();
return "list";
}
}

当初は、ビジネスロジックは、Serviceクラスに任せたほうがいいと思っていたのですが、実際にやってみると、JdbcManagerを呼び出すだけなので、Actionに直接書いて十分だと思うようになりました。
これまでのSeasar2のプログラミングのスタイルと最も違うのは、DTOを使わないところでしょう。

これまで、Seasar2では、DTOを多用していました。もっとも大きな理由は、S2Daoを生かすには、DTOを使ったほうが都合が良かったからです。

しかし、S2JDBCがでてきて、ネストした関連もlazy loadingだとかうざったいことを考えずに利用できるようになったので、今後は、Viewで直接エンティティをあつかってもよいかなと思っています。

Hibernateだとかを使うときと同じやり方ですが、S2JDBCの場合、どんなネストした結合もLazy Loadingなしで取得できるので、OpenSessionInViewだとか変則的なことをする必要もありません。
こんなことを書くと、ころころ意見を変えやがって信頼ならんという人が、必ずでてくると思いますが、まぁしょうがいないですね。

私は、使える技術の中で一番失敗しないパターンをいつも考えているので、使える技術が増えれば、その使える技術をより生かすパターンを考えるべきだと思っています。