マイクロソフト系技術情報 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

  • TableAdapterDataAdapterなどがある。
  • 元々関連性のない2つのクラスを接続するクラスを作る。

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 (出版-購読型モデル)

  • Reactive Extensions(Rx)などが有名。
  • インスタンスの変化を他のインスタンスから監視できるようにする。Listenerとも呼ばれる。

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 Access Object - Wikipedia
    https://ja.wikipedia.org/wiki/Data_Access_Object

    Java では、Data Access Object は数々の複雑で多様な 永続性技術
    (JDBC、JDO、EJB CMP、TopLink?、Hibernate、iBATISなど)
    からアプリケーション本体を隔離するのに利用される。

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と同様に「プレゼンテーションとドメインを分離」することで、
アプリケーション開発における保守性・開発生産性に寄与する。

その他のアーキテクチャに関するパターン

Front Controller パターン

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

インテグレーション層のパターン

Data Access Object

Domain Store

Service Activator

Web Service Broker

その他のパターン

依存性の注入 (DI)

遅延読み込み

モックオブジェクト

ソフトウェアテスト時、特に

  • テスト駆動開発
  • ビヘイビア駆動開発

における代用の下位モジュールスタブの一種。

Abstract Server パターン

Factory パターン

Monostate パターン

Null object パターン

Object pool パターン

Servant (デザインパターン)

Stairway to Heaven

Type Tunnel パターン

参考

IoC、AOP → DI → 依存性反転原則

DI

IoC

AOP

依存性反転原則

Wikipedia

デザインパターン

IoC

C#とJavaによるデザインパターンへのお誘い

https://www.hyuki.com/pi/

C#で学ぶデザインパターン入門 - Qiita

  • Composite Pattern

CodeZine?(コードジン)

デザインパターンの使い方連載一覧
https://codezine.jp/article/corner/207


Tags: :プログラミング, :.NET開発


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-03-06 (金) 00:36:34 (1506d)