よく巷では「DI」という単語が飛び交っていますが、なにやら小難しそうなイメージがありますよね。この記事ではDIとはなんぞや、何が嬉しいの?どういうデメリットがあるのかということを掘り下げてみたいと思います。また、DIとDIコンテナの違いにも少しだけ触れます。

DIの基本的な知識

DI (Dependency Injection) を日本語に訳すと?

りんちゃんりんちゃん

Dependency Injection (ディペンデンシー インジェクション)は日本語に訳すと 「依存性の注入」 と訳されるのにゃ~。

依存性って何ですの?

りんちゃんりんちゃん

「依存性の注入」と聞くと、何やら怪しいイメージが湧いてくるのにゃ~。よくわかんにゃいのでWikipediaさんを読んでみるのにゃ~。

dependency injection is a technique whereby one object supplies the dependencies of another object.

(依存性の注入は、一つのオブジェクトが別のオブジェクトの依存関係を提供する技術です。)

りんちゃんりんちゃん

にゃるほど~。依存性とは、オブジェクトの依存関係の事を表しているのにゃ~。言い換えると、 「オブジェクトの注入」 と言えそうだにゃ~。ちょっとずつ分かってきたのにゃ~。

注入って?

りんちゃんりんちゃん

注入って何なのにゃ~。

かりまたかりまた

イメージ、こう

りんちゃんりんちゃん

にゃるほど、わからん。

かりまたかりまた

さっきのWikipediaの引用でもあったように、オブジェクトがオブジェクトに依存している状態を、外部からオブジェクトを与えてあげるようにしてあげるのが 「注入」 なんだよ~。

りんちゃんりんちゃん

ほう……??

かりまたかりまた

DIでは注入する何かと注入される何かの両方とも「オブジェクト」であるので、ちょっと理解がややこしくなっているのかもね。

実際にDIを使ってみる

かりまたかりまた

自分で出しておきながらラブ注入の例えが絶望的に分かり辛かったので、言わずと知れた「School Days」でDIを考えてみようと思います。

かりまたかりまた

ちなみに前提知識として、言葉ちゃんは凄く凄くヤンデレです。ヤンデレすぎて切れた電話の状態で電話を延々とし続けたり、好きな男の頭だけ抱きかかえてナイスボートしたりするような女の子です。誠にどっぷり依存しちゃってます。

DIを使わない場合のExample Code

かりまたかりまた

はい、言葉は誠に依存しちゃってます。どこら辺が依存しているか?というと、Kotohaクラスのインスタンスを生成した段階でパートナーが誠になってしまいます!

かりまたかりまた

じゃあ、Kotohaクラスのパートナーを誠以外にするにはどうすれば良いんでしょうか?そこで、DIという考え方が出てきます。

DIを使った場合のExample Code


かりまたかりまた

はい、これで依存性の注入が出来ました!

りんちゃんりんちゃん

どこらへんがにゃ~?

かりまたかりまた

DIを使っていない場合と比較した際に、変わっている所が幾つかありますが、一番大きく変わったのがKotohaクラスです。

かりまたかりまた

以前のKotohaクラスでは誠に依存するしかありませんでした。しかし、PartnerインターフェースKotohaクラスの外から与えてやることによって、与えたパートナーに依存出来るようになります。

改めて、DIとは?

かりまたかりまた

このように、 オブジェクト内で生成しているインスタンスを引数として受け取る事でオブジェクトの依存関係を薄くすることが出来ます 。言葉が誠に依存していなければ、以下のような惨劇は起こらなかったと思います。

DIのメリット・デメリットについて

DIのメリット

  • 外からインスタンスを渡すので仕様変更に強くなる
  • オブジェクト同士が疎結合なのでテストが行い易い

DIのデメリット

  • インターフェースやクラスを細分化する必要がある
  • そうなると、ファイル数が多くなりがち
  • 実処理をどこで行ってるのかが追いにくくなりがち

DIとDIコンテナって違うの?

かりまたかりまた

DIは上記で説明している通り、オブジェクトをオブジェクト内で生成するのではなく、外部から引数として受け取ろうぜ!という考え方なのですが、これをやりすぎると引数が爆発的に増えそうな気がしませんか?

かりまたかりまた

そこで出てくるのがDIコンテナです。コイツを使ってやることによって、引数の問題を解決出来るようになるのですが、今回の記事から外れてしまうのでまた別の記事で纏めようと思います。

まとめ

  • DIは日本語で「依存性の注入」と訳される
  • 依存性とはオブジェクトの中でオブジェクトを作る事で生まれる
  • 依存性を排除するにはオブジェクトの引数にオブジェクトを持つようにすれば良い
  • DIとDIコンテナは別物