More than 1 year has passed since last update.

※分かりやすさのために、一部の用語を、一般的な表現に置き換えてあります。
※参考資料(MSDN)の内容を参考にしていますが、かなり加筆してあります。

DI(Dependency Injection)って何なのさ?となった時のために

Dependency(必要なもの)を Inject(外から送り込む)こと。

Pros(メリット)/Cons(デメリット)

Pros(メリット)

クラス間の依存性が減少する(無くなるわけではない)

Cons(デメリット)

コードを追いにくい

処理する場所が分散してしまうので、そのプロジェクトに関わってから日が浅い場合など、コードの全体像が見えていないと困る場合がある。

クラス、メソッドなどが増える

逆に、DIを使わない場合は、メソッド自体が長くなる事が多いと思う。
(一か所にいろいろ盛り込むので。)

メモリ管理が複雑になる(?)

変数に入っている値は、(クラス間で共用するなら)どのクラスで使っているか分からないから、らしい。
(DIの場合に)共用する事があるかどうかは謎。

DIを使わない場合と、何が違うの?

DIは、Pushパターン(使いたいものは、使う側が用意する)。
非DIは、Pullパターン(使いたいものがあったら、作れそうな人を探して作ってもらう)。

ようするに、Inversion of Control(コントロール方向の反転)の1形態。
PushとPullだから、逆方向!(パッシブとアクティブみたいなもの)

非DIの例:Factory Patterns(ファクトリー パターン)

(参考資料から引用)

There are three common factory patterns. The Factory Method and Abstract Factory patterns

(訳・・カタカナだらけですが。)
3つの、よく使われるファクトリー パターンがあります。
ファクトリー メソッドと、アブストラクト(抽象)ファクトリー パターンです。

よく使われる例:

・The Factory Method Pattern
・Simple Factory Pattern
・Abstract Factory Pattern

他の例:

・Service Locator Pattern

各パターンの差は、自分で作るか、ファクトリーなど(作ってくれる人)を呼び出すかの差。
(詳細は参考資料を参照して下さい。)
ここで重要なのは、作るものを知らなければ、作れないよね!という事。
これが、「依存性」。
そう、Dependency Injectionの"Dependency"・・ではありません。
※Dependencyが「依存性(の)」と訳されていますが、混乱しないようにしましょう!
このページを書いていても、混乱するぐらいですから・・・

作りたいものが増えたら、作る場所(メソッド)を改造する事になりますよね。
そうすると、メソッドの中身が膨らんで、どんどん複雑になって・・

ここでDIのターン!

で、何を考えたかというと、
よし、作る場所を、分解しよう!
使いたい人が、必要なものだけ揃えればいいよね!
という事。

餅は餅屋。よくわかってる人が作った方が、色々便利。
(注:Factoryも同じ発想。)
必要なものができたら、送り込もう!(Injectionですね)
となったのが、DI。

必要なもの(dependencies)の、送り込み方の例

コンストラクタの引数として渡す

必要なものは最初に渡してしまおう!という事。

プロパティのsetterを使う

「プロパティの」となっているのは、参考資料のコードがC#で書かれているため。
メソッドの引数を使う場合と、あまり差はない。

メソッドの引数として渡す

使うとしたら、他のクラスと値を共有したい場合など。
(こういう方法もあるよ、という感じの話。)
コンストラクタと違い、すでにデフォルト値が設定されているはずなので、
動作中に状態が変わる変数とかの受け渡し用などに。

例えて言うなら、差し入れが来たから、配るよー!というのが、DI。
差し入れがあるから、持って行ってね~という感じだと、Inject(配布)しないから、非DI。
でも、うっ、要らない・・となったら、非DI。
こんな感じでしょうか。

蛇足

dependencyの意味

http://www.dictionary.com/browse/dependency

the state of being dependent; dependence.

(訳)
dependentな状態、dependence

dependenceの意味

http://www.dictionary.com/browse/dependence

the state of relying on or needing someone or something for aid, support, or the like.

(訳)援助、サポートなどのために、誰か、あるいは何かに頼っている、必要としている状態。

参考

Developer's Guide to Dependency Injection Using Unity
2 - Dependency Injection
patterns & practices
https://msdn.microsoft.com/en-us/library/dn178469(v=pandp.30).aspx

DI・DIコンテナ、ちゃんと理解出来てる・・?
http://qiita.com/ritukiii/items/de30b2d944109521298f

猿でも分かる! Dependency Injection: 依存性の注入
http://qiita.com/hshimo/items/1136087e1c6e5c5b0d9f

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.