DIすることとDIコンテナ

DIコンテナの説明を聞いたときに聴衆者の大半が混乱していたので、そのとき思ったことをメモ。

DIの概要や利点について以下のようなことが説明されていた。

  • インスタンスの生成と管理
  • 定義で依存性を注入
  • 依存性を排除する
  • 再利用が楽になる

まぁ、最後の再利用が楽になるってのはあえて言葉少なめでそんな訳は無いとだけにしておく。ほかの利点などの説明もあったのだけど、どうもDIすること(依存性を外部から与えてあげること)の利点とDIコンテナの(機能の)利点がごっちゃになっている気がする。
個人的な意見としてはDIコンテナの利点ってのはDIしてくれることとインスタンスを管理してくれることで、DIすることの利点は依存性を下げてくれることだと思ってる。ここをごっちゃにするから混乱してしまう。
自分が説明するとすると、やっぱり1からの説明になるのかな。直接インスタンス化してしまった場合にどう悪いのかから始まって、ファクトリー使ってもいまいちってのを説明して、じゃぁ、外部から与えてあげましょうよってのを説明する。これでDIすることの利点終わり。で、外部から与えてあげる部分をコンテナって機能にして、定義で依存性を指定できるようにしましょうよってのがDIコンテナの核。ついでにインスタンスの管理とかインスタンス化時のメソッド呼び出しとか、さらには AOP なんてのもやっちゃいましょうってな機能もあるよって感じ。
これを MovieLister/Finder のコードを TDD で実際に書きながら話していくのも面白そう。流れ的にカプセル化ポリモーフィズムなんてのも話す必要があるやろうからオブジェクト指向の説明も一緒くたにできそうなんて打算も混じってたり。

ちなみに私の DI コンテナの使い方で一番多いのは定義ファイル代わりだったりする。