Der Grad der Unterschiede zwischen den Antworten zeigt, warum es schwierig wäre, ein Konzept zu verstehen, es aber so einfach auszudrücken, wie ich es beschreiben kann:
Damit ich weiß, dass wenn ich einen Ball zu dir werfe, du ihn fangen kannst, muss ich wirklich nicht wissen, wie alt du bist. Ich muss nicht wissen, was du zum Frühstück gegessen hast, und es ist mir wirklich egal, wer dein erster Schwarm war. Ich muss nur wissen, dass du fangen kannst. Wenn ich das weiß, ist es mir egal, ob du es bist. Ich werfe dir oder deinem Bruder einen Ball.
Mit nicht dynamischen Sprachen wie c # oder Java usw. erreichen wir dies über Schnittstellen. Nehmen wir also an, wir haben die folgende Schnittstelle:
public ICatcher
{
public void Catch();
}
Nehmen wir an, wir haben folgende Klassen:
public CatcherA : ICatcher
{
public void Catch()
{
console.writeline("You Caught it");
}
}
public CatcherB : ICatcher
{
public void Catch()
{
console.writeline("Your brother Caught it");
}
}
Jetzt implementieren sowohl CatcherA als auch CatcherB die Catch-Methode, sodass der Dienst, der einen Catcher benötigt, eine dieser Methoden verwenden kann und sich nicht wirklich darum kümmert, um welche es sich handelt. Ein eng gekoppelter Dienst könnte also direkt einen gefangenen dh auslösen
public CatchService
{
private CatcherA catcher = new CatcherA();
public void CatchService()
{
catcher.Catch();
}
}
Der CatchService kann also genau das tun, was er sich vorgenommen hat, verwendet jedoch CatcherA und verwendet immer CatcherA. Es ist hart codiert, also bleibt es dort, bis jemand kommt und es umgestaltet.
Nehmen wir nun eine andere Option, die Abhängigkeitsinjektion:
public CatchService
{
private ICatcher catcher;
public void CatchService(ICatcher catcher)
{
this.catcher = catcher;
catcher.Catch();
}
}
Der Calss, der CatchService auslöst, kann also Folgendes tun:
CatchService catchService = new CatchService(new CatcherA());
oder
CatchService catchService = new CatchService(new CatcherB());
Dies bedeutet, dass der Catch-Service weder mit CatcherA noch mit CatcherB eng verbunden ist.
Es gibt mehrere andere Strategien für lose Kopplungsdienste wie diesen, wie die Verwendung eines IoC-Frameworks usw.