わかってきたぞ、と。
「ぱよぱよはほげほげを使ってぺもぺもする」を実装するばやい、
class ぱよぱよ {
public ほげほげ hogehoge;
public void ぺもぺも() {
hogehoge.Hoge();
どーのこーの
}
}
なんてやつだな。
このときぱよぱよはほげほげに依存しているわけや。
で、この依存性を極力排除したい/ほげほげを適宜差し替えたい。
ならば具象クラスほげほげ改め、ほげほげのインタフェースを抽出して、
ぱよぱよはそのインタフェースを持つことにする:
interface IHogerable {
void Hoge();
}
class ぱよぱよ {
public IHogerable hogehoge;
public void ぺもぺも() {
hogehoge.Hoge();
どーのこーの
}
}
class ほげほげ : IHogerable {
public void Hoge() { ... }
}
こうしておけばぱよぱよは具象クラスほげほげに依存しない。
ぱよぱよコードからほげほげが消えてるやんか。
ぱよぱよはIHogerableであるナニカを持てばいいことになる。
さーて、とはいえこのぱよぱよが機能するには内包するIHogerableが抽象のままでは
動きゃしねーのでなんらかのIHogerableな具象クラスのインスタンスをぶっ込まなあかん。
んでもアプリのどこかでベタ書きしたくない/re-compileなしに外から差し替えたい。
具体性を持たすのはギリギリまで先送りにしたいのな。
ってーシチュエーションで活躍するのがDIコンテナなわけだな。
DIコンテナが依存性(Dependency)を注入(Injection)してくれるわけやね。