Funzioni e procedure in Java

Tutti i programmi che abbiamo realizzato finora erano costituiti da una sequenza di istruzioni, semplici o composte, scritte all'interno del metodo main.
Questa strategia è applicabile fino a quando i programmi sono di piccole dimensioni e si limitano alla risoluzione di problemi piuttosto semplici.
Quando questi diventano più complessi o semplicemente più corposi, questa tecnica non è più sostenibile.
Ad esempio, se dobbiamo compiere la stessa azione diverse volte, su dati differenti, non è conveniente scrivere più volte, nello stesso programma, le stesse istruzioni, che implementano la stessa logica, semplicemente applicandola a dati differenti.

In queste circostanze si preferisce definire una procedura o una funzione che risolve un determinato sottoproblema del problema originario, di dimensioni ridotte, e la si utilizza in tutti i punti del problema originario in cui si ha la necessità di risolvere quello specifico sottoproblema, passando le informazioni su cui lavorare in quel preciso contesto.

Riassumendo, quindi, una procedura o una funzione è una sequenza di istruzioni che, partendo da dati di input, risolve un sottoproblema specifico del problema originario, di dimensioni ridotte.

Nello specifico:

  • una procedura è una sequenza di istruzioni che, partendo da dati di input, esegue un compito, senza restituire risultati in output
  • una funzione, invece, è una sequenza di istruzioni che, partendo da dati di input, esegue un calcolo e restituisce il risultato in output
La differenza tra una procedura ed una funzione sta nella specifica di un tipo di output e nell'uso della istruzione return, che approfondiremo più avanti, all'interno del corpo o implementazione della funzione.

Essendo un linguaggio ad oggetti, Java non possiede i concetti di funzione e procedura veri e propri, ma questi possono essere simulati attraverso i metodi statici, o metodi di classe, che approfondiremo dettagliatamente nel corso della programmazione ad oggetti (O.O.P.).
Al momento ci accontenteremo di sapere che i metodi statici costituiscono lo strumento per implementare funzioni e procedure in Java.

Nel dettaglio una procedura in Java può essere schematizzata come indicato di seguito:
public static void nomeProcedura(tipo1 parametro1, ... tipoN parametroN) {

    // sequenza di istruzioni 
    // per compiere uno specifico lavoro                   

}

Nota:
La parola chiave void prima del nome della procedura sta ad indicare che non viene restituito alcun risultato in output, infatti nel corpo della procedura non compare la parola chiave return.

Una funzione in Java può essere, invece, schematizzata come indicato di seguito:
public static tiporisultato nomeFunzione(tipo1 parametro1, ... tipoN parametroN) {

    // sequenza di istruzioni 
    // per compiere uno specifico calcolo  
    
    return risultato; // di tipo tiporisultato
}

Nota:
Il tiporisultato che precede il nome della funzione sta ad indicare questa restituirà un risultato in output del tipo tiporisultato. Questo è confermato dalla presenza, al termine delle istruzioni di calcolo, della parola chiave return, seguita dal risultato da restituire.

Istruzione return

L'istruzione return termina l'esecuzione della procedura/funzione e restituisce il controllo al chiamante (main o altra funzione/procedura).
Se tale parola chiave è seguita da una variabile o da una espressione, il valore contenuto nella variabile o risultante dalla risoluzione dell'espressione viene restituito in output al chiamante.
L'istruzione return può essere presente anche in diversi punti di una procedura/funzione.
La sua esecuzione, come già detto poc'anzi, interrompe l'esecuzione della procedura/funzione e restituisce il controllo al chiamante, passando eventualmente un valore di output.

Tale concetto sarà ripreso e spiegato ulteriormente nella sezione esercizi sulle funzioni.