理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

PoEAA: Metadata Mapping

Metadata Mapping は、オブジェクトとテーブルデータをマッピングさせるデザインパターンです。 データベース上のテーブルをメモリ上のオブジェクトに変換するコード、また、その逆変換のコードは、テーブル毎に似ていて非なるものなので、同じようなコードが大量生産されがちです。このパターンは、それを解決するためのものになります。

Patterns of Enterprise Application Architecture (Addison-Wesley Signature Series (Fowler))

Patterns of Enterprise Application Architecture (Addison-Wesley Signature Series (Fowler))

方針

Metadata Mapping には大きく分けて 2 つのパターンがあります。

  1. コード生成
  2. リフレクション

1. コード生成

コード生成はその名の通り、メタデータを入力にして、DB 上のテーブルとのマッピングを行うクラスを自動生成する方法です。この方法を採る場合、自動生成はビルドプロセスに組込まれ、かつ、その生成コードの手動編集は禁止されるべきです。 スキーマが変更になった場合、自動生成のやり直しと、生成されたコードの再デプロイが必要になります。

2. リフレクション

リフレクションはその名の通り、リフレクションを使ってマッピングを行う方法ですね。一般にマッピングの定義はファイルに記述され、それを読み込んだ上でリフレクションでマッピングの実装が行われます。 スキーマが変更になった場合は、設定ファイルの置き換えで対応が可能になります。

どのパターンにも言えることですが、Metadata Mapping を使用することにより必ずしも楽になるとは限らないし、性能的なボトルネックを生じることもあります。もちろん、実装が楽になったり、Metadata Mapping を使わないときと比べて性能面で遜色のない場合もあります。 このあたりは、都度計測していくしかないということです。