Innanzitutto ciao!
Allora... Partiamo col dire che sia le funzioni sia le procedure fanno parte dei cosìdetti "sottoprogrammi"... La differenza sostanziale che distingue le une dalle altre (ed è anche la differenza più visibile e tangibile) è che le funzioni restituiscono "qualcosa", le procedure no...
Faccio un esempio in C
Questa è evidentemente una funzione, in quanto nella sua firma è presente l'indicazione del tipo restituito. In fase di compilazione se mancasse il "return 0;" ci verrebbe restituito un errore. Tra l'altro le funzioni sono "tipizzate", nel senso che non possono restituire qualunque cosa: Devono OBBLIGATORIAMENTE restituire qualcosa che sia del tipo indicato nella firma, o completamente compatibile (i.e. char e int).
Se io invece scrivo:
Codice:
void foo2()
{
printf("foo2");
}
Ho palesemente scritto una procedura... La parola chiave "void" che precede il nome del sottoprogramma nella sua firma sta ad indicare che quel sottoprogramma non restituirà nulla (nel nostro caso si produrrebbe solo la scritta "foo2" nello standard output). Anche nelle procedure è possibile usare "return" ma solo per ritornare il controllo al chiamante (di fatto se inserisco qualcosa dopo il return in una procedura ottengo un errore in compilazione).
C'è anche un aspetto importante e più sottile: Le funzioni, dato che restituiscono qualcosa, possono essere valutate... Sotto questo profilo possono essere viste come vere e proprie espressioni o parte di esse. Possono infatti stare a destra di un operatore di assegnamento, possono stare a destra o a sinistra di un operatore binario e così via (ovviamente le tipizzazioni devono essere corrette).
Le procedure invece non possono assolutamente essere viste come espressioni, in quanto non restituendo nulla non possono essere valutate... Le procedure sono più dei "comandi", e come tali vengono eseguiti senza produrre risultati restituiti.
Tra C, C++ e Java non ci sono grandi differenze... Il discorso che ho fatto prima è validissimo per tutti e tre i linguaggi... Le differenze casomai si riscontrano parlando di oggetti. In effetti C++ e Java sono due linguaggi OOP... Normalmente in questi linguaggi si fa riferimento indistintamente a funzioni e procedure parlando di "metodi". Talvolta si tende a differenziare funzioni e procedure cambiandogli il nome... Le funzioni diventano "metodi osservatori dello stato" e le procedure "metodi modificatori dello stato". Questo perchè tutto è orientato agli oggetti... Se ci pensi (per me è scontato che tu conosca gli oggetti, se non è così quello che segue ti sarà un po' oscuro), le funzioni, restituendo un valore, sono adatte ad essere lo strumento sonda dello stato in cui un oggetto si trova (osservano dunque lo stato): una funzione è ottima se il chiamante vuole sapere in che stato si trova un oggetto (di fatto cosa vale una sua variabile di istanza, o combinazioni di variabili di istanza). Le procedure invece sono molto più adatte per comandare un oggetto, e quindi modificarne lo stato interno (modificando le sue variabili d'istanza).
Nella programmazione orientata agli oggetti è importantissimo, infine, non confondere metodi costruttori con le procedure... Entrambi non restituiscono nulla, MA i primi sono metodi che inizializzano lo stato di un oggetto, e non restituiscono NEMMENO void, le seconde invece restituiscono void e sono di solito i modificatori dello stato.
Mi scuso se ho scritto così tanto, ma spero di esserti stato d'aiuto... Se ci sono problemi fai un fischio
