1. ホーム
  2. oop

[解決済み] Inversion of Controlとは?

2022-03-18 18:17:48

質問

IoC(Inversion of Control)は、初めて遭遇すると非常に混乱することがあります。

  1. 何ですか?
  2. どのような問題を解決するのですか?
  3. どのような場合に使用するのが適切で、どのような場合に使用しないのが適切か?

どのように解決するのですか?

その Inversion-of-Control (IoC) パターンを提供することです。 あらゆる種類の callback (を直接操作するのではなく(つまり、反転させたり、外部のハンドラ/コントローラに制御を移す)、(反応を制御するもの)です。その Dependency-Injection (DI) パターンは、IoCパターンをより具体的にしたもので、コードから依存性を取り除くことを目的としています。

<ブロッククオート

すべての DI の実装は、以下のように考えることができます。 IoC と呼ぶべきではありません。 IoC なぜなら、Dependency-Injectionの実装はコールバックよりも難しいからです(一般的な用語であるIoCを使用して、製品の価値を下げないようにしましょう)。

例えば、DIの例として、アプリケーションにテキストエディタのコンポーネントがあり、スペルチェックを行いたい場合を考えてみましょう。標準的なコードは次のようなものでしょう。

public class TextEditor {

    private SpellChecker checker;

    public TextEditor() {
        this.checker = new SpellChecker();
    }
}

ここで行ったことは、各要素の間に依存関係を作ることです。 TextEditorSpellChecker . IoCのシナリオでは、代わりに次のようなことをします。

public class TextEditor {

    private IocSpellChecker checker;

    public TextEditor(IocSpellChecker checker) {
        this.checker = checker;
    }
}

最初のコード例では SpellChecker ( this.checker = new SpellChecker(); ) を意味します。 TextEditor クラスは直接 SpellChecker クラスがあります。

2つ目のコード例では、抽象化を行うために SpellChecker の依存クラスは TextEditor のコンストラクタのシグネチャを変更します (クラス内で依存関係を初期化しない)。これにより、依存関係を呼び出してから TextEditor クラスに渡すことができるようになります。

SpellChecker sc = new SpellChecker(); // dependency
TextEditor textEditor = new TextEditor(sc);

ここで、クライアントが TextEditor クラスは、どの SpellChecker の実装に注入しているので、それを使うことになります。 TextEditor シグネチャを使用します。