UGIdotNET Home UGIdotNET Home
UGIdotNET Blogs UGIdotNET Blogs
UGIdotNET Forum UGIdotNET Forum
MSDN Architetti MSDN Architetti
Visualizza Modifiche Visualizza Modifiche
Modifica Modifica
Stampa Stampa
Modifiche Recenti Modifiche Recenti
Sottoscrizioni Sottoscrizioni
Ufficio Oggetti Smarriti Ufficio Oggetti Smarriti
Cerca Riferimenti Cerca Riferimenti
Rinomina Rinomina
Cerca

Versioni

16/08/2008 1.34.58
LucaMinudel
19/12/2006 13.11.10
RiccardoGolia-83.225.217.238
15/12/2006 1.12.35
-84.222.9.124
14/12/2006 10.58.30
-84.222.9.124
08/12/2006 22.34.47
Antonio Ganci-82.48.239.56
Elenco completo versioni Elenco completo versioni
Cohesion
.
Summary Definizione del concetto di coesione (cohesion), elenco dei tipi di coesione ed alcuni esempi pratici per spiegare meglio i concetti esposti.

Pubblicato nella Rubriki Numero 4 - 14 Dic 2006 da AntonioGanci

Definizione di Coesione?

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.
  • Temporale: I metodi di una classe sono collegati temporalmente. Es: la classe ProgramStartUp che contiene i metodi LeggiFileDiConfigurazione, VerificaCredenziali, ApriConnessioneDatabase, ecc. cioè tutte le operazioni sono correlate dal fatto che avvengono quando il programma parte.
  • 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.
VediAnche Coupling, PatternHighCohesion, http://www.waysys.com/ws_content_bl_pgssd_ch06.html

UGIdotNETWiki

UGIdotNETWiki è il WikiWiki italiano dedicato a .NET

Se è la prima volta che senti parlare di Wiki, leggi il BenvenutoAiVisitatori e WikiInUnMinuto, oppure il ManualePassoPassoDelWiki.

Argomenti Recenti

  • Cohesion
© 2008 User Group Italiano UGIdotNET. Tutti i diritti riservati. Note legali