Il grado di differenza tra le risposte qui mostra perché sarebbe un concetto difficile da capire ma per dirlo nel modo più semplice che posso descriverlo:
Per farmi sapere che se ti lancio una palla, allora puoi prenderla, non ho davvero bisogno di sapere quanti anni hai. Non ho bisogno di sapere cosa hai mangiato a colazione e non mi interessa davvero chi è stata la tua prima cotta. Tutto quello che devo sapere è che puoi prenderlo. Se lo so, non mi importa se sono tu a lanciare una palla a te o tuo fratello.
Con linguaggi non dinamici come c # o Java ecc., Lo facciamo tramite le interfacce. Supponiamo quindi che abbiamo la seguente interfaccia:
public ICatcher
{
public void Catch();
}
E ora diciamo che abbiamo le seguenti classi:
public CatcherA : ICatcher
{
public void Catch()
{
console.writeline("You Caught it");
}
}
public CatcherB : ICatcher
{
public void Catch()
{
console.writeline("Your brother Caught it");
}
}
Ora sia CatcherA che CatcherB implementano il metodo Catch, quindi il servizio che richiede un Catcher può usare uno di questi e non gliene frega davvero quale sia. Quindi un servizio strettamente accoppiato potrebbe istanziare direttamente un pescato
public CatchService
{
private CatcherA catcher = new CatcherA();
public void CatchService()
{
catcher.Catch();
}
}
Quindi CatchService può fare esattamente ciò che si è prefissato di fare, ma utilizza CatcherA e utilizzerà sempre CatcherA. È codificato, quindi rimane lì fino a quando qualcuno arriva e lo refacturing.
Ora prendiamo un'altra opzione, chiamata iniezione di dipendenza:
public CatchService
{
private ICatcher catcher;
public void CatchService(ICatcher catcher)
{
this.catcher = catcher;
catcher.Catch();
}
}
Quindi il calss che instansia CatchService può fare quanto segue:
CatchService catchService = new CatchService(new CatcherA());
o
CatchService catchService = new CatchService(new CatcherB());
Ciò significa che il servizio Catch non è strettamente accoppiato a CatcherA o CatcherB.
Esistono diverse altre strategie per servizi di accoppiamento non vincolato come questo, come l'uso di un framework IoC ecc.