"Accoppiamento" è un termine che descrive la relazione tra due entità in un sistema software (in genere le classi).
Quando una classe utilizza un'altra classe o comunica con essa, si dice che "dipende" da quell'altra classe, e quindi queste classi vengono "accoppiate". Almeno uno di loro "sa" dell'altro.
L'idea è che dovremmo cercare di mantenere l'accoppiamento tra le classi nei nostri sistemi il più "allentato" possibile: quindi "accoppiamento lento" o talvolta "disaccoppiamento" (sebbene in inglese "disaccoppiamento" significherebbe "nessun accoppiamento", le persone spesso lo usano per implicare un "accoppiamento lento" tra entità).
Quindi: in che cosa consiste l'accoppiamento libero rispetto all'accoppiamento forte in pratica, e perché dovremmo creare entità liberamente accoppiate?
L'accoppiamento descrive il grado di dipendenza tra un'entità e un'altra entità. Spesso classi o oggetti.
Quando ClassA dipende fortemente da ClassB, le possibilità che ClassA venga influenzata quando si cambia ClassB sono elevate. Questo è un accoppiamento forte.
Tuttavia, se la Classe A dipende leggermente dalla Classe B, le possibilità che la Classe A subisca in qualche modo una modifica del codice della Classe B sono basse. Questo è un accoppiamento libero o una relazione "disaccoppiata".
L'accoppiamento lento è buono perché non vogliamo che i componenti del nostro sistema dipendano fortemente l'uno dall'altro. Vogliamo mantenere il nostro sistema modulare, in cui possiamo cambiare in sicurezza una parte senza influire sull'altra.
Quando due parti sono accoppiate liberamente, sono più indipendenti l'una dall'altra e hanno meno probabilità di rompersi quando le altre cambiano.
Ad esempio, quando si costruisce un'auto, non si vorrebbe un cambiamento interno nel motore per rompere qualcosa nel volante.
Mentre questo non accadrà mai per caso durante la costruzione di un'auto, cose simili accadono continuamente ai programmatori. L'accoppiamento lento ha lo scopo di ridurre il rischio che ciò accada.
Il forte accoppiamento di solito si verifica quando l'entità A sa troppo sull'entità B. Se l'entità A fa troppe ipotesi su come opera l'entità B o su come è costruita, allora c'è un rischio elevato che una variazione nell'entità B influenzerà l'entità A. Questo è perché uno dei suoi presupposti sull'entità B ora è errato.
Ad esempio, immagina che come guidatore faresti alcune ipotesi su come funziona il motore della tua auto.
Il giorno in cui acquisti una nuova auto con un motore che funziona in modo diverso (o per qualche ragione il tuo motore è stato sostituito), i tuoi presupposti precedenti sarebbero errati. Se tu fossi il codice in un computer, ora potresti essere un codice errato che non funziona correttamente.
Tuttavia, se tutte le ipotesi che come guidatore hai fatto sulle auto è che: A- hanno i volanti e B- hanno i pedali del freno e del gas, che i cambiamenti nell'auto non ti influenzeranno, purché le tue poche assunzioni rimani corretto. Questo è un accoppiamento lento.
Una tecnica importante per ottenere un accoppiamento lento è l'incapsulamento. L'idea è che una classe nasconda i suoi dettagli interni da altre classi e offre un'interfaccia rigorosamente definita per consentire ad altre classi di comunicare con essa.
Così, per esempio, se si definisce una classe Car, la sua interfaccia (metodi pubblici) probabilmente sarebbe drive()
, stop()
, steerLeft()
, steerRight()
, getSpeed()
. Questi sono i metodi che altri oggetti possono invocare sugli oggetti Car.
Tutti gli altri dettagli della classe Car: come funziona il motore, il tipo di carburante che utilizza, ecc. Sono nascosti ad altre classi - per impedire loro di sapere troppo sulla Car.
Nel momento in cui la classe A sa troppo della classe B: abbiamo una relazione fortemente accoppiata, in cui la classe A è troppo dipendente dalla classe B e un cambiamento nella classe B potrebbe influire sulla classe A. Rendere il sistema difficile da espandere e mantenere.
Una relazione tra due entità, in cui si conoscono poco (solo ciò che è necessario) - è una relazione liberamente accoppiata o disaccoppiata.