
ドメイン層をシンプルに作るためのO-Rマッピング
2007/9/13
■インピーダンス・ミスマッチングとは?
- - PR -
オブジェクト指向で設計を行った場合に一番難しいことは、ドメイン層とパーシステンス層の設計です。
オブジェクト指向分析・設計では、上流工程で分析・設計したモデルの構造(概念モデル)において、継承やポリモーフィズムなどの抽象化を駆使し、できるだけ本質を見極めたシンプルなモデル構造を構築することにより、拡張性・保守性を実現します。そのため、ビジネスロジックの保守性・拡張性を考えた場合、概念モデルを崩すことなく忠実に実現できるのが理想的です。
一方、データベースの設計では、一般的にリレーショナルデータベースが利用され、データモデリングで論理データベース構造を設計していきます。論理データベース構造は正規化・非正規化、導出項目の設定などデータをいかに整合性を取りながら効率的に利用するかを考える必要があります。
しかしながら、リレーショナルデータベースでは、データを永続化できますが操作をデータにカプセル化して保持することはできません。また、継承やポリモーフィズムを実現することもできません。
このような違いがあるため、概念モデル構造と論理データベース構造は異なる場合があり、これをインピーダンス・ミスマッチといいます(本来は、電気工学での用語です)。
![]() |
| 図1 インピーダンス・ミスマッチ |
■ドメイン層とパーシステンス層の役割
インピーダンス・ミスマッチは、ドメイン層とパーシステンス層の間で起こります。パーシステンス層はドメイン層のエンティティオブジェクト内のデータに、データベースのデータを提供するとともに同期を取る役割があります。
インピーダンス・ミスマッチが存在する場合の、ドメイン層とパーシステンス層の役割について考えてみましょう。
概念モデル構造はドメイン層に作り上げられていきます。ドメイン層を構成するクラスのオブジェクトは、データやビジネスロジックを持ち、継承やポリモーフィズム、またクラス間の関連などにより具体化しています。
このようなドメイン層のクラスを基に、オブジェクトの構造を作り上げることが、ドメイン層とエンティティ層の役割です。
ドメイン層では、例えば会員番号や商品番号などの情報を基に、サービスから要求されているビジネスロジックを実行するために必要なオブジェクトの構造を生成し、ビジネスロジックを実行します。
エンティティ層は、ドメイン層のクラスにデータを提供します。このときできるだけドメイン層にはパーシステンス層を意識させないようにすることが理想的です。
![]() |
| 図2 O-Rマッピングの役割 (クリックすると拡大) |
ドメイン層とパーシステンス層には、背後に存在する役割としてインピーダンス・ミスマッチを解決するために、ドメインマネージャやパーシステンスマネージャが存在します。
O-Rマッピングにおいては、生成したオブジェクトをプールする仕組みを利用することがあります。オブジェクトプールを利用することは、データベースとの同期を取る仕組みが難しいですが、オブジェクトの一意性を保ちながら、ドメインの構造と論理テーブル構造のマッピングを取るには有効な仕組みになります。
サービス層は、必要なビジネスロジックを利用するためにドメイン層のドメインマネージャにエンティティオブジェクトの生成を依頼します(図2-1)。
ドメインマネージャはエンティティクラスの構造を基にエンティティオブジェクトの構造を生成します(図2-2)。
このときパーシステンスマネージャは、ドメインマネージャが必要とするオブジェクトをオブジェクトプールに存在するか確認し(図2-3)、存在しなければデータベースから関連するテーブルにアクセスし(図2-4)オブジェクトを生成します(図2-5)。そして、操作を実行します(図2-6)。また、オブジェクトを更新した場合には、オブジェクトプールと論理テーブルのデータの整合性を保つために同期を行います。
このようなドメインマネージャとパーシステンスマネージャによりO-Rマッピングを実現します。そして、インピーダンス・ミスマッチが大きいほど難しい仕組みを実現しなければなりませんが、複雑な概念モデルをオブジェクト指向に基づいて、忠実に実装することが可能になります。
それでは、前回までにお話ししたドメイン層とパーシステンス層のパターンでどのようにO-Rマッピングを実現していくのでしょうか。ここではそれぞれの層の組み合わせで考えていきます。
| Page1 インピーダンス・ミスマッチングとは? |
|
| Page2 ドメイン層とパーシステンス層の組み合わせ |
保守性・拡張性に優れたシステムを作る バックナンバー 連載インデックスへ»
- 第1回 ソフトウェアにおける保守性と拡張性の定義
- 第2回 オブジェクト指向で実現できる保守性・拡張性
- 第3回 変更に耐えるシステム構造とモデルの関係(上)
- 第4回 変更に耐えるシステム構造とモデルの関係(下)
- 第5回 コンポーネント化でクラスをすっきり整理
- 第6回 使いやすくて、変化に強いコンポーネント
- 第7回 階層アーキテクチャの利点は、複雑さの減少
- 第8回 ドメイン層に最適なアーキテクチャを考える
- 第9回 「データの永続性」に配慮した設計
- 第10回 ドメイン層をシンプルに作るためのO-Rマッピング
- 第11回 キミの設計に「トレーサビリティ」はあるか
- 最終回 システム開発はなぜ楽にならないか?
ホワイトペーパー(TechTargetジャパン)
|
|



