Nella ProgrammazioneObjectOriented la coesione è la misura di quanto le responsabilità di una classe sono correlate fra loro.
Una classe con una responsabilità ben definità è una classe altamente coesiva.
In un software con un buon design le classi hanno un'alta coesione.
Tipi di coesione
Sono elencate dalla coesione più debole (indice di cattivo design e quindi da cercare di evitare) a quella più alta (indice di un buon design):
Per coincidenza: raggruppamento arbitrario ovvero i metodi in una classe sono stati inseriti senza una ragione particolare.
Logica: Raggruppamento di metodi simili. Per esempio creo una classe per la validazione dei dati in input, oppure la classe che contiene i metodi per la gestione degli errori.
Procedurale: i metodi fanno parte di un’unica sequenza di controllo e sono collegati da una procedura di esecuzione. Esempio la classe FileReader che ha i metodi Open, Close, Read, ecc., cioè per leggere i dati da un file devo prima chiamare il metodo Open, poi Read ed infine Close.
Comunicativa: I metodi agiscono su uno stesso input o producono uno stesso output, es. la classe Statistica che ha i metodi Calcola media, Calcola varianza, ecc. e tutti agiscono su un array di double.
Sequenziale: i dati di ritorno di un metodo sono l'input di un altro, es.: il metodo Connetti di una generica classe Database ritorna un oggetto Connessione che serve come parametro del metodo per eseguire la query e come parametro del metodo ChiudiConnessione.
Funzionale: Ogni Classe fa una cosa sola e la fa bene.
Il seguente schema aiuta a determinare il corretto tipo di coesione di una classe:
Vediamo un esempio pratico, consideriamo una generica classe Database:
class Database
{
public Connection OpenConnection(string connectionString);
public DataSet Query(Connection conn, string sql);
public int ExecuteCommand(Connection conn, string sql);
public void CloseConnection(Connection conn);
}
Se seguiamo lo schema precedendente alla domanda: il componente ha un'unica responsabilita? la risposta è no perchè ha almeno due responsabilità quella di gestire la connessione al database e quella di eseguire query. Alla domanda come sono correlate le operazioni? la risposta è dati in questo caso la classe Connection. Alla domanda la sequenza è importante? la risposta è Si, quindi questa classe ha una coesione Sequenziale.
Quali sono i vantaggi ad avere un'Alta Coesione?
Facilità di comprensione: ogni classe è semplice da capire e da descrivere perchè ha un'unica responsabilità.
Mantenibilità: Una classe è meno soggetta a cambiamenti
Riutilizzabilità: Essendo le responsabilità ben definite sono anche semplice da riutilizzare se invece una classe fa troppe cose e me ne serve una sola sono costretto a portarmi dietro tutto il resto.
Rubriki: la Rubrica del Wiki
15/08/2008 19.17.06 - LucaMinudel
Antonio Ganci
23/12/2006 19.46.19 - -84.222.115.6
La Programmazione Object Oriented, cosa è e quali strumenti ha.
25/02/2007 14.30.54 - LucaMinudel-88.149.168.133
Definizione di accoppiamento (coupling), elenco dei tipi di accoppiamento e come fare per riconoscerli.