Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
トランザクションスクリプトはどこから来たのか トランザクションスクリプトは何者か トランザクションスクリプトはどこへ行くのか 2022/06/14 設計ナイト2022 末並 晃 @a_suenami
Slide 2
Slide 2 text
タイトルは某絵画のパロディですが あまり深い意味はありません。(念のため)
Slide 3
Slide 3 text
自己紹介 ● 末並 晃 @a_suenami ● 生息している界隈: DDDとか、TDDとか、RDBとか ● お仕事で使ってる技術スタック: Rails, React, Java ○ 最近は terraform おじさんです ● 好きな RDBMS: PostgreSQL ● 好きな制約: チェック制約 ● 好きな焼肉の部位: ハラミ ● 好きな(ry
Slide 4
Slide 4 text
インターネット上での立場
Slide 5
Slide 5 text
インターネット上での立場 ひたすら焼肉をタカられるという エンターテイメントをインターネットに提供し ています。 (焼肉を奢るとは言ってない)
Slide 6
Slide 6 text
今日話すことになったきっかけ
Slide 7
Slide 7 text
今日話すこと ● トランザクションスクリプトはどこから来たのか ○ どういう文脈で語られるようになったのか ○ そもそも誰が言い出したのか ● トランザクションスクリプトは何者か ○ どんなものがトランザクションスクリプトと言えるのか ○ どんなものはトランザクションスクリプトと言え“ない”のか ● トランザクションスクリプトはどこへ行くのか ○ トランザクションスクリプトの問題はどのように改善できるのか
Slide 8
Slide 8 text
トランザクションスクリプトはどこから来たのか ● トランザクションスクリプトは『エンタープライズアプリケーション アーキテクチャパターン』(PoEAA) から来ました ○ 調べてみたけどこれ以前の記述は見つからなかったので、た ぶん PoEAA が初出 ● ドメインロジックに関するパターンのひとつとして挙げられている ○ トランザクションスクリプトの他には、テーブルモジュールとドメ インモデルがある
Slide 9
Slide 9 text
トランザクションスクリプトの利点 ● ほとんどの開発者が理解できるシンプルな手続きモデルである ● シンプルなデータソースレイヤーと共にうまく機能する ○ 行データゲートウェイ ○ テーブルデータゲートウェイ ● トランザクションの境界をどのように設定するかが明らかである ○ 入力を受け取り出力を返す一連の手続きがトランザクションを 開くことから始め、閉じることで終了する
Slide 10
Slide 10 text
トランザクションスクリプトは何者か “プレゼンテーションからの単一のリクエストを扱う各手続きによって ビジネスロジックを構造化する”
Slide 11
Slide 11 text
トランザクションスクリプトは何者か “単一のインラインプロシージャのコードである必要はない。 一部はサブルーチンに分離され、これらのサブルーチンは 異なるトランザクションスクリプト間で共有することができる。”
Slide 12
Slide 12 text
ドメインロジックに関するその他のパターン “振る舞いとデータの両方を取り込んだ ドメインのオブジェクトモデル” “データベースのテーブルまたはビューの すべての行のビジネスロジックを 処理する単一のインスタンス”
Slide 13
Slide 13 text
トランザクションスクリプトとは ● トランザクションスクリプトであるかそうでないかは、オブジェクトモ デルであるかどうか…か? ○ ドメインモデルはレコード(もしくはそれに準ずる概念)に対す る、テーブルモジュールはその集合(≒テーブル)に対する データ抽象と考えることができる ● 何故オブジェクトモデルか? ○ カプセル化・モジュール化 ○ ポリモーフィズム(多態性)
Slide 14
Slide 14 text
トランザクションスクリプトはどこへ行くのか
Slide 15
Slide 15 text
の前に
Slide 16
Slide 16 text
そもそも何故トランザクションスクリプトで 複雑なドメインロジックを実装するのが難しいのか
Slide 17
Slide 17 text
トランザクションスクリプトと複雑度 ● PoEAA はオブジェクトモデルのほうが優れている前提で論が展 開されている気がする ○ 単に関心の分離が必要ということであればサブルーチンでよ いはず ○ 現に、ある一定のレベルまではサブルーチンへの分割によっ て解決可能だと言っている ● 一定以上複雑になった場合には、やはりカプセル化や多態性(ポ リモーフィズム)を実現する仕組みが必要ということだろうか?
Slide 18
Slide 18 text
ユースケースと状態のもつれ この状態がよく言われる複雑化したトランザクションスクリプト
Slide 19
Slide 19 text
サブルーチンによる構造化 共通の手続きをまとめ、ロジックの重複を緩和した状態
Slide 20
Slide 20 text
サブルーチン(を束ねたクラス)の循環依存 サブルーチンをstaticメソッドにして それっぽいクラスにまとめた場合に起こりがち
Slide 21
Slide 21 text
オブジェクトモデルによる(?)データ抽象 ドメインモデルやテーブルモジュールはこれに近い
Slide 22
Slide 22 text
サービスレイヤーの導入 サービスレイヤーを導入し 共通の手続きはオブジェクトモデルとは別途共通化
Slide 23
Slide 23 text
ドメインロジックとアプリケーションロジック “私を含む多くの設計者は、「ビジネスロジック」を2種類に分けるのが好きだ。 「ドメインロジック」は純粋に問題領域に関係するものであり「アプリケーションロ ジック」はアプリケーションの責任に関係するものである。”
Slide 24
Slide 24 text
DCI 手続き・アルゴリズムの境界とデータの境界は異なり、伝統的なオブジェクト指 向ではそれを共通の機構で実現しようとしている(という問題提起) https://digitalsoul.hatenadiary.org/entry/20100131/1264925022
Slide 25
Slide 25 text
まとめ ● トランザクションスクリプトはどこへ行くのか ○ 手続きを手続きのまま構造化する ○ オブジェクトモデルを用いてデータ抽象や多態を用いる ● 手続きとデータの境界は異なることがある ○ ビジネスロジックをドメインロジックとアプリケーションロジック に分け、前者にデータ抽象を、後者に手続きの構造化を ○ DCI ではロールという概念を導入して、オブジェクト間のコラボ レーションを実現する
Slide 26
Slide 26 text
ご清聴ありがとうございました。