「依存性逆転の原則」の版間の差分

削除された内容 追加された内容
Ms12e97bb (会話 | 投稿記録)
「en:Dependency inversion principle(18:48, 27 March 2018‎ UTC) 」をコピーして翻訳
 
m Bot作業依頼#Cite webテンプレートのdeadlink、deadlinkdate引数の移行
 
(14人の利用者による、間の21版が非表示)
1行目:
'''依存性逆転の原則'''または'''依存関係逆転の原則'''(dependency inversion principle)とは<ref>{{Cite book|和書|author=ロバート・C・マーチン|title=アジャイルソフトウェア開発の奥義 第2版|publisher=SBクリエイティブ|page=163|isbn=978-4-7973-4778-4}}</ref>、[[オブジェクト指向設計]]の用語であり、[[モジュール|ソフトウェアモジュール]]の[[疎結合]]を確立する特別な形態を表現したコンセプトである。[[SOLID]]の五原則の一つとして知られる。
[[オブジェクト指向設計]]において, '''依存性逆転の原則 (dependency inversion principle)''' とは[[Modular programming|ソフトウエアモジュール]]を[[Coupling (computer programming)|疎結合]]に保つための特定の形式を指す用語. この原則に従うとソフトウェアの振る舞いを定義する上位レベルのモジュールから下位レベルモジュールへの従来の[[Dependency (computer science)|依存]]関係は逆転し、結果として下位レベルモジュールの実装の詳細から上位レベルモジュールを独立に保つことができるようになる. この原則で述べられていることは以下の2つである:<ref name="Martin2003">{{cite book|last1=Martin|first1=Robert C.|title=Agile Software Development, Principles, Patterns, and Practices|url=https://books.google.com/books/about/Agile_Software_Development.html?id=0HYhAQAAIAAJ&redir_esc=y|year=2003|publisher=Prentice Hall|isbn=978-0135974445|pages=127–131}}</ref>
 
[[オブジェクト指向設計プログラミング|オブジェクト指向]]において, '''ける従来の依存性逆転の原則 (dependency inversion principle)''' 関係とは[[Modular programming|ソフトウエアモジュール]]を[[Coupling (computer programming)|疎結合]]に保つための特定の形式を指す用語. この原則に従うとソフトウェアの振る舞いを定義する上位レベルのモジュールから下位レベルモジュールへの従来の[[Dependency (computer science)|依存]]関係は逆転し方向性であり結果として下仕様定義を担う上レベルモジュールを、詳細実装の詳細を担う下位モジュールから独立させて、各下レベルモジュールを独立に別個つことができ存すといものだったが、それなる. この対して依存性逆転原則で述べられていることは以下の2つであ二点を提唱してい:<ref name="Martin2003">{{cite book|last1=Martin|first1=Robert C.|title=Agile Software Development, Principles, Patterns, and Practices|url=https://books.google.com/books/about/Agile_Software_Development.html?id=0HYhAQAAIAAJ&redir_esc=y|year=2003|publisher=Prentice Hall|isbn=978-0135974445|pages=127–131}}</ref>
:: ''A. 上位レベルのモジュールは下位レベルのモジュールに依存すべきではない. 両方とも抽象([[Abstraction (computer science)|abstractions]])に依存すべきである. ''
:: ''B. 抽象は詳細に依存してはならない. 詳細が抽象に依存すべきである.''
 
# 上位モジュールはいかなるものも下位モジュールから持ち込んではならない。双方とも抽象(例としてインターフェース)に依存するべきである。<br/>"High-level modules should not import anything from low-level modules. Both should depend on abstractions (e.g., interfaces)."<ref name=":0">{{Cite web|title=Dependency Inversion Principle|url=http://www.objectmentor.com/resources/articles/dip.pdf|archiveurl=https://web.archive.org/web/20150905081103/http://www.objectmentor.com/resources/articles/dip.pdf|archivedate=5 September 2015|website=objectmentor.com|accessdate=2015-09-05|publisher=}}</ref>
この上位レベル、下位レベルの''両方とも''抽象に依存しなければならないと言う要求により、この設計原理は一部の人々のオブジェクト指向プログラミングに対する考え方を''反転''させる.<ref>{{cite journal|last1=Freeman|first1=Eric|last2=Freeman|first2=Elisabeth|last3=Kathy|first3=Sierra|last4=Bert|first4=Bates|editor2-last=Loukides|editor2-first=Mike|year=2004|title=Head First Design Patterns|url=http://shop.oreilly.com/product/9780596007126.do|volume=1|pages=|publisher=O'REILLY|accessdate=2012-06-21|format=paperback|isbn=978-0-596-00712-6|authorlink1=|authorlink2=|authorlink3=|authorlink4=|editor1-last=Hendrickson|editor1-first=Mike|editor-link1=|editor-link2=}}</ref>
# 抽象は詳細に依存してはならない。詳細(具象的な実装内容)が抽象に依存するべきである。<br/>"Abstractions should not depend on details. Details (concrete implementations) should depend on abstractions."<ref name=":0" />
 
この上位レベモジュー下位レベモジュールの''両とも''抽象に依存しなければならないと要求により内容はこの設計原理は一部それまでの人々のオブジェクト指向プログラミングに対する考え方の常識''反転''させ覆してい.ものだった<ref>{{cite journal|last1=Freeman|first1=Eric|last2=Freeman|first2=Elisabeth|last3=Kathy|first3=Sierra|last4=Bert|first4=Bates|editor2-last=Loukides|editor2-first=Mike|year=2004|title=Head First Design Patterns|url=http://shop.oreilly.com/product/9780596007126.do|volume=1|pages=|publisher=O'REILLY|accessdate=2012-06-21|format=paperback|isbn=978-0-596-00712-6|authorlink1=|authorlink2=|authorlink3=|authorlink4=|editor1-last=Hendrickson|editor1-first=Mike|editor-link1=|editor-link2=}}</ref>
この原理について述べた上記のポイント A と B の背景にある考えは、上位モジュールと下位モジュールの相互作用を設計する際に、これらの関係が抽象的な相互作用として捉えられるべきであるということであり、これによって上位モジュールだけでなく下位レベルモジュールも設計的な影響を受けることになる. 下位モジュールは相互作用を念頭に設計されるべきで、その結果自身を使用するためのインターフェースについて変更を行う必要が生じる可能性がある. 多くの場合、相互作用を抽象的な概念として捉えることにより追加のコーディングパターンを導入せずにコンポーネント間の結合を減らすことができ、より軽量で実装への依存が少ない総合作用スキーマを用いるだけで済むようになる.
 
この原理について述べた上記のポイント A と B 二点の背景にある考えは、上位モジュールと下位モジュールの相互作用を設計する際これら関係が抽象的な相互作用として捉自体も抽象的に考られべきで必要があるということであり、これによってる。上位モジュールの抽象化だけでなく下位レベルモジュールも設計的な影響、それ受け詳細化すことになる. 下位モジュールは相互作用を念頭に設計されるべきでへの見方も変えてその結果自身を使用するためのインターフェースにつの使方も更を行う必要が生じ可能性があことを求めてい. 多くの場合、相互作用を抽象的な概念として捉えることによりは、追加のコーディングパターンを導入せずに増やすことなくコンポーネント間の結合を減らせることに繋でき、る。これはより軽量で小規模な実装への依存が少ない総合性相互作用スキーマを用いるだけで済むようにな実現す.
2つのモジュールの間で見出された抽象的な相互関係が一般性を持ち、かつ一般化が意味を持つとき、この設計原理は以下の依存性の逆転コーディングパターンを導く.
 
2つのモジュール間で見出された抽象的相互関係が一般性を持ち、かつ一般化作用スキーマ汎用的な意味を持つときなしているならば、この設計原以下の依存性逆転コーディングパターンを適切な方向に導く.
 
== See also歴史 ==
依存性逆転の原則は、アメリカのソフトウェア技術者{{仮リンク|ロバート・C・マーティン|en|Robert C. Martin|label=}}によって確立され、彼の論文「オブジェクト指向設計品質指標 - Object Oriented Design Quality Metrics」内の「依存性の分析 - an analysis of dependencies」節を含んだ2000年以降の数々の出版物に記載されていた<ref>{{Cite web|url=https://linux.ime.usp.br/~joaomm/mac499/arquivos/referencias/oodmetrics.pdf|title=Object Oriented Design Quality Metrics: An analysis of dependencies|access-date=2016-10-15|last=Martin|first=Robert C.|date=|website=|publisher=|publication-date=October 1994}}</ref>。「Agile Software Development, Principles, Patterns, and Practices」「Agile Principles, Patterns, and Practices in C#」などのアジャイル系がよく知られる。
 
依存性逆転の原則と銘打たれたのは、1996年5月のC++研究論文の記事内とされている<ref>{{Cite web|url=http://www.objectmentor.com/resources/articles/dip.pdf|title=The Dependency Inversion Principle|access-date=|last=Martin|first=Robert C.|date=May 1996|publisher=C++ Report|archiveurl=https://web.archive.org/web/20110714224327/http://www.objectmentor.com/resources/articles/dip.pdf|archivedate=2011-07-14|url-status=dead|url-status-date=2018-11-12}}</ref>。
 
== 従来のレイヤーパターン ==
伝統的なアプリケーションアーキテクチャーにおいて、下位レベルコンポーネント(e.g. Utility Layer)はより複雑なシステムの構築を可能にする上位レベルコンポーネント(e.g. Policy  Layer)によって使用される形で設計がおこなわれる. この方法では上位レベルコンポーネントは直接下位レベルコンポーネントに依存する. この低レベルコンポーネントへの依存は、上位レベルコンポーネントの再利用の機会を制限してしまう.<ref name="Martin2003" />
 
[[ファイル:Traditional_Layers_Pattern.png|中央]]
 
依存性逆転パターンの目指すところは、抽象レイヤーを導入することによってこの高度に結合した状態を回避し、上位の policy layer の再利用性を高めることにある.
 
== 依存性逆転パターン ==
抽象レイヤーを加える事により、上位レベルレイヤーと下位レベルレイヤーの両方とも top から bottom に向かう従来の依存関係を減らす事ができるが、"反転" の概念は下位レベルレイヤーが上位レベルレイヤーに依存することを意味しない. 両方のレイヤーは上位レベルレイヤーが要求する振る舞いを表現した抽象に依存すべきである.
 
[[ファイル:DIPLayersPattern.png|中央]]
 
依存性逆転の直接のアプリケーションでは、抽象は上位/policy レイヤーによって所有される. このアーキテクチャーでは上位/policyコンポーネントと下位サービスを規定する抽象レイヤーを同一のパッケージとして扱う. 低レベルレイヤーはこれらの抽象クラスやインターフェースを継承して生成される.<ref name="Martin2003" />
 
依存性とオーナーシップの逆転は上位/policyレイヤーの再利用性を高め、上位レイヤーは他の低レベルサービスを利用することができるようになる. もし低レベルレイヤーがクローズドなコンポーネントであったり、アプリケーションが既存のサービスを再利用する必要がある場合、サービスと抽象レイヤーの間を仲介する[[Adapter patternパターン|Adapter]]を設けるのが一般的である.
 
== 依存性逆転パターンの一般化 ==
多くのプロジェクトにおいて依存性逆転の原則とパターンは一般化されるべき概念であると考えられる. これには少なくとも以下の2つの理由がある.
 
# 優れた考えの原則をコーディングパターンとみなすほうがよりシンプルである. ひとたび抽象クラスやインターフェースが実装されるとプログラマーは「自分は抽象化のための仕事をした」と言うかもしれない.
# 多くのユニットテストツールがモックを作成するためにインターフェースに依存しているため、クラス間のジェネリックなインターフェースを利用することは(モジュール間に限った話ではなく一般的にも)ルールになっている.
 
もし、インターフェースのみに依存するモック作成ツールを使用している場合、一般化された依存性逆転パターンが必要になることがあるが、これには大きな欠点がある.
 
# クラスに対して単純にインターフェースを実装するだけでは不十分であり、一般的に結合を減らすことにはならない. 相互作用に対しての潜在的な抽象化を考える事が唯一結合を減らす設計につながり得る.
# ジェネリックなインターフェースをプロジェクト内の全ての箇所で実装してしまうと、理解してメンテナンスをするのが非常に難しくなる. ソースコードを読む人は全てのステップにおいて「このインターフェースの他の実装はなんだろうか」と自問することになり、そしてその答えはほとんど「モックだけ」ということになりかねない.
# インタフェースの一般化はより "plumbing code" である事が要求され、一般的に依存性注入フレームワークに依存するファクトリーなどが特にそれにあたる.
# インターフェースの一般化はプログラミング言語の利用も制限する.
#
# インターフェースの一般化はプログラミング言語の利用も制限する.
 
=== 一般化における制約 ===
依存性逆転のパターン(DIP)を達成するためにインターフェースが存在することは、[[Object-oriented programming|オブジェクト指向プログラム]]において他の設計上の制約をもたらす:
 
* クラス内の全てのメンバー変数はインターフェース、もしくは抽象でなくてはならない.
* 全ての具象クラスパッケージはインターフェース、もしくは抽象クラスパッケージを通してのみ結合されなければならない
* 具象クラスを派生してはならない.
* 既に実装済みのメソッドをオーバーライドしてはならない.<ref name="Martin2003" />
* 全ての変数のインスタンス化において[[Factory methodMethod patternパターン|factoryFactory methodMethod]] もしくは[[{{仮リンク|Factory パターン|en|Factory (object-oriented programming)}}のような{{仮リンク|factory]]生成に関するパターンのような[[creational|en|Creational pattern]]}}の実装が必要になる. もしくは[[Dependency injection依存性の注入|dependency-injectionDI]] フレームワークが必要になる.
 
=== インターフェースモック化の制約 ===
継承ベースのモック化ツールを使用した場合でも以下の制約が生じる.
 
* 外部公開されている静的メンバーも体系的に依存性注入されるべきだが、そのための実装はかなり難しい.
* テスト可能な全てのモジュールはインターフェースの実装、もしくは抽象定義のオーバーライドを行う必要がある.
 
=== 将来的な方向性 ===
原則は考えるための方法であり、パターンは問題解決のための共通手段である. コーディングパターンはプログラミング言語に欠如している機能であるとみなされるかもしれない.
 
* プログラミング言語は少なくとも2つの方向で、その使用においてより正確に、より強力になる方向に進化を続けるだろう. ひとつは使用条件の強化(事前、事後、そして不変条件)、もう一つは状態ベースのインターフェースである. これらは多くの状況において、より強力な依存性逆転の応用の促進し、潜在的に単純化に寄与するだろう.
* 静的メンバーや非仮想メンバーの置き換えの問題を解決するために, 今やより多くのモック化ツールがコード注入を用いるようになっている. プログラミング言語は "mocking-conpatible" なバイトコードを生成するように今後進化するかもしれない. 一つの方向性は非仮想メンバーの使用を制限するというもの. そしてもう一つは、少なくともテストを行う状況においては、非継承ベースのモック化が可能なバイトコードを生成するというものだ.
 
== 実装 ==
DIPの2つの一般的な実装では、さまざまな意味でよく似た論理アーキテクチャを使用する.
 
直接的な実装において、 plicypolicy クラスと service 抽象クラスは一つのライブラリーにパッケージ化される. この実装では上位コンポーネントと下位コンポーネントは別々のパッケージ/ライブラリとして配布される. 上位レベルコンポーネントによって要求されるされる振る舞い/サービスを定義した[[Interfaceインタフェース (computer science抽象型)|インターフェース]]は上位レベルコンポーネントによって所有され、上位レベルコンポーネントと同じライブラリの中に存在する.
 
上位レベルコンポーネントのインターフェースは下位レベルコンポーネントによって実装されるため、コンパイル時に下位レベルコンポーネントが上位レベルコンポーネントに依存する事が必要になる. よって従来の依存関係は逆転する.
 
[[ファイル:Dependency_inversion.png|中央]]
 
Figures 1 and 2 では同じ機能を実現したコードを表現している. しかし、 Figure 2 ではインターフェースは依存性を逆転させるために使用されている. policy コードの再利用性を最大化したり、循環依存を排除するために依存の方向は選択することができる.
 
このバージョンの DIP では、下位レイヤーコンポーネントが上位レベルレイヤーのインターフェース/抽象に依存しているため、下位レベルレイヤーの再利用は困難になる. この実装はそのわりに伝統的な to-to-bottom の依存関係を反対の bottom-to-top へと逆転させる.
 
抽象コンポーネントをライブラリやパッケージから独立させて置くと、より柔軟性が増す.
 
[[ファイル:DIPLayersPattern_v2.png|中央]]
 
全てのレイヤーを分離して個別のパッケージに置くことでどのレイヤーの再利用性も向上し、ロバストネス性とモビリティーを得ることができる.<ref name="Martin2003" />
 
== 例 ==
 
=== 家系モジュール ===
ある家系システムでは人々の間の関係を第一レベル関係のグラフとして表現するかもしれません. ない(父親/息子, 父親/娘, 母親/息子, 母親/娘, 夫/妻, 妻/夫...). これは非常に効率的です. ある(そして拡張も可能: 元夫/元妻, 法的保護者...)
 
しかし、上位レベルモジュールでは家系をブラウズするためのより簡単な方法が必要になるかもしれませんない: 人には、子供、父親、母親、兄弟と姉妹(異母兄弟を含む含まないも合わせて)、祖父、祖母、伯父、伯母、従兄弟... などがいるかもしれません. ない。
 
家系モジュールの使用法に応じて、共通の関係を明確で直接的な属性として(グラフを隠して)表示することは上位レベルモジュールと家系モジュールの間の結合を遥かに軽くでき、モジュールの使用になんの影響も与えることなく内部表現を完全に変更することを可能にしま. る。またそれによって、家系モジュールに対し兄弟、姉妹(異母兄弟であるかどうか)の正確な定義を埋め込む事が可能になります... またそれは[[Single responsibility principle|単一責務の法則]]を強制することにも繋がります.る。
 
最終的に、もし最初の一般化された拡張可能なグラフアプローチが一番拡張可能に思えるのであれば、家系モジュールの利用は更に特殊化及び単純化された関係の実装がアプリケーションに対して十分であることを示しているかもしれませんないし、より効率的なシステムを作成する手助けになるかもしれません.ない。
 
この例でのモジュール間の相互関係の抽象化は下位レベルモジュールのインターフェースの単純化だけでなく、より単純化された実装につながるかもしれません.ない。
 
=== リモートファイルサーバクライアント ===
リモートファイルサーバー(FTP, cloud strage ...)に対するクライアントを実装しなければならないケースを想像してください. せよ。あなたはそのクライアントに抽象インターフェースを持たせる事を考えるでしょだろ.
 
# Connection/Disconnection (a connection persistence layer may be needed)
103 ⟶ 108行目:
# File history management ...
 
ローカルファイル、リモートファイルの両方が同じ抽象インターフェースを提供する場合、ローカルファイルと完全に実装された依存性逆転パターンを使用するどんな上位レベルモジュールもローカルとリモートの区別なくファイルにアクセスすることが可能になります.る。
 
ローカルディスクは一般的にフォルダーを使用します、リモートストレージもフォルダーを使用するかもしれませんない(もしくはタグのみ、フォルダーとタグの両方など). もし可能であればそれらを統一する方法を決めておく必要があります.る。
 
リモートファイルに対しては、作成と置換のみを行う必要があるかもしれません.ない(ローカルファイルに比べてリモートファイルのランダムアップデートはあまりに遅く、実装も難しくなる可能性があるので、リモートファイルの更新は意味をなさない) リモートファイルに対して部分的な読み込みと書き込みを行う必要があるかもしれませんない(少なくともリモートファイルモジュールの内部では通信中断後のダウンロードとアップロードの再開をできるようにする必要がある). しかし、ローカルキャッシュを利用している場合を除き、ランダムリードは適しません.さない。
 
ファイル検索は "pluggable" であるかもしれません:ない ファイル検索は OS、特にタグや全文検索に依存し、異なるシステムでも実装する事ができます. る。(OS に組み込まれていたり、別に入手する事も可能) 並行実行される置換または削除の検出は、他の抽象インタフェースに影響を与える可能性があります.る。
 
概念的なそれぞれのインターフェースに対してリモートファイルサーバーを設計するときは、上位レベルモジュールが要求するサービスのレベル (必ずしも全てが要求されるわけではない)を良く考える必要があります. る。そして、どのようにリモートファイルサーバーの機能を実装するかだけでなく、アプリケーション内に既に存在するファイルサービス(ローカルファイル、既にあるクラウドクライアントなど)と新たしいリモートファイルサーバークライアントの間で整合を取るかについても同様に考える必要があります.る。
 
必要なインターフェースの設計が完了したら、リモートファイルサーバークライアントはこれらのインターフェースを実装すべきです.ある。
 
また、既に存在するローカルファイルに対しての機能 (例えばファイル更新など)について制限を加えたい場合、同じ抽象インタフェースを提供するローカルまたは他の既存のリモートファイルアクセスモジュール用のアダプタを記述する必要があるかもしれません. ない。また、コンピュータ上に構成されている利用可能なファイル互換システムを検索するために独自のファイルアクセス列挙子を記述しておく必要もあります.る。
 
これらが完了すると、アプリケーションはドキュメントをローカルとリモートに透過的に保存する事が可能になります. る。さらに簡単に言うと、新しいファイルアクセスインターフェースを使用している上位レベルモジュールは使用の際にローカルとリモートファイルにアクセルするシナリオを意識する必要がなくなり、再利用性が向上しま.る。
 
注意: 多くの OS がこの手の機能を実装し始めているため、新規実装のクライアントをこの既に存在している抽象モデルへ適用するのは控えた方が良いかもしれません.ない。
 
この例では、モジュールを抽象インターフェースのセットとして考え、このインターフェースのセットに他のモジュールを適合させることで、様々なファイルストレージシステムに対し、共通のインターフェースを提供する事ができます.る。
 
=== Model View Controller ===
 
[[ファイル:DIP_concrete_example.png|中央|Example of DIP]]
 
UI とアプリケーションレイヤーパッケージは主に具象クラスを含んでいて、コントローラーは抽象/インターフェース型を含んでいます. る。また UI は ICustomerHandler のインスタンスを保持し、全てのパッケージは物理的に分離されていてアプリケーションレイヤーには Page クラスが使用する具象クラスの実装が存在しています. る。これらのインターフェースのインスタンスは (コントローラーと同じパッケージに存在するかもしれない)Factory によって動的に生成されます. る。具象タイプである Page と CustomerHandler はお互いに依存してはらなず、両方とも ICustomerHandler に依存しま.る。
 
これらの直接的な効果は、UI が直接 ApplicatonLayer や、ICustomerHandler を実装したどの具象パッケージも参照する必要がない事です. ある。コンクリートクラスはリフレクションを使用してロードされます.  る。またどの時点であっても、具象実装は UI クラスに変更を及ぼさずに他の具象実装に差し替える事ができます. る。他の興味深い可能性は Page クラスが ICustomerHander のメソッドに引数として渡す事ができるインターフェース IPageViewer を実装していると言う事で、これによってt具象実装は具象的な依存なしに UI と通信する事ができます. る。何故なら両者はインターフェースでリンクされているからです.ある。
 
== 関連するパターン ==
依存性逆転の原則の適用はアダプターパターンの一例と見ることもできます. る。例えば、上位レベルクラスが自身が依存する抽象への固有のアダプターインターフェースを定義するような場合がそれに当たります. る。アダプティーの実装はまたアダプターインターフェスに依存しますが(もちろん、このインターフェースを実装しているので)独自の下位レベルモジュール内のコードを用いて実装を行うこともできます. る。上位レベルモジュールは、アダプティーとその下位レベルモジュールによって実装されたインターフェースへのポリモーフィックな関数を呼び出すことによってアダプターインターフェースを介して間接的に下位レベルモジュールを利用するため、上位レベルモジュールが下位レベルモジュールに依存するといったことはありません.ない。
 
Plugin, [[Service locatorLocator patternパターン|Service Locator]], or [[依存性の注入|Dependency Injection]] などの様々なパターンは上位レベルコンポーネントに対する選択された下位レベルコンポーネントの "run-time provisioning" を容易にする目的で導入されます.る。
 
== History出典 ==
The dependency inversion principle was postulated by [[Robert C. Martin]] and described in several publications including the paper ''Object Oriented Design Quality Metrics: an analysis of dependencies'',<ref>{{Cite web|url=https://linux.ime.usp.br/~joaomm/mac499/arquivos/referencias/oodmetrics.pdf|title=Object Oriented Design Quality Metrics: An analysis of dependencies|access-date=2016-10-15|last=Martin|first=Robert C.|date=|website=|publisher=|publication-date=October 1994}}</ref> an article appearing in the C++ Report in May 1996 entitled ''The Dependency Inversion Principle'',<ref>{{Cite web|url=http://www.objectmentor.com/resources/articles/dip.pdf|title=The Dependency Inversion Principle|access-date=|last=Martin|first=Robert C.|date=May 1996|website=|publisher=C++ Report|archive-url=https://web.archive.org/web/20110714224327/http://www.objectmentor.com/resources/articles/dip.pdf|archive-date=2011-07-14}}</ref> and the books ''Agile Software Development, Principles, Patterns, and Practices'', and ''Agile Principles, Patterns, and Practices in C#''.
 
== See also ==
 
* [[Adapter pattern]]
* [[Dependency injection]]
* [[Design by contract]]
* [[Interface (computing)|Interface]]
* [[Inversion of control]]
* [[Plug-in (computing)]]
* [[Service locator pattern]]
* [[SOLID (object-oriented design)|SOLID]] &#x2013; the "D" in "SOLID" stands for the dependency inversion principle
 
== References ==
{{Reflist}}
 
== External links関連項目 ==
* [[Adapter patternパターン]]
* [[依存性の注入]]
* [[契約プログラミング|契約による設計]]
* [[インタフェース (情報技術)]]
* [[制御の反転]]
* [[プラグイン]]
* {{仮リンク|サービスロケータパターン|en|Service locator pattern}}
* [[SOLID]]
* [[インベンターのパラドックス]]
 
== 外部リンク ==
* [https://linux.ime.usp.br/~joaomm/mac499/arquivos/referencias/oodmetrics.pdf Object Oriented Design Quality Metrics: an analysis of dependencies Robert C. Martin, C++ Report, Sept/Oct 1995]
* [https://web.archive.org/web/20110714224327/http://www.objectmentor.com/resources/articles/dip.pdf The Dependency Inversion Principle, Robert C. Martin, C++ Report, May 1996]
160行目:
* [http://martinfowler.com/articles/dipInTheWild.html DIP in the Wild, Brett L. Schuchert, May 2013]
* [http://blog.sebaslab.com/tag/dependency-injection/ IoC Container for Unity3D – part 2]
{{SOLID (オブジェクト指向設計)}}
 
{{デフォルトソート:いそんせいきやくてんのけんそく}}
<!--Categories-->
[[Category:Software design patternsソフトウェアパターン]]
[[Category:Programming principlesプログラミング原則]]