制御の反転とは何ですか?また、いつ使用する必要がありますか?


64

新しいシステムを設計していますが、制御の反転(IOC)とは何か、さらに重要なこととして、それをいつ使用するかを知りたいです。

インターフェイスで実装する必要がありますか、それともクラスで実行できますか?


回答:


62

IoC(WikipediaのInversion of Controlを参照)は、コンポーネントに必要な情報や機能がないためにコンポーネントがタスクを完全に実行できない場合に適用できます。

IoCパターンの最も単純な例は、Cのコールバック関数です。たとえば、関数を宣言できます。

void Iterator(void *list, Func* f)

各アイテムに関数をlist適用することを繰り返しfます。Iterator各項目が処理されるのか分からない関数は、あなただけの引数としての機能を提供し、それはそれらを処理します。

前の例が示すように、IoCを使用すると、プログラムを、互いに認識していない個別のコンポーネントに分離できます。最も一般的なバージョンのいずれかIOCがあるDependecyインジェクション

では依存性注入の各コンポーネントは、それのタスクを実行するために必要な依存関係のリストを宣言する必要があります。実行時に、IoCコンテナと呼ばれる特別なコンポーネント(通常)がこれらのコンポーネント間のバインディングを実行します。公開されたコンポーネントの依存関係の値を提供しようとします。

擬似コードの例を次に示します。

class Foo 
{ 
   <Require Boo>Constructor(Boo boo){ boo.DoSomething } 
}

この例のクラスにFooは、Boo何らかのアクションを実行するためにタイプの引数を必要とするコンストラクターがあります。

次のFooようなコードを使用して、クラスのインスタンスを作成できます。

MyContainer.Create(typeof Foo)

MyContainer-はIoC Containerで、インスタンスの取得BooFooコンストラクターへの引き渡しを行います。

要約すると、IoCを使用すると、プログラムを個別の部分に分離できます。これは良い理由です:

  • コンポーネントは独立して簡単にテストできます。
  • プログラムの複雑さを軽減できます。
  • コンポーネントを別の実装に切り替えることができます。

ただし、場合によっては、IoCによってコードが理解しにくくなることがあります。

IoCの実際の使用例が見たい場合は、Mircosoft Composite UI Application BlockCompositeWPFをご覧ください

私の説明がお役に立てば幸いです。

よろしく、
aku


1
5年後ですが、それでも....それは素晴らしい説明でした。ありがとう。
ニックホッジズ

4
IoCについては、コードが読みにくくなるという事実についてはあまり言及されていません。優れたソフトウェアを作成する場合、読みやすさが最優先事項です。それはテスタビリティよりも優れています。コードはその有用性をはるかに超えて分離できます。
アルネエバーツソン14

それで、すべての依存関係にインターフェイスベースのソリューションを使用するコードもIoC設計に基づいていますか?
ニケル

18

最近自分自身でこれを掘り下げて、すべてのブックマークを保持していたので、IOC / DIについて学ぶのに非常に貴重であることがわかりました。

IOC / DIに関するMartin Fowlersのオリジナル記事

最初に知っておくべきいくつかの概念

IOC / DIチュートリアルの優れたコレクション

マニングプレスのIOC / DIに関する書籍

独自のIOCの作成方法のソースと説明 -ソースコードの読み取りは、常に概念を理解するための最良の方法です。


4

ちょっとJMS、基本的にIoC / DIを使用すると、使用する実装を1回定義し、参照するたびに参照するコンテナーの静的コピーを保持できます。

ウィキペディアはおそらくあなたを助けますが、私はあなたの2番目の部分を参照したいと思います-はい、依存性注入はクラスに対して行うことができます(つまり、このクラスタイプをメソッドに渡す必要があるたびに、このクラスを使用します)が、インターフェースを使用します。その方法では、セットアップで再参照するだけで、使用しているプロバイダー、リポジトリなどのバージョンを変更できます。

IE、ストリームを読み込むためのインターフェイスがあり、XMLStreamReaderとSQLStreamReaderの実装があったとしましょう。次に、インターフェイスへの参照をメソッドに渡し、IoCコンテナーで使用するものを指定します。

したがって、パブリックリストReadPeople(IStreamReader reader)を使用して、IStreamReaderがSQLStreamReaderを使用することを期待するたびに、IoCコンテナーのセットアップでそれを指定できます。

その後、後で気が変わった場合は、1か所(コンテナのセットアップ)で変更するだけでよく、IStreamReaderを要求するメソッドの数に関係なく、常にコンテナに指示したデフォルトを取得します。提供する。


3

システムがビジネスが有効かどうかを確認するためのバリデーターを持っているとしましょう。「BusinessValidator」には、ビジネスの住所部分を検証するタイプAddressValidatorのフィールドがある場合があります。外部コード(つまり、addressValidatorコード)を実行せずにBusinessValidatorをテストする場合、フレームワークで何らかのIoC / DIを使用している場合は、その場所に模擬addressValidatorを簡単に「注入」でき、テストを心配する必要はありません。テスト対象のクラスの範囲外のコード。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.