「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -[[戻る>.NET開発]] * 目次 [#r7a0f009] #contents *概要 [#u54dfdc4] -過去のソフトウェア設計者が発見し編み出した設計ノウハウを蓄積し、~ 名前をつけ、再利用しやすいように特定の規約に従ってカタログ化したもの。 -[[GoF>#gdfdb360]]やCode Completeなどの書籍が有名。 **GoFパターン [#gdfdb360] -多数のソフトウェアパターンの中で最も広く知られている。 -GoFとは、書籍『オブジェクト指向における再利用のためのデザインパターン』の著者である、~ エーリヒ・ガンマ、リチャード・ヘルム、ラルフ・ジョンソン、ジョン・ブリシディースの4人を指す。 **注意および批判 [#jee32c0d] -よく使われる設計を一般化された形で(コンセプトとして)まとめたもの。 -サンプルコードは、実装例に過ぎない。 -デザインパターンは、すべての状況における最善の設計ではない。 -デザインパターンをむやみに適用するのは不適切で、コードの複雑さを無意味に高める。 -一部のデザインパターンは、プログラミング言語の機能の欠損の印と主張されることがある。 *詳細 [#vc04c6fb] .NETのクラスライブラリの中でどのように使用されているかなどの例を上げらながら、ぼちぼち書き足していく。 **生成に関するパターン [#of2bac53] ***Abstract Factory [#s5cb14c9] -関連する一連のインスタンスを状況に応じて、適切に生成する方法を提供する。 ***Builder [#x108671e] -接続文字列を生成するSqlConnectionStringBuilderなど。 -複合化されたインスタンスの生成過程を隠蔽する。 ***Factory Method [#b1dbb8d4] -データ プロバイダのインスタンスを生成するDbProviderFactoryなど。 -実際に生成されるインスタンスに依存しない、インスタンスの生成方法を提供する。 ***Prototype [#gaac8a02] -ICloneable.Clone(), Object.MemberwiseClone()などがある。 -同様のインスタンスを生成するために、原型のインスタンスを複製する。 ***Singleton [#b471a479] -GetInstance メソッドを持つクラス、WCFのIInstanceProviderインターフェイスなどが該当。 -あるクラスについて、インスタンスが単一であることを保証する。 **構造に関するパターン [#t95490e2] ***Adapter [#hebab451] -TableAdapter、DataAdapterなどがある。 -元々関連性のない2つのクラスを接続するクラスを作る。 ***Bridge [#h1d2d0fa] -クラスなどの実装と、呼出し側の間の橋渡しをするクラスを用意し、実装を隠蔽する。 ***Composite [#i85291a3] -例えば、DataTableはDataColumnやDataRowなどから構成される。~ 多数のUI Controlをホストする、Form(Windows FormsやWeb Forms)なども。 -再帰的な構造を表現する。複雑なオブジェクトモデルを持つオブジェクト。 ***Decorator [#v3f8a090] -System.IO.Streamクラス系のデコレート・パターンが有名(ファイルIO+暗号化など)。 -あるインスタンスに対し、動的に付加機能を追加する。Filterとも呼ばれる。 ***Facade [#x4521138] -業務系では、Transactionルートを定義する際にしようされる。 -複数のサブシステムの窓口となる共通のインタフェースを提供する。 ***Flyweight [#xd8cd6df] -多数のインスタンスを共有し、インスタンスの構築のための負荷を減らす。 ***Proxy [#r5dcba5a] -[[透過プロキシ>.NETにおいてAOPを実現する透過プロキシ]](System.Runtime.Remoting.Proxies.RealProxy)などで利用されている。 -共通のインタフェースを持つインスタンスを内包し、利用者からのアクセスを代理する。Wrapperとも呼ばれる。 **振る舞いに関するパターン [#m75410c4] ***Chain of Responsibility [#d0d1a4c6] -イベントの送受信を行う複数のオブジェクトを鎖状につなぎ、それらの間をイベントが渡されてゆくようにする。 ***Command [#w39f63cc] -複数の異なる操作について、それぞれに対応するオブジェクトを用意し、オブジェクトを切り替えることで、操作の切替えを実現する。 ***Interpreter [#h8bb0b34] -構文解析のために、文法規則を反映するクラス構造を作る。 ***Iterator [#h545307c] -配列、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 [#a609fe99] -オブジェクト間の相互作用を仲介するオブジェクトを定義し、オブジェクト間の結合度を低くする。 ***Memento [#afe52f42] -データ構造に対する一連の操作のそれぞれを記録しておき、以前の状態の復帰または操作の再現が行えるようにする。 ***Observer (出版-購読型モデル) [#gd97bb35] -[[Reactive Extensions(Rx)]]などが有名。 -インスタンスの変化を他のインスタンスから監視できるようにする。Listenerとも呼ばれる。 ***State [#v4b944ab] -オブジェクトの状態を変化させることで、処理内容を変えられるようにする。 ***Strategy [#ifdf850f] -[[IoC、AOP → DI → 依存性反転原則>#y4d32e7a]] -データ構造に対して適用する一連のアルゴリズムをカプセル化し、アルゴリズムの切替えを容易にする。 ***Template Method [#ca09b857] -[[IoC、AOP → DI → 依存性反転原則>#y4d32e7a]] -あるアルゴリズムの途中経過で必要な処理を抽象メソッドに委ね、その実装を変えることで処理が変えられるようにする。 ***Visitor [#ecff5de4] -データ構造を保持するクラスと、それに対して処理を行うクラスを分離する。 **マルチスレッドプログラミングに関するパターン [#fed89734] ***Active Object (Actor) [#p6a3f471] ***Future [#o650f287] ***Guarded suspension [#l273ef76] -前提条件が満たされるまで待機するための機構。 -System.Threading.SpinLock構造体、逆セマフォなど。 ***Lock [#q67d7cf5] -リソースに対して1つのスレッドが「ロック」をかけて、~ その間は他のスレッドがそのリソースにアクセスしたり変更を加えたりできないようにする。 -WindowsOSのスレッド同期ツールキットを使う、 --lockステートメント --System.Threading.Mutexクラス --System.Threading.Semaphoreクラス >などがある。 -参考 --マルチスレッドで高速なC#を書くためのロック戦略~ https://qiita.com/tadokoro/items/28b3623a5ec58517d431 ***Monitor [#b0c6d20a] -排他的に実行しなければならないメソッド群を持つ~ オブジェクトをスレッドセーフに利用できるようにするための機構。 -名前の通り、System.Threading.Monitor クラスがある。 ***Producer-consumer [#zb8f28aa] -「生産者」 (producer) スレッド群がデータを生成して「通信路」に追加し、~ 「消費者」 (consumer) スレッド群がそのデータを「通信路」から取り出して処理するという構造。 -名前の通り、System.Threading.ThreadPool クラスがある。 ***Reactor [#o8c416b0] ***Readers-writer lock [#rbe06a3e] -書き込みは排他アクセスが必要だが、読み込みは並行に行えるようにしたい場合のためのロック機構。 -System.Threading.ReaderWriterLockがある。 ***Scheduler [#b51f5b66] -WindowOSにノンプリエンプティブなマルチタスク、協調的マルチタスクを実現するための~ ファイバー(fiber)があるが、.NETにはない(マイクロスレッドで実装することはできる)。 -シングルスレッドで実行される処理の実行を各スレッドに許可するタイミングを明確に制御する。 -参考 --[サンプル] イテレータとマイクロスレッド - C# によるプログラミング入門 | ++C++; // 未確認飛行 C~ https://ufcpp.net/study/csharp/sp2_microthread.html ***Thread pool [#la91c241] -多数のスレッドを作成して、それらに多数のタスクを処理させる。 -一般に、[[Producer-consumer>#zb8f28aa]]パターンを使って実現される。 -名前の通り、System.Threading.ThreadPool クラスがある。 ***Thread-specific storage [#d3119598] WindowのOS機能にTLS: Thread Local Storageがある。 -この、TLSには、ThreadStatic属性やThreadLocalオブジェクト経由でアクセス可能。 -静的変数・グローバル変数のように扱えるがスレッドごとに異なる内容を格納できるメモリ領域を提供する。 ***Two-phase termination [#g04364a8] **データ・アクセスのアーキテクチャに関するパターン [#raa35144] ***Active Record [#ne665aae] -Ruby on Railsでは、 --データベース定義からほぼ自動でCRUD操作を備えたクラスを生成する。 --一方でその性質上、複雑な設計のデータベースとは相性が悪い。 -Active Record - Wikipedia~ https://ja.wikipedia.org/wiki/Active_Record ***Data Access Object [#x62bd0e8] -[[多層アーキテクチャ>#pc8145f2]]のデータ・アクセスに合致。 -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 [#t1983a69] -DTO(POXO : Plain Ordinary XXXX Objectとも) --.NET:POCO --Ruby:PORO --Swift:POSO --PHP、Python:POPO --Java、JavaScript:POJO -アプリケーションソフトウェアのサブシステム間でデータを転送するのに使う。 -もともと、EJBにおける[[モックオブジェクト>#a7aee8ab]]文化から広まったらしい。 -また、JavaScriptでは、Ajaxの分野で利用されたJSON文化から広まった。 -Data Transfer Object - Wikipedia~ https://ja.wikipedia.org/wiki/Data_Transfer_Object >自身のデータの格納と取り出し機能(アクセサメソッドとミューテータメソッド)しか持たない。 **UIのアーキテクチャに関するパターン [#i0ef6337] ***MVC [#tbf5bdac] [[ASP.NET MVC]]などで利用されている。 -Model View Controller - Wikipedia~ https://ja.wikipedia.org/wiki/Model_View_Controller ***MVVM [#p004cdc7] [[MVC>#tbf5bdac]]と同様に「プレゼンテーションとドメインを分離」することで、~ アプリケーション開発における保守性・開発生産性に寄与する。 -Model View ViewModel - Wikipedia~ https://ja.wikipedia.org/wiki/Model_View_ViewModel >元来[[WPF/Silverlight]]の世界で生まれた考え方ではあるが、~ 現在はAndroidやウェブブラウザ上でのJavaScriptの世界でもMVVMの利用は広がっている。 **その他のアーキテクチャに関するパターン [#sc8ad5eb] ***Front Controller パターン [#r220b859] ***Identity map パターン [#z5bef93c] ***Interceptor パターン [#m05a6803] ***Naked objects [#c0a9d710] ***Service locator パターン [#r23d6dca] ***Specification パターン [#m6e3d1dc] ***出版-購読型モデル [#s889da4d] -非同期メッセージングパラダイムの一種。 -メッセージキュー・パラダイムと対比されるため、メッセージ・システムは、~ 出版-購読型とメッセージキューの両モデルをサポートしている。 -特徴 --メッセージの送信者(出版側)が特定の受信者(購読側)を想定せずにメッセージを送るようプログラムされたもの。 --出版側と購読側の結合度が低いため、スケーラビリティがよく、動的なネットワーク構成に対応可能。 -実装 --出版側のメッセージはクラス分けされ、購読者に関する知識を持たない。 --購読側は興味のあるクラスを指定しておき、そのクラスに属するメッセージだけを受け取り、出版者についての知識を持たない。 -出版-購読型モデル - Wikipedia~ https://ja.wikipedia.org/wiki/%E5%87%BA%E7%89%88-%E8%B3%BC%E8%AA%AD%E5%9E%8B%E3%83%A2%E3%83%87%E3%83%AB ***多層アーキテクチャ [#pc8145f2] -アプリケーションを複数の"層"に分け、それらを独立したモジュールとして開発・保守する。 --各層はインタフェースを定義しモジュール化されたソフトウェアであり、 --テクノロジーの進歩や要求の変化に合わせて各層を個別に置換できる。 -例 --クライアントサーバモデル ---ユーザインタフェース ---ビジネスロジック ---データアクセス --Web開発 ---プレゼンテーション層 : 変化しないコンテンツを供給するWebサーバ ---中間層 : 動的コンテンツを生成するアプリケーションサーバ。 ---データ層 : データベースとその管理システム。 -多層アーキテクチャ - Wikipedia~ https://ja.wikipedia.org/wiki/%E5%A4%9A%E5%B1%A4%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3 **プレゼンテーション層のパターン [#wc02c6eb] ***Application Controller [#a972159c] ***Composite View [#f2b5ece3] ***Context Object [#s5ed92b2] ***Dispatcher View [#r0ce11f0] ***Front Controller [#a861b484] ***Intercepting Filter [#kc0cbb83] ***Service To Worker [#fd060d90] ***View Helper [#laa9f3f3] **ビジネス層のパターン [#xe65d2db] ***Application Service [#s21abb01] ***Business Delegate [#efaf7ff1] ***Business Object [#y58fb0d3] ***Composite Entity [#nf7589a0] ***Service Locator [#wf143d3f] ***Session Facade [#gb19a915] ***Transfer Object Assembler [#i07859a1] ***Transfer Object [#l57b26e5] ***Value List Handler [#bf34081f] **インテグレーション層のパターン [#xfbd90cb] ***[[Data Access Object>#x62bd0e8]] [#dd34e18a] ***Domain Store [#v56ad0f2] ***Service Activator [#d130d7f2] ***Web Service Broker [#if73eaf4] **その他のパターン [#keece198] ***[[依存性の注入 (DI)>DI]] [#n58e2046] ***遅延読み込み [#m61a26aa] ***モックオブジェクト [#a7aee8ab] ソフトウェアテスト時、特に -テスト駆動開発 -ビヘイビア駆動開発 における代用の下位モジュールスタブの一種。 -モックオブジェクト - Wikipedia~ https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%83%E3%82%AF%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88 ***Abstract Server パターン [#t2db05da] ***Factory パターン [#i854eabd] ***Monostate パターン [#d047dfaa] ***Null object パターン [#md9ba19b] ***Object pool パターン [#c77bf983] ***Servant (デザインパターン) [#e7e453dc] ***Stairway to Heaven [#n1b5d2b4] ***Type Tunnel パターン [#w7e4c553] *参考 [#k80f2538] **Wikipedia [#l8c88915] -デザインパターン (ソフトウェア)~ https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2) -アンチパターン~ https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%B3%E3%83%81%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3 -Category:デザインパターン (ソフトウェア)~ https://ja.wikipedia.org/wiki/Category:%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2) -デザインパターンの一覧~ https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%AE%E4%B8%80%E8%A6%A7 ***IoC [#n1472fa7] -Template Method パターン~ https://ja.wikipedia.org/wiki/Template_Method_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3 -Factory Method パターン~ https://ja.wikipedia.org/wiki/Factory_Method_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3 -Strategy パターン~ https://ja.wikipedia.org/wiki/Strategy_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3 -Service locator pattern~ https://en.wikipedia.org/wiki/Service_locator_pattern **C#とJavaによるデザインパターンへのお誘い [#j6bccc68] https://www.hyuki.com/pi/ -Factory Methodパターン(2002年12月号)~ https://www.hyuki.com/pi/#n01 -Template Methodパターン(2003年1月号)~ https://www.hyuki.com/pi/#n02 -Generation Gapパターン(2003年2月号)~ https://www.hyuki.com/pi/#n03 -Null Objectパターン(2003年3月号)~ https://www.hyuki.com/pi/#n04 -Thread-Specific Storageパターン(2003年4月号)~ https://www.hyuki.com/pi/#n05 -Producer-Consumerパターン(2003年5月号)~ https://www.hyuki.com/pi/#n06 -Single-Active-Instance Singletonパターン(2003年6月号)~ https://www.hyuki.com/pi/#n07 -Multi-Phase Startupパターン(2003年7月号)~ https://www.hyuki.com/pi/#n08 -Mock Objectパターン(2003年8月号)~ https://www.hyuki.com/pi/#n09 -Model-View-Controllerパターン(2003年9月号)~ https://www.hyuki.com/pi/#n10 -Fork/Joinパターン(2003年10月号)~ https://www.hyuki.com/pi/#n11 -Essenceパターン(2003年11月号)~ https://www.hyuki.com/pi/#n12 **C#で学ぶデザインパターン入門 - Qiita [#u3feb80b] -Iterator~ http://qiita.com/toshi0607/items/cdc589c58f21c0fc513d -Adapter~ http://qiita.com/toshi0607/items/374373a8bd656f7188d4 -Template Method~ http://qiita.com/toshi0607/items/cc8a87a3049bd7af52df -Factory Method~ http://qiita.com/toshi0607/items/d95bdd31da363e0f04a9 -Singleton~ http://qiita.com/toshi0607/items/c172bb4478e72ae6ced7 -Prototype~ http://qiita.com/toshi0607/items/f4358020befca048d2e0 -Builder~ http://qiita.com/toshi0607/items/13e37d54e04b61bc69b5 -AbstractFactory~ http://qiita.com/toshi0607/items/b8a19a4328849cdf1d99 -Bridge~ http://qiita.com/toshi0607/items/13e37d54e04b61bc69b5 -Strategy~ http://qiita.com/toshi0607/items/72829d34ef9595f5b3b0 -Composite Pattern~ -Decorator Pattern~ http://qiita.com/toshi0607/items/a65d1abb95a97970ab8c **[[IoC、AOP → DI → 依存性反転原則]] [#y4d32e7a] ---- Tags: [[:プログラミング]], [[:.NET開発]]