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 ConnectionPool
di soddisfare i seguenti requisiti. Si noti che potrebbe sembrare troppo per una classe semplice come, ConnectionPool
ma 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 ConnectionPool
classe 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 ConnectionPool
diagramma ad alta coesione sopra. Se osserviamo il diagramma sopra, sebbene supporti l'alta coesione, ConnectionPool
è strettamente associato alla ConnectionStatistics
classe e PersistentStore
interagisce direttamente con essi. Invece per ridurre l'accoppiamento potremmo introdurre ConnectionListener
un'interfaccia e lasciare che queste due classi implementino l'interfaccia e permettano loro di registrarsi con la ConnectionPool
classe. E ConnectionPool
itererà 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 Facade
che interagisca internamente con questi servizi multipli e qualsiasi modifica ai servizi diventi locale Facade
e imponga un basso accoppiamento con la terza parte Servizi.