El grado de diferencia entre las respuestas aquí muestra por qué sería un concepto difícil de entender, pero en términos tan simples como puedo describirlo:
Para que sepa que si te tiro una pelota, entonces puedes atraparla, realmente no necesito saber cuántos años tienes. No necesito saber qué comiste en el desayuno, y realmente no me importa quién fue tu primer enamoramiento. Todo lo que necesito saber es que puedes atrapar. Si sé esto, entonces no me importa si eres tú, te estoy lanzando una pelota a ti o a tu hermano.
Con lenguajes no dinámicos como c # o Java, etc., lo logramos mediante interfaces. Digamos que tenemos la siguiente interfaz:
public ICatcher
{
public void Catch();
}
Y ahora digamos que tenemos las siguientes clases:
public CatcherA : ICatcher
{
public void Catch()
{
console.writeline("You Caught it");
}
}
public CatcherB : ICatcher
{
public void Catch()
{
console.writeline("Your brother Caught it");
}
}
Ahora, tanto CatcherA como CatcherB implementan el método Catch, por lo que el servicio que requiere un Catcher puede usar cualquiera de estos y realmente no importa cuál sea. Por lo tanto, un servicio estrechamente acoplado podría instanciar directamente
public CatchService
{
private CatcherA catcher = new CatcherA();
public void CatchService()
{
catcher.Catch();
}
}
Por lo tanto, CatchService puede hacer exactamente lo que se propuso, pero utiliza CatcherA y siempre usará CatcherA. Está codificado, por lo que se queda allí hasta que alguien venga y lo refactorice.
Ahora tomemos otra opción, llamada inyección de dependencia:
public CatchService
{
private ICatcher catcher;
public void CatchService(ICatcher catcher)
{
this.catcher = catcher;
catcher.Catch();
}
}
Entonces el calss que instans CatchService puede hacer lo siguiente:
CatchService catchService = new CatchService(new CatcherA());
o
CatchService catchService = new CatchService(new CatcherB());
Esto significa que el servicio Catch no está estrechamente acoplado a CatcherA ni a CatcherB.
Hay varias otras estrategias para acoplar servicios como este, como el uso de un marco IoC, etc.