ひがやすを技術ブログ

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

Viewでドメインモデルを直接扱ってはいけない

http://d.hatena.ne.jp/bakock/20050824#p1

画面にはドメインオブジェクトを渡す派は、本来のOOP的な考えにマッチしてるように思える。ドメインのモデルをどう整形して表示してるか、ソースに直接書いてあって、トレーサビリティが高い。凝集度が高いといってもいいかもしれない。

Viewでドメインモデルを直接扱うというのは、Viewにドメインモデルの知識(ある意味ドメインロジック)があることになり凝集度は低くなります。Viewは本来やらなければいけないプレゼンテーションの機能以外にドメインの知識ももっているためです。
それでは、Dxoを使ってプレゼンテーションモデルとドメインモデルの変更を行うようにしたとしましょう。Viewはプレゼンテーションに徹していて凝集度は高くなります。Dxoドメインモデルの知識を持つことになりますが、Dxoは、プレゼンテーションモデルとドメインモデルの知識を持って変換することが本来の役割ですから、Dxoの凝集度も高くなります。
Viewでドメインモデルを直接扱うのは、凝集度が下がり悪い設計になるということです。もちろんOOP的ではないと思います。

プログラミングの方法から見ると、画面にはドメインオブジェクトを渡す派のほうがpull的というか、画面がデータを欲しがるときにとってくるという感じ。プレゼンテーションモデルをビジネスロジック層で変換する派は、バッチ処理的にプレゼンテーションモデルを作って「おら、表示しろ」って感じ。前者の方がOOPチックでスマート、後者のほうは汎用機出身の人なんかにはわかりやすいかも。

プログラミングの方法から見ても、プレゼンテーションモデルを使えば、Viewは常に必要最小限の事を知っていれば良いので、良い設計ということがいえるのではないかと思います。
ドメインモデルは、プレゼンテーションモデルに変換してからViewで使うべきだということです。ドメインモデルとプレゼンテーションモデルが一致していれば、ドメインモデルを直接使ってももちろん問題ありませんが、それは非常にまれなケースだと思います。例えば、汎用コードテーブルなどを使ってコードと名称を管理するのは良くあるケースだと思いますが、これだけでも既にドメインモデルを直接使うことはできなくなります。