依存性注入(DI)の仕組み ― なぜ「外から渡す」だけでコードが劇的に変わるのか
依存性注入って名前が難しそうだけど、どういう仕組みなの?
すごくシンプルだよ。あるクラスが必要とする部品(依存オブジェクト)を、自分で作らずに外からもらう、ただそれだけの話なんだ。レストランに例えると、料理人が自分で食材を畑から育てるんじゃなくて、仕入れ業者から届けてもらう感じだね。
自分で作っちゃダメなの?動くなら同じじゃない?
動くことは動くんだけど、それだと「密結合」になってしまうんだ。たとえばクラスAの中で直接クラスBをnewしていると、Bを別の実装に差し替えたいときにAのコードを書き換えなきゃいけない。仕入れ業者を変えるたびにレシピを書き直すようなものだよ。
それは大変だね…。外から渡す方法にはどんな種類があるの?
でも依存が多いクラスだと、毎回手動で渡すのは面倒じゃないの?
便利だね!DIにするとテストも楽になるって聞いたけど本当?
なるほど!逆にDIを使わないパターンでサービスロケータってのがあるみたいだけど、何が違うの?
DIコンテナにもいろんな種類があるみたいだけど、違いはあるの?
循環依存っていうのも聞いたことあるけど、どういう問題なの?
DIって万能なの?使いすぎると困ることもある?