Buradaki cevaplar arasındaki farkın derecesi neden kavramanın zor olduğunu, ancak onu tanımlayabildiğim kadar basit bir şekilde ifade etmenin neden zor olduğunu gösteriyor:
Sana bir top atarsam, o zaman onu yakalayabilirsin, gerçekten kaç yaşında olduğunu bilmeme gerek yok. Kahvaltıda ne yediğinizi bilmeme gerek yok ve gerçekten ilk aşkınızın kim olduğu umurumda değil. Bilmem gereken tek şey yakalayabileceğin. Eğer bunu bilersem, o zaman umursamıyorum sana ya da kardeşine bir top atıyorum.
C # veya Java vb. Gibi dinamik olmayan dillerle bunu Arayüzler aracılığıyla başarıyoruz. Diyelim ki aşağıdaki arayüze sahibiz:
public ICatcher
{
public void Catch();
}
Ve şimdi diyelim ki şu sınıflara sahibiz:
public CatcherA : ICatcher
{
public void Catch()
{
console.writeline("You Caught it");
}
}
public CatcherB : ICatcher
{
public void Catch()
{
console.writeline("Your brother Caught it");
}
}
Şimdi hem CatcherA hem de CatcherB, Catch yöntemini uygular, böylece bir Catcher gerektiren hizmet bunlardan herhangi birini kullanabilir ve hangisinin olduğu konusunda bir lanet veremez. Böylece sıkı sıkıya bağlı bir hizmet doğrudan yakalanan bir
public CatchService
{
private CatcherA catcher = new CatcherA();
public void CatchService()
{
catcher.Catch();
}
}
Böylece CatchService tam olarak ne yaptığını yapabilir, ancak CatcherA kullanır ve her zaman CatcherA kullanır. Onun sert kodlanmış, bu yüzden birisi gelip refactors kadar orada kalmak.
Şimdi bağımlılık enjeksiyonu adı verilen başka bir seçenek alalım:
public CatchService
{
private ICatcher catcher;
public void CatchService(ICatcher catcher)
{
this.catcher = catcher;
catcher.Catch();
}
}
CatchService'i oluşturan calss aşağıdakileri yapabilir:
CatchService catchService = new CatchService(new CatcherA());
veya
CatchService catchService = new CatchService(new CatcherB());
Bu, Catch hizmetinin CatcherA veya CatcherB ile sıkı sıkıya bağlı olmadığı anlamına gelir.
Bunun gibi gevşek bağlantı hizmetleri için bir IoC çerçevesinin kullanımı gibi başka sıkıntılar da vardır.