Coesione
Con il termine di coesione indichiamo il principio che ha portato ad unire più istruzioni in un modulo, o a dividere in un modulo separato delle istruzioni contenute prima in un modulo più grande.
Non abbiamo delle divisioni precise e misurabili della coesione, ma uno spettro di situazioni più o meno accettabili in cui cade ogni modulo. Vediamo le principali.
La forma di coesione meno efficace è quella che chiameremo "coesione per coincidenza". Se in un blocco di istruzioni ci accorgiamo che delle istruzioni sono ripetute uguali in più parti possiamo produrre una SUBROUTINE, che ha in comune tutti i dati con il blocco che la ha generata. In questo caso non cè stato nessun principio unificante se non quello di una pura coincidenza di righe di programma.
Ad un grado appena più elevato troviamo i moduli che hanno una "coesione logica", cioè che eseguono una serie di compiti correlati perchè logicamente correlati tra loro. Un esempio potrebbe essere un modulo che produce tutte gli output: vi è una correlazione logica delle sue parti, anche se poi possiamo avere degli output completamente diversi tra loro, come stampe su carta, stampe a video o addirittura pilotaggio di dispositivi esterni.
Un terzo modo di unire i moduli è per logica "temporale": quando si uniscono dei compiti funzionalmente diversi tra loro ma che devono essere eseguiti insieme e in precisa sequenza temporale, come per esempio in risposta ad una situazione di errore.
In questo caso avremo un susseguirsi di operazioni: chiudi i file, emetti un messaggio di errore, salva lo stato interno, interrompi il programma. Un modulo che riunisca queste operazioni ha come logica coesiva la "temporalità" degli eventi gestiti.
Anche "sequenzialità" può essere una logica di unione di più istruzioni. Alle volte è proprio il susseguirsi di funzioni semplici che risolve un compito più complesso. Molto spesso queste funzioni devono operare su uno stesso blocco di dati, per cui possiamo anche parlare di coesione "per comunicazione".
Lultima e più pulita forma di coesione è per "funzionalità". Un modulo che risolve un ben preciso compito ha avuto come principio ispiratore la funzionalità. Questa è decisamente la forma di coesione da ricercare ogni volta che sia possibile.

Una buona tecnica per capire il tipo di coesione di un modulo è descriverlo con una singola frase e quindi analizzarla:
Se la frase è lunga, con virgole e punti
e virgola probabilmente il modulo esegue più di un funzione e
quindi deve avere una coesione sequenziale o di comunicazione.
Se la frase contiene parole come
"prima", "poi", "allora",
"quando", "inizio" probabilmente il modulo è
stato creato con lidea di unione sequenziale o temporale.
Se il verbo della frase non ha un singolo
oggetto probabilmente è stata usata una coesione logica:
"Edita tutti i dati" ha una coesione logica,
"Edita una linea di sorgente" ha una coesione
funzionale.
Se ci sono termini come
"inizializza", "pulisci", "azzera",
il modulo è stato sviluppato con coesione temporale.
In pratica non è necessario determinare con precisione con quale principio unificante sia stato creato un modulo, ma almeno avere un idea di quali sono le parti a bassa coesione per identificare le parti di programma suscettibili di un successivo raffinamento.