勉強日記

チラ裏

PoEAA ch13 Metadata Mapping

martinfowler.com


Metadata Mapping

Holds details of object-relational maping in metadata.

  • O/Rマッピングのコードのほとんどは、フィールドの対応づけ
    • DBのテーブルのフィールド
    • メモリ上のオブジェクトのフィールド
  • 退屈な繰り返しコードになる
  • 本パターンでは、フィールドの対応表を定義して汎用コードで処理を実行する
    • read
    • insert
    • update

How It Works

  • とるべき道は2つ
    • コード生成
      • メタデータを入力し、ソースコードを出力する
      • 手で書いたコードのように見える
        • ビルドプロセスに組み入れて、手で触られないことを保証する
        • VCS管理外におく
    • リフレクション
      • 【補】PHPでいうと__call()マジックメソッドがこれにあたる
  • 著者はふだんリフレクション否定派
  • だが、リフレクションはDBマッピングには好適
    • 柔軟性をいかんなく発揮できる
  • 比較
コード生成 リフレクション
柔軟性 劣る 優れる
マッピング定義 コンパイル 実行時
実行時速度 速い 遅い
デバッグ 厄介 厄介
  • リフレクションでは、実行中にDBマッピング定義を更新することができる
  • リフレクションの実行時速度は遅い
    • が、SQLのリモートコールに比較すれば大したことはない
    • 測定せよ
  • デバッグのしやすさについては、開発者の慣れにもよる
  • マッピング定義メタデータの置き場所?
    • 別ファイル
      • XMLとか
      • パース処理必要
    • ソースコード内に直書き
      • パース処理不要
      • 編集大変
    • DB自身に持たせる
  • メタデータの置き場所が実行時パフォーマンスに与える影響は大抵無視できる
    • コード生成
    • リフレクション
      • メタデータ読み込みは実行時だが、プログラム起動時一度だけ
  • メタデータの仕様をどれだけ作り込むか
    • スモールスタートがよい
    • 90%は単純なメタデータで事足りる
    • 一部のスペシャルケースだけoverrideするとよい

When to Use It

  • DBマッピングの労の多くを省ける
  • が、弱点も
  • 市販のO/Rマッパーも内部でMetadata Mappingを行っていたりする
  • 自前で作る場合はトレードオフを勘案せよ
    • DBマッピングコードを手書きする場合との比較
      • リフレクション方式の場合、パフォーマンスを実測する
  • Metadata Mappingの前段として、Layer Supertypeで処理を共通化せよ
    • 【補】Template Method Pattern
  • Metadata Mappingとリファクタリング
    • アプリケーションコードのリファクタリングの妨げになりうる
      • 自動リファクタリングツールで特に
        • コード生成
          • XML内のフィールドは拾ってくれない
          • 生成後のコードに対しては自動リファクタリングできるが、結局再生成で上書きされちゃう
        • リフレクション
          • 識別子置換漏れがあっても警告とか出ない
    • DBリファクタリングはやりやすくなる
      • Metadataがインタフェースの役割を担う
        • テーブルスキーマの変更はMetadataの変更で吸収でき、Domain Modelに跳ねない

コード例

  • クラス図