【PofEAA】Patterns of Enterprise Application Archtecture ~目次~

エンタープライズアーキテクチャ

 * Patterns of Enterprise Application Architecture(PofEAA)
 * 企業における組織や業務プロセス、情報システムを見直し、標準化・最適化したもの

個人的な意見

 * 今まで自分の経験した中で自然に使ってたものや特に特別なパターンなのってものもが多い印象

■ ベースパターン(Base Patterns)

ゲートウェイ(Gateway) パターン

 * 外部のシステムまたはリソースへのアクセスをオブジェクトにカプセル化する

参考文献

* ソース(Java
https://github.com/asakichy/PofEAA/blob/master/src/main/java/asakichy/architecture/domain_logic/Gateway.java

マッパー(Mapper) パターン

 * サブシステム間のデータのやりとりを仲介し、サブシステムの独立性を保つ

レイヤースーパータイプ(LayerSupertype) パターン

 * レイヤ内のすべての型のスーパータイプとして振舞うルートクラス

参考文献

下のサイトの図がイメージしやすい
http://systemartlaboratory.com/parallelinheritance.html
http://d.hatena.ne.jp/asakichy/20120921/1348179112

分離インターフェース(SeparatedInterface) パターン

 * 実装からインターフェースを別のパッケージに分離する

レジストリ(Registry) パターン

 * ほかのオブジェクトが一般的なオブジェクトとサービスを検索するために使用

参考文献

http://d.hatena.ne.jp/asakichy/20120925/1348524654
http://www.itmedia.co.jp/im/articles/0705/15/news133_4.html

バリューオブジェクト(ValueObject) パターン

 * 金銭や日付範囲などを表わす小さなオブジェクトで、同値性を参照の一致で判断できないもの

マネー(Money) パターン

 * 金額をオブジェクトにカプセル化して、統一的に扱えるようにする
 => このパターンは知らなかったが、実践してた

スペシャルケース(SpecialCase) パターン

 * 特定のケースに対応するために、継承クラスを導出する。

プラグイン(Plugin) パターン

 * クラス間のリンクをコンパイル時ではなく、実行時に設定を読んで解決する

サービススタブ(ServiceStub)パターン

 * サービスへの依存を排除して、テストを容易にする

レコードセット(RecordSet)パターン

 * 表形式のデータのメモリ上での表現

ドメインロジックパターン(Domain Logic Patterns)

http://ibarakinakano.blog89.fc2.com/blog-entry-12.html

トランザクションスクリプト(Transaction Script) パターン

 * トランザクションとして完結する処理すべて一つのメソッドの中にまとめて記述するパターン

ドメインモデル(DomainModel) パターン

 * ビジネスロジックをデータと振る舞いを結び付けたオブジェクトの集合で実装する

テーブルモジュール(TableModule) パターン

 * データベースのテーブルごとにビジネスロジッククラスを実装する

サービスレイヤ(ServiceLayer) パターン

 * サービスを提供する層を生成して、アプリケーション境界を作成する。

■ データソースのアーキテクチャに関するパターン (Data Source Architectural Patterns)

https://github.com/tomykaira/PofEAAReading/blob/master/4th.md

データマッパー(Data Mapper)パターン

 * モデルとデータベースの間を取りなすMapperという中間的な構造を持っている

関連記事

Data Mapperパターン
http://blogs.yahoo.co.jp/dk521123/34165725.html

テーブルデーゲートウェイ(Table Data Gateway)パターン

 * 1テーブルを1クラスで表現

参考文献

http://www.itmedia.co.jp/im/articles/0705/15/news133_4.html
http://otndnld.oracle.co.jp/columns/arai-semi/data_access/2/
http://d.hatena.ne.jp/asakichy/20120619/1340056628
http://tnakamura.hatenablog.com/entry/20080815/1220405323

行データゲートウェイ(Row Data Gateway)パターン

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

参考文献

http://www.itmedia.co.jp/im/articles/0705/15/news133_4.html
http://otndnld.oracle.co.jp/columns/arai-semi/data_access/2/

アクティブレコード(Active Record) パターン

 * モデルとデータベースの間を取りなすMapperという中間的な構造を持っている
 * DBテーブル・ビューの行をラップし。DBアクセスをカプセル化して
  データにドメインロジックを追加するオブジェクト

参考文献

http://www.techscore.com/tech/Ruby/Rails/other/designpattern/1/
http://otndnld.oracle.co.jp/columns/arai-semi/data_access/2/

■ オブジェクトリレーショナル振る舞いパターン (Object-Relational Behavioral Patterns)

http://www.ruimo.com/publication/kaihatsuNoGenbaNo004/or.pdf

ユニットオブワーク(Unit of Work) パターン

 * 変更点を保存しておいて、ある時点で、まとめて DB アクセスすることで、アクセス負荷を低減する

参考文献

https://github.com/tomykaira/PofEAAReading/blob/master/5th.md
http://mindia.jp/akkun/%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E3%82%AA%E3%83%96%E3%83%AF%E3%83%BC%E3%82%AF
* 以下のサイトの図がイメージしやすい
http://d.hatena.ne.jp/asakichy/20120720/1342735606

一意マッピング(Identity Map)パターン

 * 読み込まれた全てのオブジェクトを1つのマッピングに保持し、
  各オブジェクトが1度だけロードされることを保証する。
  オブジェクトを参照する場合には、マッピングを使って参照する

参考文献

http://capsctrl.que.jp/kdmsnr/wiki/PofEAA/?IdentityMap
http://www.itmedia.co.jp/im/articles/0705/15/news133_4.html

レイジーロード(Lazy Load) パターン

 * 必要になってからデータ取得
 * 実装方法は、以下の4つの方法 
  + レイジーイニシャライズ 
  + 仮想プロキシー 
  + バリューホルダー 
  + ゴースト

参考文献

http://d.hatena.ne.jp/asakichy/20120724/1343081059
http://mindia.jp/akkun/%E3%83%AC%E3%82%A4%E3%82%B8%E3%83%BC%E3%83%AD%E3%83%BC%E3%83%89

関連記事

Lazy<T>クラス ~Proxyパターンの実現~
http://blogs.yahoo.co.jp/dk521123/23730379.html

■ オブジェクトリレーショナル構造パターン (Object-Relational Structural Patterns)

一意フィールド (Identity Field) パターン

 * DBのプライマリーキーをオブジェクトに持たせて、一意性を確保する

メモ

 * 一意フィールド : 別に難しいことじゃない

参考文献

http://mindia.jp/akkun/%E4%B8%80%E6%84%8F%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89

外部キーマッピング(ForeignKeyMapping) パターン

 * オブジェクト間の関係を、テーブル間の外部キーによる関連をマッピングする

関連テーブルマッピング(AssociationTableMapping) パターン

 * 多対多の関連を持つテーブル間を外部キーを持つテーブルとして、関連を保存する

関連記事

 * 別に難しいことじゃなかった
関連テーブルマッピング(AssociationTableMapping) パターン
http://blogs.yahoo.co.jp/dk521123/34273099.html

== 依存
マッピング(DependentMapping) パターン ==
 * 親クラスに対して、子クラスへのデータベースマッピングも一緒に実行させる

組込バリュー(EmbeddedValue) パターン

 * オブジェクトを別のオブジェクトのテーブルのフィールドにマップする

シリアライズBLOB(SerializedLOB) パターン

 * オブジェクトのグラフを直列化して 1 つのテーブルのフィールドに格納する

シングルテーブル継承(SingleTableInheritance) パターン

 * 継承ツリー内の全クラスのフィールドを持つ 1つのテーブルに、
   継承ツリー内のオブジェクトをマップして継承を表現する

クラステーブル継承(ClassTableInheritance) パターン

 * 継承ツリー内の各クラスに 1 つのテーブルを対応させて継承を表現する

具象テーブル継承(ConcreteTableInheritance) パターン

 * 継承ツリー内の各具象クラスに 1 つのテーブルを対応させて継承を表現する

継承マッパー(InheritanceMappers) パターン

 * 継承マッパ自身を継承を使って実装する

■ オブジェクトリレーショナルメタデータマッピングパターン (Object-Relational Metadata Mapping Patterns)

メタデータマッピング(Metadata Mapping) パターン

http://capsctrl.que.jp/kdmsnr/wiki/PofEAA/?MetadataMapping
より抜粋

開発者が簡単なマッピング対応表だけを書いておけば、
すでに用意されたコードがそれを解釈して、データの読み込み、追加、更新の詳細処理を実行してくれる

→あんまり実用性がないな~

クエリーオブジェクト(Query Object) パターン

 * データベースに対するクエリをオブジェクトで表現する

参考文献

http://d.hatena.ne.jp/asakichy/20120821/1345505916

リポジトリ(Repository) パターン

 * ドメインオブジェクトに対してコレクションのようにアクセスできるインターフェースを提供して、
   ドメインマッピング層との間の仲介をする

■ Webプレゼンテーションパターン (Web Presentation Patterns)

http://www.ruimo.com/publication/kaihatsuNoGenbaNo004/presentationPattern.pdf

モデルビューコントローラ(MVC; Model-View-Controller)パターン

 * 超有名
 * アプリケーションソフトウェアを以下の3つの部分に分割する。
  + model: アプリケーションデータ
  + view: 画面
  + controller: 入力を受け取りmodelとviewへの命令に変換する処理

参考文献

http://www.atmarkit.co.jp/fdotnet/chushin/greatblogentry_10/greatblogentry_10_01.html
http://ja.wikipedia.org/wiki/Model_View_Controller

関連記事

* ASP.NET MVC(Model-View-Controller)(基礎知識編)
http://blogs.yahoo.co.jp/dk521123/25381439.html

PageControllerパターン

 * Web サイトのページやアクションリクエストを受け付けるオブジェクト

FrontControllerパターン

 * Web サイトへのリクエストを 1 つのコントローラで処理する

TemplateViewパターン

 * HTML の中にマーカを埋め込むことで、HTMLの中に動的に情報を差し込む

TransformViewパターン

 * ドメインデータをエレメントごとに変換して、HTML を組み立てる。

TwoStepViewパターン

 * 論理的なページを生成した後、それをHTML に変換する

ApplicationControllerパターン

 * アプリケーションの画面の遷移を制御する

■ 分散パターン (Distribution Patterns)

リモートファサード(RemoteFacade) パターン



データ変換オブジェクト(DataTransferObject) パターン




■ セッションステートパターン (Session State Patterns)パターン

 * セッション状態をどこに置くか

クライアントセッションステート(Client Session State) パターン

 * クライアントにセッション状態を格納する

参考文献

http://capsctrl.que.jp/kdmsnr/wiki/PofEAA/?ClientSessionState

サーバセッションステート(Server Session State) パターン

 * セッション状態をサーバ上にシリアライズされた形で保持する

参考文献

http://capsctrl.que.jp/kdmsnr/wiki/PofEAA/?ServerSessionState

データベースセッションステート(Database Session State) パターン

 * セッションデータをデータベース内に格納する

参考文献

http://d.hatena.ne.jp/asakichy/20120913/1347487613

■ オフライン並行性パターン (Offline Concurrency Patterns)

軽オフラインロック(OptimisticOfflineLock) パターン

 * 同時並行で処理されるビジネストランザクション間の競合を検出してロールバックする仕組み

重オフラインロック(PessimisticOfflineLock) パターン

 * 同時並行で処理されるビジネストランザクション間の競合を、
   1 時点では 1 ビジネストランザクションしかデータにアクセスできないようにして、防ぐ仕組み

緩ロック(CoarseGrainedLock) パターン

 * 1つのロックで、関連するオブジェクト全体をロックする

暗黙ロック(ImplicitLock) パターン

 * フレームワークやレイヤスーパータイプ側で、自動的にオフラインロックを獲得する
http://www.ruimo.com/publication/kaihatsuNoGenbaNo004/lock.pdf