🧑‍🍳

DI(Dependency Injection)ってなに?

に公開

DIの例

あなたは料理人です。
料理に欠かせない要素は思いつくのは調理器具、食材ぐらいでしょう。(たぶん)
この2つの要素を料理を作るうえで依存するので、料理における依存関係は上記2つです。

DI(Dependency Injection)の本質はオブジェクト自身が依存オブジェクトを生成せずに外部から注入することで依存関係を疎結合にする(強く結びつかないようにする)

料理に欠かせない要素をそのまま1つのクラスに収める場合(密結合の例)

依存関係 動作 問題点
調理器具 コンロを固定で組み込む。準備も自分で行っている IHで調理しなければならない場合、料理人自身のコードの変更が面倒
食材 ずっと同じ材料を自分で買って、それのみを使用する いつもの材料が使用不可になった場合、クラス全体を変更する必要がある

料理に欠かせない要素を外部から注入してもらいあなたしかできないことのみを行う(疎結合の例)

依存関係 動作 DIの役割 メリット
調理器具 火を使うためのインターフェースのみ要求 *1 ガスコンロ、IHかなどを選択してあなたに渡す(これが注入) 渡されたもので火を使えばいいだけだから密結合の場合より楽(交換が楽)
食材 材料のみ要求 仕入れ担当のような人が適切な材料をあなたに渡す(これが注入) 味を試す場合仕入れ担当のほうのクラスを変更すればよい場合が多く、テストが楽

DIを使うことで料理人の責任を手放し、クラスの責任をどんどん減らしていきます。
考え方によってはSOLID原則と、少しだけ似てるところもあるとおもいます。

DIのメリット

  • クラスごとの役割が分散されるため、コードがすごい読みやすくなって修正が楽しくなります。
  • やってみるとわかるテストの簡単さがあります。
  • テストでイライラすることがなくなります

まとめ

DIは使えば使うほどコーディングが楽しくなります。
コード量は結構大きくなるけど、、、笑
ということで 使ってみてください!

*1 インスタンス: 実例、実体

ここまで読んでくれてありがとうございました!

Discussion