1
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[備忘録]Dependency Injectionについて

Last updated at Posted at 2016-12-03

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

1
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?