5歳児への依存性注入を説明するには?[閉まっている]


208

依存性注入を説明する良い方法は何ですか?

Googleでいくつかのチュートリアルを見つけましたが、読者が単なるJava初心者であると想定するチュートリアルはありませんでした。これを初心者にどのように説明しますか?


72
あの子はつらい人生を送っているように聞こえる...
ire_and_curses '28 / 10/28

24
「かつての.....」から始める
マーティン

1
私たちはJava初心者について話しているのですか、それとも5歳の文字通りですか?
ドリュー

2
#依存性注入#学習者の年齢に依存しない、それはすべての人に
共通

2
Rakesh:JavaOne 2009の紹介ビデオは、Javaが「どこでも」「簡単」であるので、13年でもJava開発者になることができるという前提に基づいて構築されています。
-Esko、

回答:


789

5歳児に依存症注射をします。

冷蔵庫から出て自分で物を取り出すと、問題が発生する可能性があります。ドアを開けたままにしておくと、ママやパパが欲しくないものを手に入れるかもしれません。私たちが持っていないものや期限切れのものを探しているかもしれません。

あなたがしなければならないことは、「昼食と一緒に飲むものが必要です」という必要性を述べることです。それから、あなたが座って食べるときに何かがあることを確認します。


93

これはどうですか?

クラスがEmployeeあり、この従業員がいるAddress 場合Employee、次のようにクラスを定義できます。

class Employee {
    private Address address;

    // constructor 
    public Employee( Address newAddress ) {
        this.address = newAddress;
    }

    public Address getAddress() {
    return this.address;
    }
    public void setAddress( Address newAddress ) {
        this.address = newAddress;
    }
}

これまでのところすべてが正常に見えます。

このコードは、従業員と彼の住所とのHAS-A関係を示しています。

現在、このHAS-A関係は、それらの間に依存関係を作成しました。問題はコンストラクター内にあります。

Employeeインスタンスを作成するたびに、インスタンスが必要になりAddressます。

 Address someAddress = ....
 Employee oscar = new Employee( someAddress ); 

この方法での作業は、特に 単体テストを実行する場合に問題になります。

主な問題は、特定の1つのオブジェクトをテストする必要がある場合、他のオブジェクトのインスタンスを作成する必要がある場合、そしてそれを行うにはさらに他のオブジェクトのインスタンスを作成する必要がある場合がほとんどです。チェーンが管理できなくなる可能性があります。

これを回避するには、次のようにコンストラクタを変更します。

  public Employee(){
  }

引数なしのコンストラクターを使用します。

次に、必要なときにいつでもアドレスを設定できます。

 Address someAddress = ....
 Employee oscar = new Employee();
 oscar.setAddress( someAddress ); 

いくつかの属性がある場合、またはオブジェクトの作成が難しい場合は、これがドラッグになる可能性があります。

しかし、これについて考えてみましょう。たとえば、次のDepartment属性を追加します。

  class Employee {
      private Address address;
      private Department department;

  ....

300人の従業員がいて、全員が同じ部門を持っている必要があり、さらにその同じ部門が他のいくつかのオブジェクト(部門の会社リストや各部門の役割など)の間で共有されている必要がある場合は、Departmentオブジェクトの可視性に苦労し、オブジェクトのすべてのネットワークを介してそれを共有する。

どのような依存性の注入は、それについてのすべてが順調にあなたを助けるために、ある「注入」のコードでこれらの依存関係。ほとんどのフレームワークでは、注入するオブジェクトを外部ファイルで指定することで、これを行うことができます。

架空の依存関係インジェクターのプロパティファイルを想定します。

  #mock employee
  employee.address = MockAddress.class
  employee.department = MockDepartment.class

  #production setup 
  employee.address = RealAddress.class
  employee.department = RealDepartment.class

特定のシナリオで何を注入するかを定義します。

Dependency Injectorフレームワークが行うことは、正しいオブジェクトを設定することです。そのため、コードsetAddressやを作成する必要はありませんsetDepartment。これは、リフレクション、コード生成、その他の手法のいずれかによって行われます。

したがって、次にEmployeeクラスをテストする必要があるときは、すべてのテストのすべてのセット/取得をコーディングする必要なく、モックAddressDepartmentsオブジェクトを注入できます。さらに良いことに、実際の オブジェクトAddressDepartmentオブジェクトを本番コードに挿入でき、テストされたとおりにコードが機能することを確信できます。

それはほとんどそれについてです。

それでも、この説明はあなたが要求した5歳には適していないと思います。

それでもお役に立てば幸いです。


3
または:依存性注入とは、依存関係を設定するものがある場合です。これは通常フレームワークです。:)
OscarRyz

2
とてもスマートなものです。
OscarRyz

24

クラスを書くとき、他のオブジェクトを利用するのは自然なことです。たとえば、データベース接続、または使用するその他のサービスがある場合があります。これらの他のオブジェクト(またはサービス)は依存関係です。コードを記述する最も簡単な方法は、他のオブジェクトを作成して使用することです。ただし、これは、オブジェクトがそれらの依存関係に対して柔軟性のない関係を持っていることを意味します。オブジェクトを呼び出す理由に関係なく、同じ依存関係を使用します。

より強力な手法は、オブジェクトを作成して、使用する依存関係を提供できるようにすることです。したがって、使用するデータベース接続を作成し、それをオブジェクトに渡すことができます。このように、さまざまなタイミングでさまざまな依存関係を持つオブジェクトを作成して、オブジェクトをより柔軟にすることができます。これは依存関係の注入であり、依存関係をオブジェクトに「注入」します。

ちなみに、flickr写真を使用してコンセプトを説明する現代のプレゼンテーションスタイルでは、これは中毒者が麻薬で自分自身を撃つことで説明できます。ああ、待ってください、それはインジェクション依存です... OK、申し訳ありません、悪い冗談。


10

簡単なチュートリアルは知りませんが、250ワード以下の25種類のバージョンを提供できます。

依存性注入では、オブジェクトはすでに知っていることに基づいて独自のコンポーネントを構成するのではなく、オブジェクトはより高いレベルのロジックによって構成され、組み込みの予知がなかったコンポーネントを呼び出します。目的は、オブジェクトをコンポーネントではなくアプリケーションではなく、構成タスクをより高いレベルに再配置することです。これにより、オブジェクトは将来、または異なる構成で役立つ可能性が高くなります。

これはテストに適していますが、アプリケーションを修正する時期になると、より優れています。典型的な実装では、構成をXMLに入れ、フレームワークを使用してクラスを動的にロードします。


7

新しいニンテンドーを入手したら、ボタンとタッチスクリーンを使用してゲームをプレイできます。

しかし、任天堂の工場では、組み立て方を知っている必要があります。

工場の賢い人がニンテンドーDSを持ち出すとき、それは内部では異なりますが、それでもその使い方を知っています。


5
これはインターフェースやポリモーフィズムの説明のように聞こえますが、5歳児にとって実際に理解できることを認めています。
Natix 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.