La coesione è un'indicazione di quanto siano correlate e focalizzate le responsabilità di un elemento software.
L'accoppiamento si riferisce alla forza con cui un elemento software è collegato ad altri elementi.
L'elemento software può essere classe, pacchetto, componente, sottosistema o un sistema. E durante la progettazione dei sistemi si consiglia di disporre di elementi software con elevata coesione e supporto di accoppiamento basso .
La bassa coesione si traduce in classi monolitiche che sono difficili da mantenere, comprendere e ridurre la riusabilità. Allo stesso modo, l' accoppiamento elevato si traduce in classi strettamente accoppiate e le modifiche non sono locali, difficili da cambiare e riducono il riutilizzo.
Possiamo prendere uno scenario ipotetico in cui stiamo progettando un tipico monitor capace ConnectionPooldi soddisfare i seguenti requisiti. Si noti che potrebbe sembrare troppo per una classe semplice come, ConnectionPoolma l'intento di base è solo quello di dimostrare basso accoppiamento e alta coesione con alcuni semplici esempi e penso che dovrebbe aiutare.
- supporto per ottenere una connessione
- rilasciare una connessione
- ottenere statistiche sulla connessione rispetto al conteggio degli utilizzi
- ottenere statistiche sulla connessione vs tempo
- Memorizzare il recupero della connessione e rilasciare le informazioni in un database per la segnalazione in un secondo momento.
Con una bassa coesione potremmo progettare una ConnectionPoolclasse inserendo con forza tutte queste funzionalità / responsabilità in una singola classe come di seguito. Possiamo vedere che questa singola classe è responsabile della gestione della connessione, interagendo con il database e mantenendo le statistiche di connessione.

Con l' alta coesione possiamo assegnare queste responsabilità tra le classi e renderle più sostenibili e riutilizzabili.

Per dimostrare l' accoppiamento basso continueremo con il ConnectionPooldiagramma ad alta coesione sopra. Se osserviamo il diagramma sopra, sebbene supporti l'alta coesione, ConnectionPoolè strettamente associato alla ConnectionStatisticsclasse e PersistentStoreinteragisce direttamente con essi. Invece per ridurre l'accoppiamento potremmo introdurre ConnectionListenerun'interfaccia e lasciare che queste due classi implementino l'interfaccia e permettano loro di registrarsi con la ConnectionPoolclasse. E ConnectionPoolitererà attraverso questi ascoltatori e notificherà loro gli eventi di connessione e rilascio e consente un minor accoppiamento.

Nota / Parola o Attenzione: per questo semplice scenario può sembrare eccessivo, ma se immaginiamo uno scenario in tempo reale in cui la nostra applicazione deve interagire con più servizi di terze parti per completare una transazione: Accoppiamento diretto del nostro codice con i servizi di terze parti significherebbe che eventuali modifiche al servizio di terze parti potrebbero comportare modifiche al nostro codice in più punti, invece potremmo avere Facadeche interagisca internamente con questi servizi multipli e qualsiasi modifica ai servizi diventi locale Facadee imponga un basso accoppiamento con la terza parte Servizi.