※分かりやすさのために、一部の用語を、一般的な表現に置き換えてあります。
※参考資料(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