パーフェクト Ruby on Rails第11章サービスオブジェクトを題材に、イミュータブルデータモデリングについてトーク。
-
まず3つの"サービス"について整理
- レイヤードアーキテクチャでの独立したレイヤーとしてのサービス。ユースケースに近い。トランザクションスクリプト的。
- ドメインサービス。エンティティや値オブジェクトとして表現するのが不自然なドメインオブジェクトの表現。
- 分散システムにおける分散ノードの提供する責務。マイクロサービスのサービス。
-
Dependency injection is not a virtue
- テストのためだけの依存性注入、ユニットテスト偏重に対して異を唱えたDHHの記事。
-
イミュータブルデータモデリング
- 川島さんのスライド, Scrapbox
- データベース設計の流派の一つ。エンタープライズ系の設計の流れを組む。アップデート、デリートをしない。
- データは意思を持たない事実の積み重ねで、情報は意思を持ってデータから特定の視点で取り出したもの。取り出したい情報は時間的にあるいは人によって変わる。アップデートやデリートでは事実が失われてしまう。情報を取り出せるようにデータを変えずに残しておく。
- マスターとトランザクションではなく、イベントとリソースとして捉える。ある1点での活動はイベント、そうでないものはリソース。
- アップデートとデリートが出来ない世界で実装を考えるとイベントが見えてくる。
- イミュータブルデータモデルで論理設計して、物理設計でリソースにする妥協。理想主義で論理設計。現実主義で物理設計。
-
口座間の送金の例
- サービスとして表現するとRailsでは不自然さが残る。イベントとして表現するとRailsのActiveRecordにでき、Railsのレールに乗れる。
- 例: 送金というイベント
- データモデリングをうまくやればCRUDぐらいでできるという考え