さまざまな言語でOOP)はまあまあですが、Javaはかなり新しいものです。
私はクラスのコード内に多数のオブジェクトが作成される多くのチュートリアルを読んでいますが、それらを実行しようとしていますが、チュートリアルでクラスのバージョンを構築します。クラス自体。
しかし、Javaは、私がこれまで使用してきた他の言語とは異なり、ほとんどすべてがオブジェクトです。文字どおりすべてを注入しようとすると、結果は非常に面倒でわかりにくくなります。
明らかに、あなたはStringオブジェクトをインジェクトしないでしょう、そしてインジェクトしない他のオブジェクトがあると思いますが、行がどこに行くべきかわかりません。どの時点で、DIは正しいことをやめ、いつ負荷がかかり始めますか?何を注入し、何をインスタンス化するかを実用的にどのように決定しますか?
参考までに、私が実行しているチュートリアルは http://edn.embarcadero.com/article/31995 および http://docs.Oracle.com/javase/tutorial/networking/です。 sockets/clientServer.html は単純なクライアントとサーバーを構築するためのものです。私はそれらを行ごとにコピーしていませんが、ベストプラクティスに従う同等のクラスを作成しようとしています
.Net(これはすべてがオブジェクトであるという点で似ています)では、主にドメインオブジェクト(エンティティ、リポジトリ、サービス)とアプリケーションオブジェクト(コントローラー、ビューモデル)でDIを使用するため、リポジトリ/サービスがコントローラーに注入されます/ viewモデルなど。これは、私のビジネスロジックとアプリケーションロジックが完全にテスト可能であることを意味します。これが、私がDIを使用する主な理由です。
基本的に、あなたが注入し、物を注入するオブジェクトは、ほとんどがあなたが構築しているソリューションに特有のオブジェクトです。一部のオブジェクトが言語またはフレームワーク(.Netなど)に対して「ネイティブ」である場合、おそらくそれを注入する必要はありません。多くのオブジェクトは、データを表すために文字列を必要とします。文字列は基本的に、ドメインに固有ではない「言語機能」です。同じことは、列挙型、リスト、配列など、システムの残りの部分から分離してクラスを実行する場合に変更する必要のない他の多くのものにも当てはまります。
確認する最も重要なことは、ドメイン/アプリケーションクラス間の結合です。オブジェクトが密結合をもたらさない場合、通常はそれを作成するだけで安全です。結合をチェックする方法の1つは、クラス内のメソッドを分離して実行することです(これは基本的にユニットテストです)。テストするクラスが実際にシステムから分離して実行されていることを確認するために、DI化する必要があるのは、モックアウトする必要があるすべての依存関係です。
まず、新しいキーワードを使用しても問題ありません。 DIは素晴らしいテクニックですが、使いすぎたくなる誘惑があります。 DIを使用する可能性があるのは次のような場合です。
ダブルスのテスト-ユニットテストでは、サードパーティのリソース(フルOracle DBなど)を起動したくないため、サードパーティのリソースをモックアウト/テストすることがよくあります。たとえば、大きなOracle DBへの新しいデータベース接続を作成する代わりに、その接続をHSQL(メモリデータベース内)への接続に置き換えることができます。
そのオブジェクトのスコープ(〜ライフスパン)を制御したい場合、自然なJavaオブジェクトのライフサイクルは機能しません。多くのJavaベースのDIフレームワークこれを許可します。
シングルトンが必要な場合。
ファクトリー、サービスロケーターなどが必要だと思うときはいつでも。これには、異なるファクトリが必要な場合も含まれます(まれですが、起こります)。
それ以外の場合は、単に新しいオブジェクトを作成します。実際に疑わしい場合は、新しいオブジェクトを作成します。後で必要になったときにいつでもDIを使用できます:-)。
一般に、クラスは他の1つのクラスからのみnew
'dする必要があります。
これは、依存関係注入の道を進むと、new
を使用しているすべてのオブジェクトが、作成するオブジェクトのすべての依存関係を注入する必要があるためです。つまり、親オブジェクトはこれらの依存関係もすべて知っている必要があります。 A
がB
に依存していて、C
がA
インスタンスをnew
で作成する場合、C
は自動的にB
がC
を直接使用しない場合でも、B
への依存関係。まず、C
の唯一の仕事がA
sを作成することでない限り、それは懸念の分離に違反します。それ以外の場合、依存関係をA
に追加する場合に問題が発生します。これは、依存関係を作成するすべてのものが同じ依存関係を追加する必要があるためです。彼らは本当にそれについて心配すべきではありません。 C
にAFactory
への依存関係を宣言させ、AFactory
にB
への依存関係を持たせることをお勧めします。次に、依存関係をA
に追加して、変更する必要があるのはAFactory
だけです。
Wikipedia から:
依存関係注入パターンの主な目的は、コンパイル時ではなく、実行時に、または構成ファイルを介して、特定の依存関係インターフェースの複数の実装から選択できるようにすることです。このパターンは、テスト時に複雑なコンポーネントのスタブテスト実装を提供するのに特に役立ちますが、プラグインコンポーネントの検索や、初期化と検索によく使用されます。
文字列をインジェクトする必要はありません。それらをパラメータとして関連メソッドに渡すだけです。設定からアパート、データを注入する必要はありません。
優れた単体テストは、エラーを特定するのに役立ちます。そのため、コードを他のコードユニットとは別にテストする必要があります。 DIはこれを達成するのに役立ちます。