Dependency injectionとは?
依存性の注入とは、コンポーネント間の依存関係をプログラムから排除するため、外部の設定ファイルなどでオブジェクトを注入できるようにするソフトウェアパターンである。
Dependency injection(依存性の注入)
- 依存性は注入しない
- ソースコードから依存関係を排除するためのデザインパターン
- 依存関係は外部の設定ファイル等で、外部からオブジェクトを注入する
Dependency injectionの必要性
Class AがInterface Bを呼び出しInterface Bの実装はClass Bが提供することを表しています
また、このようなクラス図の書き方はUMLと呼ばれる記法です。
UMLについて詳しく知りたい方は下記の書籍が網羅的に分かりやすく記載されていますのでご一読をお勧めします。
話を本題に戻します。
上記クラス図を、Javaの実装で簡易的に表すと下記のようになります
ここで改めて一つ考えてみたいと思います。なぜ
Interface Bを定義しなければならなかったのでしょうか?
Interface Bを定義する理由は、
Class AからClass Bの実装を隠蔽するためです。
Class AはInterface Bさえ知っていればClass Bの機能を利用でき
Interface Bさえ保守していればClass Bの変更をClass Aが受けないという状態を作りたいわけです。簡単に言えば、
Class AとClass Bを疎結合に保っていたいのです。
なぜならClass AでClass Bをインスタンス化している下記の実装に問題があります。
Class Bのインスタンス化をClass Aが行っているために
実装レベルではClass AがClass Bに依存してしまっているのです。
これではInterface Bを定義した目的が損なわれてしまいます。
これに対して、Dependency injectionはClass AからClass Bのインスタンス化を行う実装を除くことが可能となります。
Dependency injectionのメリット
Class AとClass Bを疎結合に保つため下記の変更を加えます。
Class A,
Class Bのインスタンス化を外部(Injector)に移譲します
-
Injector(コード上ではMain)が
Class Bをインスタンス化する -
Class AはInterface Bのインスタンスをコンストラクタで受け取る
Class A内は、インスタンス化するコードが排除されClass B知らなくてよくなります。簡単に言えば
Class Aからnewを排除した訳です
Class AがClass Bに依存しなくなることがメリットとなります
Dependency injection(依存性の注入)のメリット
- 実装視点ではインスタンス化するコードの排除
- 設計視点ではクラス間の疎結合を確保
依存関係を排除するメリット
Class AのプログラムからClass Bへの依存関係は排除されました
実際、このことにはどのようなメリットがあるか記載していきます。
インスタンスの切り替えが容易
Interface Bの実装をClass BからClass Cに切り替える場合を想定します
Class Aには何ら変更の影響が及びません
Class Aが意識しているのは Interface BのみでありClass Bではありません。
Class Bの実装が仕上がるまでの間StubとしてClass Cを使うといった場合に良く用いられます
依存関係の明確化
これは設計におけるメリットです。大規模開発において依存関係の複雑化は非常に厄介な問題です。
設計方針としては切り離せるはずの2つのクラスが、大量のクラスが生み出す大量の依存関係によって実は依存しており、もはや切り離すことが不可能であるというケースは少なくありません。
各クラスが2つのクラスを参照しているだけだとしてもシステム全体で見れば大量の依存関係となります。
アーキテクチャというルールだけで管理することは非常に困難です。
Dependency injectionはプログラムから依存関係を排除します。
このため原則的にInjector以外に依存関係が発生していれば、
一律設計違反と判断できます。
つまり、Dependency injectionというシステム上の仕組みで依存関係の氾濫を防止します。
このことはアーキテクチャの維持に効果をもたらします
クリーンアーキテクチャなど依存関係の方向を限定することに重きを置いているアーキテクチャではDependency
injectionが適用されやすくなります
ライブラリ
まとめ
本記事では、Dependency injection(依存性の注入)の概念や、使う意義、メリットなどをJavaのソースコードを用いて解説しました。
いきなりDIライブラリの使用法を見ると複雑に見えて混乱しがちですが、実現したいことは非常にシンプルです。
またDependency injection以外にも様々なデザインパターンが存在します。
下記の書籍はもはやデザインパターンのバイブルともいえる昔からある書籍ですが、最近改定されDependency Injectionも盛り込まれています。
エンジニアであれば一度は読んでおくべき一冊です。




0 件のコメント :
コメントを投稿