Il termine coesione è stato originariamente utilizzato per descrivere i moduli del codice sorgente come misura qualitativa di quanto bene il codice sorgente del modulo fosse correlato tra loro. L'idea di coesione è utilizzata in una varietà di campi. Ad esempio, un gruppo di persone come un'unità militare può essere coeso, il che significa che le persone nell'unità lavorano insieme per un obiettivo comune.
L'essenza della coesione del codice sorgente è che il codice sorgente in un modulo lavora insieme verso un obiettivo comune e ben definito. La quantità minima di codice sorgente necessaria per creare gli output del modulo è nel modulo e non di più. L'interfaccia è ben definita e gli input fluiscono attraverso l'interfaccia e le uscite fluiscono di nuovo attraverso l'interfaccia. Non ci sono effetti collaterali e l'enfasi è sul minimalismo.
Un vantaggio dei moduli coesi dal punto di vista funzionale è che lo sviluppo e l'automazione di unit test è semplice. In effetti, una buona misura della coesione di un modulo è la facilità con cui è possibile creare una serie completa di unit test esaustivi per il modulo.
Un modulo può essere una classe in un linguaggio orientato agli oggetti o una funzione in un linguaggio funzionale o non orientato agli oggetti come C. Gran parte del lavoro originale in quest'area di misurazione della coesione riguardava principalmente il lavoro con i programmi COBOL presso IBM nel Anni '70 quindi la coesione non è sicuramente solo un concetto orientato agli oggetti.
L'intento originale della ricerca da cui provenivano il concetto di coesione e il concetto associato di accoppiamento era la ricerca di quali fossero le caratteristiche dei programmi che erano facili da capire, mantenere ed estendere. L'obiettivo era essere in grado di apprendere le migliori pratiche di programmazione, codificare quelle migliori pratiche e quindi insegnare le pratiche ad altri programmatori.
L'obiettivo di un buon programmatore è scrivere codice sorgente la cui coesione sia la più alta possibile dato l'ambiente e il problema da risolvere. Ciò implica che in un'applicazione di grandi dimensioni alcune parti del corpo del codice sorgente varieranno da altre parti per quanto riguarda il livello di coesione del codice sorgente in quel modulo o classe. A volte il meglio che puoi ottenere è la coesione temporale o sequenziale a causa del problema che stai cercando di risolvere.
Il miglior livello di coesione è la coesione funzionale. Un modulo con coesione funzionale è simile a una funzione matematica in quanto fornisci un insieme di input e ottieni un output specifico. Un modulo veramente funzionale non avrà effetti collaterali oltre all'output né manterrà alcun tipo di stato. Avrà invece un'interfaccia ben definita che incapsula la funzionalità del modulo senza esporre nessuna delle parti interne del modulo e la persona che utilizza il modulo fornirà un particolare insieme di input e riceverà un particolare output in cambio. Un modulo veramente funzionale dovrebbe essere anche thread-safe.
Molte librerie di linguaggi di programmazione contengono una serie di esempi di moduli funzionali che siano classi, modelli o funzioni. Gli esempi coesivi più funzionali sarebbero funzioni matematiche come seno, coseno, radice quadrata, ecc.
Altre funzioni possono avere effetti collaterali o mantenere uno stato di qualche tipo risultando nel rendere più complicato l'uso di tali funzioni.
Ad esempio una funzione che genera un'eccezione o imposta una variabile di errore globale ( errno
in C) o deve essere utilizzata in una sequenza (strtok()
funzione è un esempio dalla libreria C standard poiché mantiene uno stato interno) o che fornisce un puntatore che deve quindi essere gestiti o rilasciare un log a qualche utility di log sono tutti esempi di una funzione che non è più funzionale alla coesione.
Ho letto sia il libro originale di Yourdon che quello di Constantine, Structured Programming, dove mi sono imbattuto per la prima volta nell'idea di coesione negli anni '80 e il libro di Meilir Page-Jones Practical Guide to Structured Systems Design, e Page-Jones ha fatto un lavoro molto migliore nel descrivere sia accoppiamento che coesione. Il libro di Yourdon e Constantine sembra un po 'più accademico. Il libro di Steve McConnell Code Complete è abbastanza buono e pratico e l'edizione rivista ha molto da dire sulle buone pratiche di programmazione.