Trasparenza referenziale

Da Wikipedia, l'enciclopedia libera.

In informatica, si definisce trasparente referenzialmente una funzione che non ha effetti collaterali e che quando riceve lo stesso parametro in input, restituisce sempre lo stesso valore.

Mentre in matematica tutte le funzioni sono referenzialmente trasparenti, in programmazione non è così. Per esempio, una funzione che non accetta parametri e ritorna l'input di una tastiera restituisce sempre un valore che cambia in base al tasto che viene premuto, e quindi più chiamate alla stessa funzione, con la stessa identica lista di parametri (in questo caso una lista vuota), possono rendere valori differenti.

Un altro esempio, meno evidente ma molto significativo, è quello di una funzione che usa una variabile globale (cioè accessibile da tutta l'applicazione) come appoggio per calcolare il valore da restituire. Poiché questa variabile non è passata come parametro fisso, ma può invece essere modificata durante la chiamata, i valori restituiti dalla funzione possono essere diversi anche se tutti i parametri passati sono uguali. Da notare, tuttavia, che quando si adotta lo stile della pura programmazione funzionale anche una funzione che usa variabili globali può essere referenzialmente trasparente, in quanto in questo tipo di programmazione non è consentito modificare il valore di tali variabili.

L'uso della trasparenza referenziale ha il grande vantaggio di permettere al programmatore di poter contare su un comportamento univoco delle funzioni che implementa, protette da altre azioni esterne, a priori non sempre prevedibili. Questo aiuta molto nel processo di testing e debug, semplifica l'implementazione di algoritmi, rende più facili la modifica e l'ottimizzazione dei programmi senza cambiarne radicalmente la struttura per mezzo di un processo chiamato memoizzazione.

Alcuni linguaggi di programmazione utilizzano soltanto funzioni di questo tipo, almeno per tutto ciò che non ha a che vedere con l'input/output.

La trasparenza referenziale tuttavia può comportare, come conseguenza indesiderata, che non è possibile, quando la si applica, distinguere fra il riferimento ad un'"entità" e l'entità stessa, distinzione che, invece, è facile ottenere utilizzando le normali tecniche di programmazione.