PoEAA ch18 Record Set
Record Set
An in-memory representation of tabular data.
- (本書執筆時点で)20年来、データベースのデータ表現は表形式の関係データ
- 関係データ前提のUIツールの隆盛
- ほぼプログラミングすることなくデータ表示・操作できる
- バカ簡単
- 簡単すぎて、ドメインロジックを書く場所が提供されていない
- ストアドプロシージャとしてデータソース層に入ってしまう
- UIと密結合してSmart UIになってしまう
- Record Setの出番
- SQLの結果とまったく同じ見た目の、オンメモリなデータ構造
- システムの他のパーツ(Table Moduleとか)により生成・操作される
How It Works
- 普通自前では作らない
- プラットフォームにより提供される
- 重要な要素
- Record SetはDBへのクエリ結果とまったく同じように見えるデータ構造である
- 典型的な2層構造にそのまま適用できる
- クエリでデータ取り出す
- 表形式データ対応のUIに突っ込む
- 典型的な2層構造にそのまま適用できる
- 簡単に構築できる
- mapのlistか何かから自分で
- DBクエリ結果から
- ドメインロジックコードで簡単に操作できる
- Table Moduleとか
- Record SetはDBへのクエリ結果とまったく同じように見えるデータ構造である
- 自前で作ることもできる
- 表形式データ対応のUIも提供されておらず、自前で作らねばならないことがある
- mapのlistがよい例
- 【補】Laravelの、stdClassのCollectionもこの類
- Record Setとデータソースを切り離すことができることは有用である
- DBコネクションのことを気にせず、ネットワークを超えて伝送できる
- 簡単に(デ)シリアライズできるなら、Data Transfer Objectにもなる
- DBコネクションのことを気にせず、ネットワークを超えて伝送できる
- データソースと切り離す場合、UPDATEはどうするの
- Record SetにUnit of Workとしての性質も具有させるプラットフォームも増えている
- 変更をまとめて、1つのトランザクションとしてcommitする
- 典型的にはOptimistic Offline Lockが用いられる
- コンフリクトがなければ変更を書き込む
- Record SetにUnit of Workとしての性質も具有させるプラットフォームも増えている
Explicit Interface
- ほとんどの実装がimplicit interface
aReservation['passenger']
とかそういう感じ
- explicit interfaceとは
aReservation.passenger
とかそういう感じ
- 功罪
implicit interface | explicit interface | |
---|---|---|
メリット | 汎用。あらゆる種類のレコードに対応 | 特定の種類のレコードに特化 |
デメリット | 属性の取得方法がわからない・静的チェックの恩恵がない | 専用のクラスを作る必要がある |
- Implicitはよくないよ
- 乗客を取得するキーが'passenger'なのか'guest'なのか、はたまた'flyer'なのかわからない
- コードベースをさまよい歩くことになる
- Explicitなら、定義を見れば一撃でわかる
- 乗客を取得するキーが'passenger'なのか'guest'なのか、はたまた'flyer'なのかわからない
- 静的型付き言語だとさらに良くない
- キャスト必要
((Person)aReservation["passenger"]).lastName
- explicitなら型情報持てるので良い
- implicit interfaceであるとして、ふつう有効なカラム名情報を持っているのが救い
- でもexplicit interface使ったほうが親切だよ
- ADO.NETでは強く型付けされたdata setsを提供する
- 関連も表現できる
- XSD data set definitoinからクラス自動生成
- ADO.NETでは強く型付けされたdata setsを提供する
- (執筆時点で)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に書く
- 余談
英語
- exacerbate
- 悪化させる
- saving grace
- 悪い中で神から与えられた救い