I linguaggi di programmazione imperativi permettono di suddividere il programma in moduli (chiamati sottoprogrammi, procedure o subroutine o anche funzioni).
Un problema, scomposto in sottoproblemi mediante l’analisi top down, può essere implementato utilizzando:
-
un programma principale per il problema generale,
-
un modulo per la soluzione di ciascun sottoproblema.
Il programma principale richiama il modulo necessario in un certo punto (il richiamo di solito avviane tramite il nome del modulo o una semplice istruzione). Un modulo può richiamare altri moduli (si parla di nidificazione delle procedure); un modulo inoltre può venire richiamato più volte, in punti diversi, senza la necessità di dover ripetere le istruzioni che lo descrivono.
I principali vantaggi dell’utilizzo di moduli separati sono:
-
migliorano la leggibilità del programma;
-
permettono di ridurre la quantità di codice da scrivere, se devono essere richiamati in più punti;
-
sono riutilizzabili: si possono conservare moduli che risolvono problemi che si presentano frequentemente, per riutilizzarli in altri casi, creando delle librerie di software.
Funzionamento dei sottoprogrammi
Quando un programma richiama una procedura, si sospende l’esecuzione sul programma e si passa ad eseguire le istruzioni della procedura; quando la procedura termina, si riprende l’esecuzione del programma chiamante, dall’istruzione successiva a quella di richiamo della procedura (rientro dalla procedura).
Una procedura può a sua volta richiamare altre procedure e così via (chiamate nidificate); l’esecuzione viene sospesa e prosegue sulla procedura richiamata; quando la procedura termina, si riprende l’esecuzione del modulo chiamante, dall’istruzione successiva a quella di richiamo.
Ogni modulo deve svolgere un compito preciso e nascondere il suo funzionamento al modulo che lo richiama.
Ogni modulo deve avere una forte coesione e pochi collegamenti con l’esterno, deve cioè risolvere un problema particolare e avere pochi dati in comune con l’esterno.
Lo scambio dei dati con l’esterno avviene tramite i parametri, come si vedrà più avanti. Dire che il modulo deve avere pochi dati in comune con l’esterno significa che deve avere pochi parametri di input/output.
Funzioni
Una funzione è un sottoprogramma che può avere una lista di parametri e che restituisce un valore, associato al nome della funzione stessa.
La funzione ha un tipo che è il tipo del valore restituito.