依存性注入を説明する良い方法は何ですか?
Googleでいくつかのチュートリアルを見つけましたが、読者が単なるJava初心者であると想定するチュートリアルはありませんでした。これを初心者にどのように説明しますか?
依存性注入を説明する良い方法は何ですか?
Googleでいくつかのチュートリアルを見つけましたが、読者が単なるJava初心者であると想定するチュートリアルはありませんでした。これを初心者にどのように説明しますか?
回答:
これはどうですか?
クラスが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
クラスをテストする必要があるときは、すべてのテストのすべてのセット/取得をコーディングする必要なく、モックAddress
とDepartments
オブジェクトを注入できます。さらに良いことに、実際の オブジェクトAddress
とDepartment
オブジェクトを本番コードに挿入でき、テストされたとおりにコードが機能することを確信できます。
それはほとんどそれについてです。
それでも、この説明はあなたが要求した5歳には適していないと思います。
それでもお役に立てば幸いです。
クラスを書くとき、他のオブジェクトを利用するのは自然なことです。たとえば、データベース接続、または使用するその他のサービスがある場合があります。これらの他のオブジェクト(またはサービス)は依存関係です。コードを記述する最も簡単な方法は、他のオブジェクトを作成して使用することです。ただし、これは、オブジェクトがそれらの依存関係に対して柔軟性のない関係を持っていることを意味します。オブジェクトを呼び出す理由に関係なく、同じ依存関係を使用します。
より強力な手法は、オブジェクトを作成して、使用する依存関係を提供できるようにすることです。したがって、使用するデータベース接続を作成し、それをオブジェクトに渡すことができます。このように、さまざまなタイミングでさまざまな依存関係を持つオブジェクトを作成して、オブジェクトをより柔軟にすることができます。これは依存関係の注入であり、依存関係をオブジェクトに「注入」します。
ちなみに、flickr写真を使用してコンセプトを説明する現代のプレゼンテーションスタイルでは、これは中毒者が麻薬で自分自身を撃つことで説明できます。ああ、待ってください、それはインジェクション依存です... OK、申し訳ありません、悪い冗談。
簡単なチュートリアルは知りませんが、250ワード以下の25種類のバージョンを提供できます。
依存性注入では、オブジェクトはすでに知っていることに基づいて独自のコンポーネントを構成するのではなく、オブジェクトはより高いレベルのロジックによって構成され、組み込みの予知がなかったコンポーネントを呼び出します。目的は、オブジェクトをコンポーネントではなくアプリケーションではなく、構成タスクをより高いレベルに再配置することです。これにより、オブジェクトは将来、または異なる構成で役立つ可能性が高くなります。
これはテストに適していますが、アプリケーションを修正する時期になると、より優れています。典型的な実装では、構成をXMLに入れ、フレームワークを使用してクラスを動的にロードします。
新しいニンテンドーを入手したら、ボタンとタッチスクリーンを使用してゲームをプレイできます。
しかし、任天堂の工場では、組み立て方を知っている必要があります。
工場の賢い人がニンテンドーDSを持ち出すとき、それは内部では異なりますが、それでもその使い方を知っています。