引越し作業を行っていたので、今回は途中からの参加でした。雨でずぶ濡れの状態で会場に入ったときにはTransaction ScriptとDomain Modelは既に終了していました。Domain Modelなどはかなり議論が盛り上がったらしいのですが…残念です。ということで、メモはTable Moduleからです。
Table Module (発表 id:afukuiさん)
自分の理解
一つのインスタンスでテーブルの全ての行に関するビジネスロジックを担当する。基本的には1テーブル1クラスだが、行に関するアイデンティティを持たない。つまりDomain Modelのように1行1アイデンティティとはならない。データベースの構造が複雑でDomain Modelへのマッピングが難しい場合などに効果を発揮し、また既にデータベースがある場合に親和性が高い。要するにデータベースセントリックなアプローチ。
主にRecord Setパターンと組み合わせられる。また、Table Data Gatewayパターンと組み合わせて使用する方法のアドバンテージとディスアドバンテージ(p127,128)も記述されている。
pro
- テストはその場でテーブルにデータを入れることで簡単にできる → 意外に良いテススタビリティ
- 物理テーブルの詳細には依存していない → カラムの追加等からは実はそんなにダメージを受けない
id:afukuiさんのサンプルコード & デモ
MSのDB系技術の紹介でした。説明が上手いなぁ。ポトペタっぽい感じで効率良く開発できそうなイメージ。Delphiに近いらしいです。
MS系のライブラリは、割り切りかたが上手いというか、80%を満たすための取捨選択が上手いなと感じます。
Table Moduleのまとめ
Service Layer (発表 id:ogijunさん)
自分の理解
application logicとdomain logicを分離するか否かでデザインが分かれる。
この問題により、実装には二つのバリエーションができる。
- domain facade
- thin facadeをDomain Modelの上に敷くだけ。facade自身はビジネスロジックを実装せず、Domain Modelが全てのビジネスロジック(application logic + domain logic)を実装する。
- operation script
- application logicを実装するthicker classesの層をDomain Modelの上に配置する。domain logicはDomain Modelに任せ、application logicはoperation script(例えば"Service"で終わる論理的な単位で区切られたクラス群)が担う。
PofEAA本に書いてあったのはEJB2.0のLocal InterfaceのStateless Session Beanでoperation script型のService Layerを作成し、POJOで構成されているDomain Modelにdelegateする方法。若干賞味期限切れ。
Service Layer PatternとSession Facade Patternの違いは視点。Session FacadeはEJBのリモート問題を克服するためのデザインパターン。Service Layerはduplicationを避けreusabilityを上げるためのアーキテクチャパターン。
会場で出た意見
- application logicはワークフローともとらえられる
- Service Layerにはトランザクション境界としての意味もある
- publishしたものを明示的に示すレイヤは便利かもしれない。というか、みんなやっていることではないのかという意見が見られました。
『.NETエンタープライズWebアプリケーション開発技術大全 Vol.5 トランザクション 設計編』第3部 複雑なトランザクション制御のサマリ (発表: WRさん)
いつもながら、WRさんのバッチ設計の話はわくわくします。
サーガ
要するに逆トランザクションのあるバッチのことか? → 違う(補償トランザクション)
- 出自は交通機関の予約システム
- 赤伝
さらにいえば、補償トランザクションがなくても、ショートバッチの連続をサーガと言うらしい。
サーガを前提にすることは設計に影響を及ぼすということ(「意味的に打ち消す」とは何か?)
オンライン型バッチとロック
- 裏でOLTPが走っているので、ロックが競合する可能性を考える必要がある
- サーバカーソルを気軽に使ってはならない
- セット指向で行こう
バッチを走らせるホストを別マシンにするか同じマシンにするか
CPU負荷がどのくらいかで決めるといい
- 夜間バッチは同じマシン
- オンラインバッチは違うマシン?