「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
- 過去のソフトウェア設計者が発見し編み出した設計ノウハウを蓄積し、
名前をつけ、再利用しやすいように特定の規約に従ってカタログ化したもの。
- GoFやCode Completeなどの書籍が有名。
- .NETのクラスライブラリの中でどのように使用されているか?
などの例を上げらながら、ぼちぼち書き足していく。
GoFパターン †
- 多数のソフトウェアパターンの中で最も広く知られている。
- GoFとは、書籍『オブジェクト指向における再利用のためのデザインパターン』の著者である、
エーリヒ・ガンマ、リチャード・ヘルム、ラルフ・ジョンソン、ジョン・ブリシディースの4人を指す。
- 特定の規約に従ってカタログ化。
- 生成に関するパターン
- 構造に関するパターン
- 振る舞いに関するパターン
- マルチスレッドプログラミングに関するパターン
注意および批判 †
- よく使われる設計を一般化された形で(コンセプトとして)まとめたもの。
- サンプルコードは、実装例に過ぎない。
- デザインパターンは、すべての状況における最善の設計ではない。
- デザインパターンをむやみに適用するのは不適切で、コードの複雑さを無意味に高める。
- 一部のデザインパターンは、プログラミング言語の機能の欠損の印と主張されることがある。
GoFパターン †
生成に関するパターン †
Abstract Factory †
- 関連する一連のインスタンスを状況に応じて、適切に生成する方法を提供する。
Builder †
- 接続文字列を生成するSqlConnectionStringBuilder?など。
- 複合化されたインスタンスの生成過程を隠蔽する。
Factory Method †
- データ プロバイダのインスタンスを生成するDbProviderFactory?など。
- 実際に生成されるインスタンスに依存しない、インスタンスの生成方法を提供する。
Prototype †
- ICloneable.Clone(), Object.MemberwiseClone?()などがある。
- 同様のインスタンスを生成するために、原型のインスタンスを複製する。
Singleton †
- GetInstance? メソッドを持つクラス、WCFのIInstanceProvider?インターフェイスなどが該当。
- あるクラスについて、インスタンスが単一であることを保証する。
構造に関するパターン †
Adapter †
Bridge †
- クラスなどの実装と、呼出し側の間の橋渡しをするクラスを用意し、実装を隠蔽する。
Composite †
- 例えば、DataTable?はDataColumn?やDataRow?などから構成される。
多数のUI Controlをホストする、Form(Windows FormsやWeb Forms)なども。
- 再帰的な構造を表現する。複雑なオブジェクトモデルを持つオブジェクト。
Decorator †
- System.IO.Streamクラス系のデコレート・パターンが有名(ファイルIO+暗号化など)。
- あるインスタンスに対し、動的に付加機能を追加する。Filterとも呼ばれる。
Facade †
- 業務系では、Transactionルートを定義する際にしようされる。
- 複数のサブシステムの窓口となる共通のインタフェースを提供する。
Flyweight †
- 多数のインスタンスを共有し、インスタンスの構築のための負荷を減らす。
Proxy †
- 透過プロキシ(System.Runtime.Remoting.Proxies.RealProxy?)などで利用されている。
- 共通のインタフェースを持つインスタンスを内包し、利用者からのアクセスを代理する。Wrapperとも呼ばれる。
振る舞いに関するパターン †
Chain of Responsibility †
- イベントの送受信を行う複数のオブジェクトを鎖状につなぎ、それらの間をイベントが渡されてゆくようにする。
Command †
- 複数の異なる操作について、それぞれに対応するオブジェクトを用意し、オブジェクトを切り替えることで、操作の切替えを実現する。
Interpreter †
- 構文解析のために、文法規則を反映するクラス構造を作る。
Iterator †
- 配列、Collection、Genericなど、沢山のものがある。
- System.Collections.IList、System.Collections.Generic.IList(T)インターフェイス
- System.Collections.IEnumerator、System.Collections.Generic.IEnumerator(T) インターフェイス
- System.Collections.IEnumerable、System.Collections.Generic.IEnumerable(T) インターフェイス
- System.Collections.ICollection、System.Collections.Generic.ICollection(T) インターフェイス
- 複数の要素を内包するオブジェクトのすべての要素に対して、順番にアクセスする方法を提供する。反復子。
Mediator †
- オブジェクト間の相互作用を仲介するオブジェクトを定義し、オブジェクト間の結合度を低くする。
Memento †
- データ構造に対する一連の操作のそれぞれを記録しておき、以前の状態の復帰または操作の再現が行えるようにする。
Observer (出版-購読型モデル) †
State †
- オブジェクトの状態を変化させることで、処理内容を変えられるようにする。
Strategy †
Template Method †
Visitor †
- データ構造を保持するクラスと、それに対して処理を行うクラスを分離する。
マルチスレッドプログラミングに関するパターン †
Active Object (Actor) †
Future †
Guarded suspension †
- 前提条件が満たされるまで待機するための機構。
- System.Threading.SpinLock?構造体、逆セマフォなど。
Lock †
- リソースに対して1つのスレッドが「ロック」をかけて、
その間は他のスレッドがそのリソースにアクセスしたり変更を加えたりできないようにする。
- WindowsOSのスレッド同期ツールキットを使う、
- lockステートメント
- System.Threading.Mutexクラス
- System.Threading.Semaphoreクラス
などがある。
Monitor †
- 排他的に実行しなければならないメソッド群を持つ
オブジェクトをスレッドセーフに利用できるようにするための機構。
- 名前の通り、System.Threading.Monitor クラスがある。
Producer-consumer †
- 「生産者」 (producer) スレッド群がデータを生成して「通信路」に追加し、
「消費者」 (consumer) スレッド群がそのデータを「通信路」から取り出して処理するという構造。
- Producer-consumerを取り入れたクラスに、System.Threading.ThreadPool? がある。
Reactor †
Readers-writer lock †
- 書き込みは排他アクセスが必要だが、読み込みは並行に行えるようにしたい場合のためのロック機構。
- 名前の通り、System.Threading.ReaderWriterLock?がある。
Scheduler †
- WindowOSにノンプリエンプティブなマルチタスク、協調的マルチタスクを実現するための
ファイバー(fiber)があるが、.NETにはない(マイクロスレッドで実装することはできる)。
- シングルスレッドで実行される処理の実行を各スレッドに許可するタイミングを明確に制御する。
Thread pool †
- 多数のスレッドを作成して、それらに多数のタスクを処理させる。
- 一般に、Producer-consumerパターンを使って実現される。
- 名前の通り、System.Threading.ThreadPool? クラスがある。
Thread-specific storage †
WindowのOS機能にTLS: Thread Local Storageがある。
- この、TLSには、ThreadStatic?属性やThreadLocal?オブジェクト経由でアクセス可能。
- 静的変数・グローバル変数のように扱えるがスレッドごとに異なる内容を格納できるメモリ領域を提供する。
Two-phase termination †
アーキテクチャに関するパターン †
データ・アクセスのアーキテクチャに関するパターン †
Active Record †
- Ruby on Railsでは、
- データベース定義からほぼ自動でCRUD操作を備えたクラスを生成する。
- 一方でその性質上、複雑な設計のデータベースとは相性が悪い。
Data Access Object †
Data Transfer Object †
- DTO(POXO : Plain Ordinary XXXX Objectとも)
- .NET:POCO
- Ruby:PORO
- Swift:POSO
- PHP、Python:POPO
- Java、JavaScript:POJO
- アプリケーションソフトウェアのサブシステム間でデータを転送するのに使う。
- もともと、EJBにおけるモックオブジェクト文化から広まったらしい。
- また、JavaScriptでは、Ajaxの分野で利用されたJSON文化から広まった。
UIのアーキテクチャに関するパターン †
MVC †
ASP.NET MVCなどで利用されている。
MVVM †
MVCと同様に「プレゼンテーションとドメインを分離」することで、
アプリケーション開発における保守性・開発生産性に寄与する。
その他のアーキテクチャに関するパターン †
Identity map パターン †
Interceptor パターン †
Naked objects †
Service locator パターン †
Specification パターン †
出版-購読型モデル †
- メッセージキュー・パラダイムと対比されるため、メッセージ・システムは、
出版-購読型とメッセージキューの両モデルをサポートしている。
- 特徴
- メッセージの送信者(出版側)が特定の受信者(購読側)を想定せずにメッセージを送るようプログラムされたもの。
- 出版側と購読側の結合度が低いため、スケーラビリティがよく、動的なネットワーク構成に対応可能。
- 実装
- 出版側のメッセージはクラス分けされ、購読者に関する知識を持たない。
- 購読側は興味のあるクラスを指定しておき、そのクラスに属するメッセージだけを受け取り、出版者についての知識を持たない。
多層アーキテクチャ †
- アプリケーションを複数の"層"に分け、それらを独立したモジュールとして開発・保守する。
- 各層はインタフェースを定義しモジュール化されたソフトウェアであり、
- テクノロジーの進歩や要求の変化に合わせて各層を個別に置換できる。
- クライアントサーバモデル
- ユーザインタフェース
- ビジネスロジック
- データアクセス
- Web開発
- プレゼンテーション層 : 変化しないコンテンツを供給するWebサーバ
- 中間層 : 動的コンテンツを生成するアプリケーションサーバ。
- データ層 : データベースとその管理システム。
多層アーキテクチャのパターン †
プレゼンテーション層のパターン †
Application Controller †
Composite View †
Context Object †
Dispatcher View †
Front Controller †
MVC系のフレームワークに実装されているアレ
- プレゼンテーションロジックからビジネスロジックを強制的に分離
- すべてのリクエストの最初のアクセスポイントとしてコントローラを使用する。
- コントローラは、リクエストにおける次の側面を処理する。
- 認証
- 承認
- セッション管理
- ナビゲーション
- デバッグ
- ローカリゼーション
Intercepting Filter †
MVC系のフレームワークに実装されているアレ
- 一般的なサービスを処理する埋め込み可能なフィルタのロールを定義
- 例えば、ASP.NET MVCのFilterAttribute?的な。
Service To Worker †
View Helper †
MVC系のフレームワークに実装されているアレ
- ビューからすべてのビジネスロジックを排除し、これを、
ヘルパークラスとしてモデルロジック層またはビジネスロジック層に移動
- ASP.NET MVC ヘルパ(Viewヘルパ、HTMLヘルパなどと呼ばれるものがある)。
ビジネス層のパターン †
Application Service †
Business Delegate †
Business Object †
Composite Entity †
Service Locator †
Session Facade †
Transfer Object Assembler †
Transfer Object †
Value List Handler †
インテグレーション層のパターン †
Domain Store †
Service Activator †
Web Service Broker †
その他のパターン †
遅延読み込み †
モックオブジェクト †
ソフトウェアテスト時、特に
における代用の下位モジュールスタブの一種。
Abstract Server パターン †
Factory パターン †
Monostate パターン †
Null object パターン †
Object pool パターン †
Servant (デザインパターン) †
Stairway to Heaven †
Type Tunnel パターン †
参考 †
Wikipedia †
デザインパターン †
IoC †
C#とJavaによるデザインパターンへのお誘い †
https://www.hyuki.com/pi/
C#で学ぶデザインパターン入門 - Qiita †
CodeZine?(コードジン) †
デザインパターンの使い方連載一覧
https://codezine.jp/article/corner/207
Tags: :プログラミング, :.NET開発