エンタープライズアプリケーションアーキテクチャパターンを読んだ

お盆休みに[エンタープライズアプリケーションアーキテクチャパターン](https://speakerdeck.com/naoya/ji-shu-de-fu-zhai-toxiang-kihe-u?slide=65)を読んだのでメモ。

# ドメインロジックパターン

## ドメインロジックを構造化するには

### シンプルなロジックの場合

#### **トランザクションスクリプト**

+ ビジネスロジックを一連の手続きで構築して、その各手順でプレゼンテーションから１つの要求を処理する。

### 複雑なロジックの場合

#### **ドメインモデル**

+ 振る舞いとデータの両方を一体化させたドメインのオブジェクトモデル。

### ロジックの複雑さは普通で、レコードセットに関する優れたツールがある場合

#### **テーブルモジュール**

+ データベーステーブルかビューのすべての行に関するビジネスロジックを扱うシングルインスタンス。

## ドメインロジックに明確なAPIを提供するには

### **サービスレイヤ**

+ サービスのレイヤとアプリケーションの境界を定義する。サービスは利用できる操作セットを設定し、各操作に対するアプリケーションのレスポンスを調整するものである。

# データソースのアーキテクチュアに関するパターン

## データベースと相互作用を行うには

### トランザクションスクリプトを使用する場合

#### **行データゲートウェイ**

+ データソース内の１つのレコードに対してゲートウェイの役割を果たすオブジェクト。行ごとに１つのインスタンスが存在する。

### トランザクションスクリプトを使用し、プラットフォームがレコードセットを十分にサポートする場合

#### **テーブルデータゲートウェイ**

+ データベーステーブルに対してゲートウェイの役割を果たすオブジェクト。１つのインスタンスがテーブル内のすべての行を処理する。

### データベーステーブルに厳密に対応するドメインモデルがある場合

#### **アクティブレコード**

+ データベーステーブルまたはビューの行をラップし、データベースアクセスをカプセル化してデータにドメインロジックを追加するオブジェクト。

### 十分なドメインモデルがある場合

#### **データマッパー**

+ オブジェクト、データベース、およびマッパー自体の独立性を保ちつつ、オブジェクトとデータベース間でデータを移動するマッパーのレイヤ。

# オブジェクトリレーショナル振る舞いパターン

## 読み込んだり変更したオブジェクトを追跡するには

### **ユニットオブワーク**

+ ビジネストランザクションの影響を受けるオブジェクトのリストを保持しつつ、変更点の書き込みと並行性の問題の解決を調整する。

## メモリ上の異なる場所で、同じデータベースデータを更新しないようにするには

### **一意マッピング**

+ 読み込まれたすべてのオブジェクトを１つのマッピングに保存することで、各オブジェクトが確実に一度だけ読み込まれるようにする。オブジェクトを参照する場合には、マッピングを使って参照する。

## データベース全体をメモリに読み込むのを避けるには

### **レイジーロード**

+ 必要なすべてのデータは含まないが、その取得方法を知っているオブジェクト。

# オブジェクトリレーショナル構造パターン

## データベースレコードにドメインオブジェクトをリンクさせておくには

### **一意フィールド**

+ データベースIDフィールドをオブジェクトに保存することで、メモリ上のオブジェクトとデータベース行との一意性を維持する。

## オブジェクトの関連をデータベースに格納するには

### オブジェクトへの参照が１つの場合。オブジェクトのコレクションがある場合。

#### **外部キーマッピング**

+ オブジェクト間の関係を、テーブル間の外部キー参照にマッピングする。

### 多対多の関係ががある場合

#### **関連テーブルマッピング**

+ リンクされたテーブルへの外部キーを持つテーブルとして、関連を保存する。

### 他のオブジェクトと共有しないオブジェクトのコレクションがある場合

#### **依存マッピング**

+ 任意のクラスに対して、子クラスへのデータマッピングを実行させる。

### バリューオブジェクトであるフィールドがある場合

#### **組込バリュー**

+ オブジェクトを他のオブジェクトテーブルの複数フィールドにマッピングする。

### データベースの他の部分が使用しない複雑に絡み合っているオブジェクトがある場合

#### **シリアライズLOB**

+ オブジェクトのグラフを直列化し、１つの大規模オブジェクト(LOB)としてデータベースフィールドに格納する。

## 継承構造をリレーショナルデータベースに格納するには

### **シングルテーブル継承**

+ クラスの継承階層構造を、さまざまなクラスのフィールドに対する列を持つ、１つのテーブルとして作成する。

### １つのテーブルがデータベースアクセスのボトルネックとして作用する場合

#### **クラステーブル継承**

+ クラスごとに１つのテーブルを使って、クラスの継承階層構造を作成する。

### １つのテーブルがデータベースのスペースを無駄にする場合

#### **クラステーブル継承**

### 結合が多すぎるが、１つのテーブルとはしたくない場合

#### **具象テーブル継承**

+ 階層構造の具象クラスごとに１つのテーブルを使って、クラスの継承階層構造を作成する。

### **継承マッパー**

+ 継承階層構造を処理するデータベースマッパーを組織化するための構造 

# オブジェクトリレーショナルメタデータマッピングパターン

## データベースにドメインデータをマッピングするためのコードを最小限にするには

### **メタデータマッピング**

+ メタデータでのオブジェクトリレーショナルマッピングの詳細を保持する。

## ドメインモデルでデータベースにクエリーを行うには

### **クエリーオブジェクト**

+ データベースクエリーとして機能するオブジェクト。

## **リポジトリ**

+ ドメインオブジェクトにアクセスするためのコレクション型インタフェースを使って、ドメインとデータマッピングレイヤとを仲介する。

# Webプレゼンテーションパターン

## Webプレゼンテーションを構造化するには

### **モデルビューコントローラー**

+ ユーザインタフェースの相互作用を３つの明確な役割へ分割する。

## HTTPリクエストの処理を組織化するには

### ほとんどが直接ページURLを用いたシンプルなアプリケーションフローの場合

#### **ページコントローラー**

+ 特定のページに対するリクエストやWebサイト上のアクションを扱うオブジェクト。

### 複雑なフローの場合

#### **フロントコントローラー**

+ Webサイトへのあらゆるリクエストを扱うコントローラ。

### 国際化または柔軟性のあるセキュリティポリシーが必要な場合

#### **フロントコントローラー**

## Webページの書式を制御するには

### ページを編集し、動的なデータ用にフックを挿入したい場合

#### **テンプレートビュー**

+ HTMLページにマークを埋め込むことで、HTMLへ情報を加工する。

### ページを、ドメインデータを変換したものと見なす場合

#### **トランスフォームビュー**

+ 要素ごとにドメインデータ要素を処理しHTMLへと変換するビュー。

### サイトの外観に全面的な変更が必要な場合

#### **ツーステップビュー**

+ ドメインデータを２つの手順でHTMLに変換する。まずは論理ページを形成し、次に論理ページをHTMLへと加工する。

### 論理的には同じ画面フォーマットに、複数の外観が必要な場合

#### **ツーステップビュー**

## 複数なアプリケーションフローを制御するには

### **アプリケーションコントローラー**

+ アプリケーションの画面ナビゲーションとフローを扱うための集中管理ポイント。

# 分散パターン

## リモートから細かいオブジェクトにアクセスするには

### **リモートファサード**

+ ネットワークの効率性を向上させるため、細かい粒度のオブジェクトに対して粗い粒度のファサードを提供する。

## １つのリモートコールで多くのオブジェクトからデータを渡すには

### **データ変換オブジェクト**

+ メッセージ呼び出しの数を削減するため、プロセス間のデータを伝送するオブジェクト。

# オフライン並行性パターン

## １つのクライアントリクエスト内で、データベースへの変更をコミットできるようにするには

### **軽オフラインロック**

+ コンフリクトの検出とトランザクションのロールバックによって、同時に発生するビジネストランザクション間のコンフリクトを防止する。

### ユーザの作業の損失を防止する場合

#### **重オフラインロック**

+ データへのアクセスを一度に１つのビジネストランザクションに限定することで、同時ビジネストランザクション間のコンフリクトを防止する。

## １つのロックで関連オブジェクトを全てロックするには

### **緩ロック**

+ １つのロックで関連オブジェクトセットをロックする。

## ロック戦略において妥協を避けるには

### **暗黙ロック**

+ フレームワークまたはレイヤスーパータイプコードがオフラインロックを獲得できる。

# セッションステートパターン

## ステートフルなビジネストランザクションの途中の状態を格納するには

### ステートがあまりない場合

#### **クライアントセッションステート**

+ セッションステートをクライアントに格納する。

### 多くのステートがある場合

#### **サーバセッションステート**

+ サーバシステムのセッションステートを直列化形式で保持する。

### データベースへ処理中の作業をコミットできるようにする場合

#### **データベースセッションステート**

+ コミットされたデータのセッションデータをデータベースに格納する。