Le degré de différence entre les réponses montre ici pourquoi ce serait un concept difficile à saisir mais pour le dire aussi simplement que je peux le décrire:
Pour que je sache que si je te lance une balle, tu peux l'attraper, je n'ai vraiment pas besoin de savoir quel âge tu as. Je n'ai pas besoin de savoir ce que tu as mangé au petit-déjeuner, et je me fiche de qui était ton premier béguin. Tout ce que j'ai besoin de savoir, c'est que vous pouvez attraper. Si je le sais, alors je m'en fiche si c'est toi que je te lance une balle ou à ton frère.
Avec des langages non dynamiques comme c # ou Java, etc., nous y parvenons via des interfaces. Disons donc que nous avons l'interface suivante:
public ICatcher
{
public void Catch();
}
Et maintenant, disons que nous avons les classes suivantes:
public CatcherA : ICatcher
{
public void Catch()
{
console.writeline("You Caught it");
}
}
public CatcherB : ICatcher
{
public void Catch()
{
console.writeline("Your brother Caught it");
}
}
À présent, CatcherA et CatcherB implémentent la méthode Catch, de sorte que le service qui nécessite un Catcher peut utiliser l'un ou l'autre de ces derniers et ne pas vraiment se tromper de quel il s'agit. Ainsi, un service étroitement couplé pourrait directement instancier un ie
public CatchService
{
private CatcherA catcher = new CatcherA();
public void CatchService()
{
catcher.Catch();
}
}
Ainsi, le CatchService peut faire exactement ce qu'il a prévu de faire, mais il utilise CatcherA et utilisera toujours CatcherA. Il est codé en dur, donc il reste là jusqu'à ce que quelqu'un vienne le refactoriser.
Prenons maintenant une autre option, appelée injection de dépendances:
public CatchService
{
private ICatcher catcher;
public void CatchService(ICatcher catcher)
{
this.catcher = catcher;
catcher.Catch();
}
}
Ainsi, les cals qui instanment CatchService peuvent effectuer les opérations suivantes:
CatchService catchService = new CatchService(new CatcherA());
ou
CatchService catchService = new CatchService(new CatcherB());
Cela signifie que le service Catch n'est pas étroitement couplé à CatcherA ou CatcherB.
Il existe plusieurs autres stratégies pour coupler de manière lâche des services comme celui-ci, comme l'utilisation d'un framework IoC, etc.