PoEAA ch18 Record Set

PoEAAデザインパターン勉強メモ

出典: 


Record Set

An in-memory representation of tabular data.

  • (本書執筆時点で)20年来、データベースのデータ表現は表形式の関係データ

    • 大小さまざまなRDBMSベンダによるサポート
    • 標準化されたクエリ言語(SQL)
    • 目に入るかぎりほぼすべての開発でRDBが使われるように
  • 関係データ前提のUIツールの隆盛
  • ほぼプログラミングすることなくデータ表示・操作できる

    • バカ簡単
    • 簡単すぎて、ドメインロジックを書く場所が提供されていない

      • ストアドプロシージャとしてデータソース層に入ってしまう
      • UIと密結合してSmart UIになってしまう
  • Record Setの出番

    • SQLの結果とまったく同じ見た目の、オンメモリなデータ構造
    • システムの他のパーツ(Table Moduleとか)により生成・操作される

How It Works

  • 普通自前では作らない
  • プラットフォームにより提供される

    • ADO.NET
    • JDBC 2.0
  • 重要な要素

    • Record SetはDBへのクエリ結果とまったく同じように見えるデータ構造である

      • 典型的な2層構造にそのまま適用できる

        • クエリでデータ取り出す
        • 表形式データ対応のUIに突っ込む
    • 簡単に構築できる

      • mapのlistか何かから自分で
      • DBクエリ結果から
    • ドメインロジックコードで簡単に操作できる

      • Table Moduleとか
  • 自前で作ることもできる

    • 表形式データ対応のUIも提供されておらず、自前で作らねばならないことがある
    • mapのlistがよい例

      • 【補】Laravelの、stdClassのCollectionもこの類
  • Record Setとデータソースを切り離すことができることは有用である

    • DBコネクションのことを気にせず、ネットワークを超えて伝送できる

      • 簡単に(デ)シリアライズできるなら、Data Transfer Objectにもなる
  • データソースと切り離す場合、UPDATEはどうするの

    • Record SetUnit of Workとしての性質も具有させるプラットフォームも増えている

      • 変更をまとめて、1つのトランザクションとしてcommitする
    • 典型的にはOptimistic Offline Lockが用いられる

      • コンフリクトがなければ変更を書き込む

Explicit Interface

  • ほとんどの実装がimplicit interface

    • aReservation['passenger']とかそういう感じ
  • explicit interfaceとは

    • aReservation.passengerとかそういう感じ
  • 功罪
implicit interface explicit interface
メリット 汎用。あらゆる種類のレコードに対応 特定の種類のレコードに特化
デメリット 属性の取得方法がわからない・静的チェックの恩恵がない 専用のクラスを作る必要がある
  • Implicitはよくないよ

    • 乗客を取得するキーが’passenger’なのか’guest’なのか、はたまた’flyer’なのかわからない

      • コードベースをさまよい歩くことになる
      • Explicitなら、定義を見れば一撃でわかる
  • 静的型付き言語だとさらに良くない

    • キャスト必要
((Person)aReservation["passenger"]).lastName
  • explicitなら型情報持てるので良い
  • implicit interfaceであるとして、ふつう有効なカラム名情報を持っているのが救い

    • そうでないとしても、Record Setの構築時に問い合わせたSQLにカラム名が含まれるので、
      プロパティ名を得るのはそう難しいことではない
  • でもexplicit interface使ったほうが親切だよ

    • ADO.NETでは強く型付けされたdata setsを提供する

      • 関連も表現できる
      • XSD data set definitoinからクラス自動生成
  • (執筆時点で)implicit interfaceのほうが一般的なので、本書の他の部分でRecord Setが登場するときはそれにならった
  • ADO.NETで製品コードを書くなら型付きの(=explicit interfaceな)データを使え
  • ADO.NET以外の環境でも、コード自動生成を使ってexplicit interfaceなRecord Set作れ

When to Use It

  • プラットフォームがRecord Setが提供しており、
    Record Setの操作を一般的なデータ操作方法として提供している場合
  • その場合はDomain LayerにはTable Moduleを使え

    • 派生属性の計算とかをTable Moduleに書く
  • 余談

    • Record Setが有用なのはRDB+SQLに代わるものがこれまでなかったから
    • 実のところXML+XPathとかでもよい

      • この組み合わせを前提としたツールが出てくるかもね
    • Record Setは、もっと汎化したパターンの1特化にすぎないのかもしれない

      • Generic Data Structure
      • その日が来るまでおあずけ

英語

  • exacerbate

    • 悪化させる
  • saving grace

    • 悪い中で神から与えられた救い