Scrivere una Funzione

Da Gambas-it.org - Wikipedia.

Una Funzione |1| |2| è una routine, chiamata da una routine principale, alla quale è delegato il compito di svolgere una serie di operazioni, e delle quali essa restituisce alla routine principale chiamante il risultato.

Poiché una funzione deve eseguire un compito, si ritiene non opportuno scrivere una funzione per eseguire più istruzioni insieme. E' preferibile scrivere funzioni per singoli compiti ed una ulteriore funzione che svolga l'operazione complessa, invocando le funzioni precedenti.

La funzione informatica converte argomenti di un determinato insieme in un valore di ritorno di un altro determinato insieme.


Passaggio dei valori ad una Funzione

La Funzione principale chiamante può passare attraverso i suoi argomenti uno o più valori alla Funzione chiamata. Il passaggio degli argomenti ad una Funzione può essere di tre tipi:

  • per valore;
  • per indirizzo;
  • per riferimento.


Passaggio per valore

Il passaggio per valore è senz'altro la modalità più frequente di passare dei dati ad una Funzione chiamata.

Con il passaggio per valore viene effettuata una copia della variabile passata alla Funzione chiamata come argomento della Funzione principale chiamante. Inoltre, le modifiche alla variabile del parametro passato, effettuate nella Funzione chiamata, restano confinate nell'ambito locale di detta Funzione secondaria. Ciò significa che la variabile, passata precedentemente come parametro dalla Funzione chiamante a quella chiamata, non vede modificarsi il suo valore, nonostante la sua copia abbia subito una modifica del proprio valore a seguito di una o più operazioni nella Funzione secondaria chiamata.
Se, dunque, non vi fosse ritorno di valore della varibile-copia, ora con valore modificato, alla Funzione principale chiamante, non sarebbe possibile utilizzare le modifiche apportate dalle operazioni alle quali la Funzione secondaria chiamata è stata preposta.


Mostriamo un semplice esempio:

Public Sub Button1_Click() ' Routine principale

 Dim a, b, risultato_di_ritorno As Integer

  a = 2
  b = 3

' Chiama la Funzione, e le passa i due valori, affinché li elabori.
' Alla fine la Funzione restituirà il risultato che riempirà la variabile integer "risultato_di_ritorno":
  risultato_di_ritorno = funzione_chiamata(a, b)
 
' Mostriamo il risultato in console:
  Print "Risultato di ritorno dalla funzione = "; risultato_di_ritorno

End


' La funzione secondaria "Funzione_Chiamata" contiene il proprio nome ed i parametri come variabili dei valori passati dalla routine chiamante, e non prevede l'aggiunta della parola chiave "Sub".
' Essa, poiché restituisce - in questo nostro esempio - un valore Integer, termina la propria dichiarazione con: As Integer.
Public Function Funzione_Chiamata(aF As Integer, bF As Integer) As Integer

 Dim somma As Integer

  somma = aF + bF '|3|

' Viene restituito il risultato alla routine chiamante:
  Return somma
 
End

In console avremo coerentemente:
Risultato di ritorno dalla funzione = 5


...e se la Funzione deve restituire due o più risultati ?

Per ottenere da una medesima Funzione due o più risultati (quindi senza dover utilizzare una variabile globale), possiamo utilizzare un array.

Facciamo un esempio di una Funzione che restituisce un duplice risultato:

Public Sub Button1_Click() ' routine principale chiamante

Dim risultato_di_ritorno As Integer[]
Dim a, b As Integer

a = 2
b = 3

 ' Chiama la Funzione, e le passa i due valori, affinché li elabori.
 ' Alla fine la Funzione restituirà il risultato che riempirà la variabile vettore integer[] "risultato_di_ritorno":
    risultato_di_ritorno = funzione_chiamata(a, b)

 ' Mostriamo il primo risultato (la somma) in console:
    Print "Risultato (somma) di ritorno dalla funzione = "; risultato_di_ritorno[0]

 ' Mostriamo il secondo risultato (la differenza) in console:
    Print "Risultato (differenza) di ritorno dalla funzione = "; risultato_di_ritorno[1]

End


 ' La routine Funzione, poiché restituisce - in questo nostro esempio - un valore vettore Integer[],
 ' termina la propria dichiarazione con: As Integer[].
Public Function funzione_chiamata(aF As Integer, bF As Integer) As Integer[]

 Dim somma As Integer
 Dim differenza As Integer
 Dim doppiorisultato As New Integer[]

   somma = aF + bF
   differenza = bF - aF

 ' Nel primo campo dell'array inseriamo il valore contenuto dalla variabile Integer "somma":
   doppiorisultato.Add(somma)

 ' Nel secondo campo dell'array inseriamo il valore contenuto dalla variabile Integer "differenza":
   doppiorisultato.Add(differenza)


 ' Dunque ora la variabile Integer[] "doppiorisultato" contiene due valori.
 ' Tale duplice contenuto di questa variabile Integer[] viene restituito alla routine principale chiamante:
   Return doppiorisultato

End

In console avremo coerentemente:
Risultato (somma) di ritorno dalla funzione = 5
Risultato (differenza) di ritorno dalla funzione = 1


Scrivere ed invocare una Funzione in un Modulo

La scrittura e la successiva invocazione di una Funzione in un Modulo segue la procedura normale.


Facciamo un semplissimo esempio.

Nella Classe principale avremo il seguente codice:

Public Sub Form_Open()  
 
Dim by As Byte  
  
' Invochiamo la funzione nel Modulo e le passiamo un valore di tipo Byte (in questo esempio: 6 ).
' Essa, a sua volta, ci passerà un valore che inseriremo nella variabile "by":
   by = Module1.funzioneNelModulo(6)
 
   Print by
 
End


Nel Modulo avremo:

Public Function funzioneNelModulo(a As Byte) As Byte  ' Riceve dalla funzione chiamante un valore di tipo "Byte", ed un valore di tipo "Byte" a sua volta restituirà  
  
 Dim b As Byte  
  
  b = 2  
  
' La Funzione effettua l'operazione per la quale è stata concepita:
    b = b * a  
  
' Restituisce, quindi, alla funzione chiamante, presente nella Classe principale, il risultato dell'operazione:
    Return b
  
End



Note

[1] «La "funzione" di una cosa è ciò che la sola cosa può compiere.» (Platone, La Repubblica)

[2] Si rinvia anche a Wikipedia per una definizione più ampia della Funzione.

[3] La tipologia delle variabili aF e bF è stata già dichiarata all'interno dei parametri della Funzione: (aF As Integer, bF As Integer).