「ドメインロジックとSQL」のJava版サンプル
トランザクション・スクリプトとドメイン・モデル - @katzchang.contextsという記事で色々コメント頂いた&考えた結果、やっぱりよくわからんという結論になった。
ということでお勉強に、Martin Fowlerさんの「ドメインロジックとSQL」という記事で示されたRubyサンプルコードを、Javaで書き直してみました。できるだけ原本の雰囲気を残しつつ。
Google Code Archive - Long-term storage for Google Code Project Hosting.からどうぞ。
SVNのチェックアウトはこちらから⇒ http://martinsdomainlogicandsqlsample4j.googlecode.com/svn/trunk/ 。Subclipseを使って、eclipseプロジェクトとして作成するのがお勧めです。
セットアップ
- PostgreSQLサーバを用意、"martins"データベースを作成する。
- /db/create_tables.sqlを流し、/db/load_data.sqlを流す。
- user.User.Mainを実行する。↓のようになるはず。
[200803] [200803] [200803]
構成
感想
- JavaがRubyに比べて生産性が悪いとは言えない。案外すんなり書けたよ!
- けど、JDBCは使いづらい。
- public
T get(String columnLabel)があればいーんだけどねぇ。 - SQLExceptionの扱いが面倒。サーバとのコネクション確立以外、ほとんどの場合はプログラムミスレベルの話だし。一括で「SQLException」として扱うのもアレだよなぁ。
- public
- けど、JDBCは使いづらい。
- DB関係のオブジェクトはclose()してないです。
- だって、原本でもそうだし…。
- ってか、TransactionScrpitパターンだと、Statementはいつclose()するべきか、タイミングがわかりません><
- その点、DomainLogicパターンはMapperで閉じてるので、close()は簡単。
- リッチなSQLの例で、原本のRubyコードには「customerIDを受け取って、customer.nameに対してマッチしてる」っていう
バグ微妙な罠があります。 - 全体的にConstructor InjectionなDIを意識したりしてるけど、こんな感じでいいんだろかね。
- DomainLogicの例は、積極的に内部クラス化。ドメイン領域の管理には、内部クラスが直感的に使える。Javaのpackageは、領域管理としては貧弱な気がしてなりません。
中身の話はあとで書く。