ひがやすを技術ブログ

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

ドメインモデルの長所と短所

ドメインモデルをここでは

業務固有の重要なオブジェクトとそのオブジェクト間の関係をモデル化したもの。

と定義して話を進めます。ドメインオブジェクトは、POJOとして、データアクセスロジックからは切り離されているという前提です。
ドメインモデルは、オブジェクト指向設計のキーとなる考え方で、次のような長所があると私は考えています。

  • ロジックは、SQLではなく、ドメインオブジェクトにおかれるので、修正するときに、修正かしょを探しやすい。
    • 2chによるとロジックをSQLにおくようなリッチなSQLを使う場合もあるらしい。
    • リッチなSQLは、「なにやっとるんじゃこれは」というようなものもあったりするが、リッチなSQLを使わなければそのような心配はない。
  • ロジックが重複することが比較的少ない。



短所としては、

  • 設計が難しい。

これは、ドメインにおけるパターンが、普及しない限り難しいと思います。かといって、アナリシスパターンみたいなものも、また違う気がします。

  • プレゼンテーション層で扱うのが難しい。

プレゼンテーション層で扱う(欲しい)データの形式は、フラットな構造か、フラットな構造の配列であることがほとんどです。また、もともとのデータをいろいろ加工して表示することもあります。それに対し、ドメインオブジェクトの構造は複雑です。この両者のギャップを埋めるのが、ViewHelperですが、このViewHelper結構作るのにコストがかかります。
後、あまり触れられていない問題ですが、ViewHelperを誰が作るのかです。もちろん、プレゼンテーション層でしょって思われるかもしれません。
しかし、Hibernateを使って、ドメインモデルを構築したとしましょう。lazy-loadingを使っていた場合、ViewHelperがドメインオブジェクトのメソッドを呼び出したときに、SQL文が発行される可能性があります。
これは、もちろん望ましくありません。OpenSessionInViewを使うことも望ましくありません。層で役割を分けるという考えと矛盾しています。プレゼンテーション層では、少しでも例外が起きそうなことは避けるべきです。プレゼンテーション層に渡すデータは、完全にコネクションからは、切り離されている必要があります。
こう考えていくと、プレゼンテーション層に渡すデータは、プレゼンテーション層で扱いやすい形式のDTOにする。DTOドメインオブジェクトの相互変換をするのもコストがかかるので、データアクセス層で、最適化されたSQLを発行して直接DTOマッピングする方が、パフォーマンスも良く、コストもかからないと思うわけです。
もちろん、この方法も最適解ではなく、SQLにロジックが入り込むというリスクを犯しています。

ToDo

  • Seasar2.1
    • request, response, sessionの自動バインディング 終了 16:47
    • instance属性request対応 終了 19:30
    • instance属性session対応 終了 19:40
    • S2ContainerFilter 終了 21:30
    • getter injection
    • metaタグ

getter injection, metaタグは、まだ未実装ですが、もう、S2JSFの開発には入れるので、S2JSFの開発をスタートさせます。最初のバージョンは、未実装の機能が結構残りますが、雰囲気はつかめると思います。