依存性注入の簡単な紹介:それは何であり、いつそれを使用するか

前書き

ソフトウェアエンジニアリングでは、依存性注入は、あるオブジェクト(または静的メソッド)が別のオブジェクトの依存性を提供する手法です。依存関係は、使用できるオブジェクト(サービス)です。

これはウィキペディアの定義ですが、それでも理解するのは特に簡単ではありません。それで、それをよりよく理解しましょう。

プログラミングでそれが何を意味するのかを理解する前に、概念をよりよく理解するのに役立つので、まず一般的にそれが何を意味するのかを見てみましょう。

依存関係または依存関係とは、サポートのために何かに依存することを意味します。私たちが携帯電話に依存しすぎていると言っても、それは私たちが携帯電話に依存していることを意味します。

したがって、依存性注入に入る前に、まずプログラミングにおける依存性の意味を理解しましょう。

クラスAがクラスBの一部の機能を使用する場合、クラスAにはクラスBの依存関係があると言われます。

Javaでは、他のクラスのメソッドを使用する前に、まずそのクラスのオブジェクトを作成する必要があります(つまり、クラスAはクラスBのインスタンスを作成する必要があります)。

したがって、オブジェクトを作成するタスクを他の誰かに転送し、依存性を直接使用することを依存性注入と呼びます。

依存性注入を使用する必要があるのはなぜですか?

車輪やエンジンなどのさまざまなオブジェクトを含む車のクラスがあるとします。

ここで、carクラスはすべての依存関係オブジェクトを作成する責任があります。では、将来的にMRFWheelsを廃止し、横浜ホイールを使用したい場合はどうでしょうか。

横浜の新しい依存関係で車のオブジェクトを再作成する必要があります。ただし、依存性注入(DI)を使用する場合は、実行時にWheelsを変更できます(依存性はコンパイル時ではなく実行時に注入できるため)。

DIは、優先ホイールオブジェクトを作成し、それをCarクラスに提供するすべての作業を行うコードの仲介者と考えることができます。

これにより、Carクラスは、Wheels、Batteryなどのオブジェクトの作成から独立します。

依存性注入には基本的に3つのタイプがあります。

  1. コンストラクターの注入:依存関係はクラスコンストラクターを介して提供されます。
  2. セッターインジェクション:クライアントは、インジェクターが依存関係をインジェクトするために使用するセッターメソッドを公開します。
  3. インターフェイスインジェクション:依存関係は、渡されたクライアントに依存関係を注入するインジェクターメソッドを提供します。クライアントは、依存関係を受け入れるsetterメソッドを公開するインターフェースを実装する必要があります。

したがって、依存性注入の責任は次のとおりです。

  1. オブジェクトを作成する
  2. どのクラスがそれらのオブジェクトを必要とするかを知る
  3. そしてそれらすべてのオブジェクトを提供します

オブジェクトに変更がある場合、DIはそれを調べ、それらのオブジェクトを使用するクラスに関係するべきではありません。このように、オブジェクトが将来変更された場合、適切なオブジェクトをクラスに提供するDIの責任があります。

制御の反転—DIの背後にある概念

これは、クラスがその依存関係を静的に構成するべきではなく、外部から他のクラスによって構成されるべきであることを示しています。

これはSOLIDの5番目の原則です—ボブおじさんによるオブジェクト指向プログラミングと設計の5つの基本原則—クラスは具体化(簡単に言えば、ハードコードされている)ではなく抽象化に依存する必要があると述べています。

原則によれば、クラスはその責任を果たすことに集中する必要があり、それらの責任を果たすために必要なオブジェクトを作成することに集中する必要はありません。そして、そこで依存性注入が機能します。それは、クラスに必要なオブジェクトを提供します。

注:ボブおじさんによるSOLIDの原則について知りたい場合は、このリンクにアクセスしてください。

DIを使用する利点

  1. ユニットテストに役立ちます。
  2. 依存関係の初期化はインジェクターコンポーネントによって行われるため、ボイラープレートコードが削減されます。
  3. アプリケーションの拡張が容易になります。
  4. アプリケーションプログラミングで重要な疎結合を有効にするのに役立ちます。

DIのデメリット

  1. 学ぶのは少し複雑で、使いすぎると管理上の問題やその他の問題につながる可能性があります。
  2. 多くのコンパイル時エラーは実行時にプッシュされます。
  3. 依存性注入フレームワークは、リフレクションまたは動的計画法で実装されます。これにより、「参照の検索」、「呼び出し階層の表示」、安全なリファクタリングなどのIDE自動化の使用が妨げられる可能性があります。

依存性注入を独自に実装することも(Pure Vanilla)、サードパーティのライブラリまたはフレームワークを使用することもできます。

DIを実装するライブラリとフレームワーク

  • 春(Java)
  • Google Guice(Java)
  • ダガー(JavaおよびAndroid)
  • キャッスルウィンザー(.NET)
  • Unity(.NET)

依存性注入の詳細については、以下のリソースを確認してください。

Java依存性注入— DIデザインパターンのサンプルチュートリアル— JournalDev

Javaでの依存性注入の使用—はじめに—チュートリアル— Vogella

制御の反転と依存性注入パターン— Martin Fowler

それが役に立てば幸い!

あなたがその記事を気に入って、もっと素晴らしい記事を読みたいのなら、ここで私に従ってください(Bhavya Karia)そしてそれが私にもっと書く動機を与えるのであなたのサポートを示してください。

LinkedIn、Twitter、Facebookに接続するよりも、質問やフィードバックがあれば。

編集1:

Sergey Ufocoderのおかげで、この記事はロシア語に変換されました。私のロシア人の友達と誰もがロシア語を読むことができる人はそれを読んでくれます。

記事へのリンク

また、JavaScriptでDIを適用してライブラリを探している場合は、JoSurikatが彼のライブラリを試してみることをお勧めします。

ディ忍者

JavaScriptのもう1つの素晴らしいDIライブラリがNicolasFroidureによって提案されました。

ナイフサイクル

編集2:

あなたがPHP開発者であるなら、心配しないでください、あなたもすべてカバーされました。Gordon Forsytheは、皆さんが試してみたいと思うかもしれないこの素晴らしいライブラリを推奨しました。

アウリン

いつも親切な言葉をいただきありがとうございます。より多くの人々が恩恵を受けることができるように、記事を共有してください。

1つか2つでも学んだら、この話をシェアしてください!