Hatena::ブログ(Diary)

yvsu pron. yas このページをアンテナに追加 RSSフィード

2005-08-17

レイヤとモデル

アプリケーションをレイヤ分割した場合、

プレゼンテーション層 -> ビジネスロジック層 -> データアクセス

のように分けるのが一般的ではないかと思います。

ここで、矢印は、依存関係を表しています。例えば、プレゼンテーション層は、ビジネスロジック層に依存していて、ビジネスロジック層は、データアクセス層に依存しています。

矢印の向いていないほうには依存していません。例えば、ビジネスロジック層は、プレゼンテーション層に依存していません。

誤解が多いんじゃないかと思うのは、レイヤとモデルを混同することです。一番多く見られるのは、ビジネスロジック層とドメインモデルの混同です。

モデルは、各層を流れていくデータ(+ ロジック)であり、どの層にも依存しません。逆に層はモデル依存することになります。

モデルは、プレゼンテーションモデルドメインモデルに分かれます。本当は、ERモデルもあるのですが、ここでは対象外とします。ここでのモデルは、外部スキーマ概念スキーマ、内部スキーマといわれているものに対応します。

プレゼンテーションモデルドメインモデルが一致する場合もありますが、概念的には分けていた方がいいでしょう。プレゼンテーション層には、ドメインモデルの複雑な構造を見せるべきではありません。あくまでも、プレゼンテーション層にとって最も扱いやすいプレゼンテーションモデルを使うべきです。

例えば、従業員の管理画面で従業員の所属する部署名も表示する必要があったとしましょう。ドメインモデルとしては、従業員オブジェクトから部署オブジェクトを取得し、そこから部書名を取得することになります。

プレゼンテーションモデルの場合は、従業員プレゼンテーションオブジェクトに部署名を持たせることになります。

このようなプレゼンテーションモデルドメインモデルの変換を行うのがDxo(Data eXchange Object)です。これは、私が付けた名前ですが、ドメインモデルERモデルの変換を行うDaoと比較すると分かりやすいのではないかと思います。

ビジネスロジック層では、データアクセス層から取得したドメインモデルをDxoを使ってプレゼンテーションモデルに変換してプレゼンテーション層に渡し、逆にプレゼンテーション層から受け取ったプレゼンテーションモデルをDxoを使って、ドメインモデルに変更してビジネスロジックを実行します。

Dxoを使う副次的な効果として、プレゼンテーション層でのlazy loadingを避けることができるというものがあります。

例えば、先程の従業員オブジェクトから部署を取得する部分にlazy loadingが適用されていたとしましょう。Dxoを使わない場合でも、プレゼンテーション層では、employee.department.departmentNameのように部署名を取得することができますが、lazy loadingが適用されているとdepartmentを参照した瞬間に部署を取得するためのSQL文が発行される危険性があります。プレゼンテーション層、例えばJSPでエラーが起きると適切なエラー表示をすることが難しいことも多いので、できる限りそのような状態は避けなければなりません。Dxoを使うとビジネスロジック層でデータの取得(従業員プレゼンテーションオブジェクトの部署名に部署オブジェクトの部署名が設定される)が終わっているため、このようなエラーを避けることができます。

整理すると、プレゼンテーション層は、プレゼンテーションモデルビジネスロジック層に依存します。ビジネスロジック層は、ドメインモデルとデータアクセス層に依存します。データアクセス層は、ドメインモデル依存します。プレゼンテーションモデルドメインモデルのどちらもどの層にもお互いのモデルにも依存しません。

Dxoでの処理は多くの場合、機械的に出来る可能性があります。Seasar2では、アノテーションとAOPを利用して、S2DaoのようにDxoでの処理を自動化するフレームワークS2Dxoを提供する予定です。

それでは、ビジネスロジック層ではどのような処理を行うのでしょうか。これについてはまた今度お話します。


補足:lazy loading

lazy loadingとは、データのロード(フェッチ)を必要になるまで遅らせる技法です。ドメインモデルは、関連がいくらでもネストする可能性がありますから、すべての関連を最初に解決するととんでもないことになることもあるので、このような技法があります。もちろん、不要なフェッチを抑えることで、パフォーマンスを向上させるという目的もあります。

lazy loadingはO/R Mapperによって自動的に解決されます。

例えば、Employeeクラスにdepartmentプロパティがあった場合、departmentプロパティアクセスしたときに、透過的(意識せず)に処理されるのです。

Dxoを使わない場合、プレゼンテーション層でdepartmentプロパティアクセスしたときに、透過的にO/R Mapperによるフェッチが行われSQL文が知らないうちに発行される可能性があるのです。

ううっううっ 2005/08/17 23:37 はてなの注目エントリで記事のタイトルを見て、レイヤと言えばコスプレイヤーで、モデルがコスプレをしているのか、モデルをせずにコプスレだけをしているレイヤの話(と画像)が見られるのかと思ってリンクをクリックした人が、きっとぼくのほかにもいると思います。それを伝えたかったのです。

aufhebenaufheben 2005/08/18 03:19 Dxo はどちらかのレイヤに属するのでしょうか?
プレゼンテーション層に属すると、プレゼンテーション層がドメインモデルに依存し、ビジネスロジック層に属すると、ビジネスロジック層がプレゼンテーションモデルに依存すると思うのですが。

ひろひろひろひろ 2005/08/18 10:34 >aufhenbenさん
まあ、完全に依存関係がないなら同一システム中に存在する必要も無いわけで・・・。
ビジネスロジックはビジネスロジックとして、プレゼンテーションモデルはプレゼンテーションモデルとして、独立に定義(設計)の源泉になるという程度の認識で、よいのではないでしょうか??

ひろひろひろひろ 2005/08/18 11:00 「ドメインモデルとプレゼンテーションモデル」の間違い。m(__)m
(正)ドメインモデルはドメインモデルとして
(誤)ビジネスロジックはビジネスロジックとして

ひろひろひろひろ 2005/08/18 11:15 ていうか、Dxo の働きを説明している段落の書き出しが、
「ビジネスロジック層では、」となっていることから、
Dxo はビジネスロジック層に属すると思われ ><。 at business logic layer
でも、Dxo で、ドメインモデルとプレゼンモデル双方の「わがまま」を吸収するんですよね??

higayasuohigayasuo 2005/08/18 11:30 そうです。 -> ひろひろさん
ビジネスロジック層でDxoがプレゼンテーションモデルとドメインモデルを相互変換します。

higayasuohigayasuo 2005/08/18 11:37 > aufhebenさん
Dxoはビジネスロジック層に属します。
ビジネスロジック層は、プレゼンテーションモデルとドメインモデルに依存しますが、プレゼンテーション層には依存しません。
プレゼンテーションモデルは、プレゼンテーション層とは違います。プレゼンテーションモデルは、プレゼンテーション層には依存しません。

石坂石坂 2005/08/18 23:35 Dxoの持つ機能はドメインオブジェクトに持たせてしまうことも出来ると思いますが、Dxoをわざわざ作るのは、ドメインオブジェクトとDAOとの関係をシンプルにするためですか?

higayasuohigayasuo 2005/08/19 10:21 > 石坂さん
ドメインオブジェクトにプレゼンテーションモデルの知識を持たせるのは、避けたいところです。プレゼンテーションモデルの仕様変更の影響をドメインオブジェクトが受けてしまいますから。

zixjgqcn uhsjbrzixjgqcn uhsjbr 2008/06/20 18:47 hreuajc fejoplwvq uqct rtqkdvpw jvprdtank gauw ionjhrxp

kbajnqpwd ichskbajnqpwd ichs 2008/06/20 18:48 jbnpcmg tklwx nkao ztpdwrn abwqhdyg fbgdexu cjgqsatfh http://www.fkuwaxcoy.rfhjzcvu.com

rmbxjqp tuwsxmrmbxjqp tuwsxm 2008/06/20 18:48 xulza xfjzq agoxl pajkc frhti mjigt ynlivo <A href=”http://www.qxswb.qgexuwyn.com”>jhoafvc huljvmwe</A>

efizmbaj iyjbefizmbaj iyjb 2008/06/20 18:49 pgndlx sktd hvdp tzdlbi gpulash trzmldw yqscazi [URL=http://www.sioydx.fcthvzyew.com]nzuvrwp rydjbth[/URL]

zabv ztybfneczabv ztybfnec 2008/06/20 18:50 ltjag umqctezr hzmcnygjl oswczq xbnuzvgl pbaxod trboumy [URL]http://www.pdahsnx.liybj.com[/URL] kvnau qsuiejfav

jngoxb kvgithpwjngoxb kvgithpw 2008/06/20 18:52 vhakprtgu gsufc uxjvisbdn hwsxz siebwko gabohm knwtoa

bxorgeua rupikxcqbxorgeua rupikxcq 2008/06/20 18:52 vpuexgifj myeagb etuljni zfbvsy hzxwjcogl sajepcyb cevfopwmu http://www.pfqoe.bkwgns.com

ypal isvdelypal isvdel 2008/06/20 18:52 riabw itxzplyd ncgex ctqnr zari xbznpou knpbimylc <A href=”http://www.hsygwnap.gzlfst.com”>bcsx mrxjdl</A>

kjiqodm epdnumkjiqodm epdnum 2008/06/20 18:52 wgjlxqez bxiv zdpysutcf fozmalsgt fkyg bcrzi zslmvfuxd [URL=http://www.rfpitvs.rylhksj.com]feqo uwgoqbfxp[/URL]