Che cos'è la coesione?
La definizione che trovo più chiara l'ho letta in questo articolo High Cohesion Pattern:
La coesione è la misura di quanto le responsabilità di un particolare modulo siano correlate fra loro
Quindi una classe con una responsabilità ben specifica è una classe altamente coesiva.
Ci sono diversi tipi di coesione, quelle deboli (e quindi da evitare):
- Per coincidenza: raggruppamento arbitrario
- Logica: raggruppamento di operazioni simili, es. gestione della validazione dei dati di input, gestione degli errori, ecc.
- Temporale: raggruppamento di componenti collegati temporalmente, es. tutti i metodi che vengono chiamati quando un'applicazione parte, quindi collegati solo dal momento in cui vengono eseguiti
- Procedurale: i componenti fanno parte di un’unica sequenza di controllo e sono collegati da una procedura di esecuzione, es. VerificaDisponibilitaMagazzino, CreaOrdineFornitore, CreaBolla, ...
Quelle medie (accettabili a seconda dei casi):
- Comunicativa: i componenti agiscono su uno stesso input o producono uno stesso output, es. Calcolo di statistiche su una serie di dati
- Sequenziale: i dati di output di un componente sono in input ad un altro, es.: calcolo e stampa di una statistica
Infine la coesione ideale:
- Funzionale: Ogni componente fa una cosa sola e la fa bene
A questo punto proviamo a rispondere alla domanda: Che vantaggi ho ad avere un'alta coesione?
- Facilità di comprensione: ogni classe ha un'unica responsabilità
- Mantenibilità: perchè meno soggetti al cambiamento
- Riutilizzabilità: perchè le classi contengono poco codice specializzato su una responsabilità ben definita
Come faccio a determinare il livello di coesione? Questo schema può venire in aiuto:
Update: nel wiki di ugidotnet si parla anche di questo argomento nella pagina Pattern High Coesion