「ドメインロジックと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プロジェクトとして作成するのがお勧めです。

セットアップ

  1. PostgreSQLサーバを用意、"martins"データベースを作成する。
  2. /db/create_tables.sqlを流し、/db/load_data.sqlを流す。
  3. user.User.Mainを実行する。↓のようになるはず。
[200803]
[200803]
[200803]

構成

  • package user : API利用側を想定。UserとDBコネクションの定義。
  • package transactionscript : トランザクションスクリプトパターンの例
  • package domainlogic : ドメインロジックパターンの例
  • package sql : リッチなSQLを使った例
  • package etc : Monthクラスの定義。

感想

  • JavaRubyに比べて生産性が悪いとは言えない。案外すんなり書けたよ!
    • けど、JDBCは使いづらい。
      • public T get(String columnLabel)があればいーんだけどねぇ。
      • SQLExceptionの扱いが面倒。サーバとのコネクション確立以外、ほとんどの場合はプログラムミスレベルの話だし。一括で「SQLException」として扱うのもアレだよなぁ。
  • DB関係のオブジェクトはclose()してないです。
    • だって、原本でもそうだし…。
    • ってか、TransactionScrpitパターンだと、Statementはいつclose()するべきか、タイミングがわかりません><
      • その点、DomainLogicパターンはMapperで閉じてるので、close()は簡単。
  • リッチなSQLの例で、原本のRubyコードには「customerIDを受け取って、customer.nameに対してマッチしてる」っていうバグ微妙な罠があります。
  • 全体的にConstructor InjectionなDIを意識したりしてるけど、こんな感じでいいんだろかね。
  • DomainLogicの例は、積極的に内部クラス化。ドメイン領域の管理には、内部クラスが直感的に使える。Javaのpackageは、領域管理としては貧弱な気がしてなりません。

中身の話はあとで書く。