- Transparencia referencial
-
La transparencia referencial es un término utilizado en la programación funcional que se refiere a la propiedad por la cual "una expresión E del lenguaje es sustituida por el valor V, y V es el resultado de evaluar E, es decir, la semántica del programa no se altera".
En otras palabras, el resultado de evaluar una expresión compuesta depende únicamente del resultado de evaluar las subexpresiones que la componen y de nada más; no depende de la historia del programa en ejecución ni del orden de evaluación de las subexpresiones que la componen.
Esta propiedad no se da en lenguajes imperativos, donde abundan los efectos laterales por asignaciones destructivas. Por ejemplo, en esta clase escrita en lenguaje Java:
class Clase{ static int m = 1; static int dame() { m++; return m-1;} static int hola() { return dame();} static int a1() { return m + dame();} static int a2() { return dame() + m;} }
No podemos sustituir
dame()
por su valor, en el métodohola()
, pues suprimiríamos el efecto lateral de incremento dando un programa diferente al original. La sustitución de una expresión por su valor genera un programa diferente.Como ya se ha dicho, otra complicación de los lenguajes sin transparencia referencial es que dificultan el razonamiento ecuacional: los métodos
a1()
,a2()
no devuelven los mismos resultados con un mismo valor inicial dem
. Por ejemplo: param=0
,a1()
devolverá0
la primera vez que se ejecute, mientras quea2()
devolverá1
la primera vez que se ejecute.
La transparencia referencial es muy útil a la hora de modificar un programa, ya que no tenemos que preocuparnos de que las modificaciones que hagamos en una parte del mismo afecten los cálculos que se hacen en otras. También es muy poderosa a la hora de verificar un programa (demostrar matemáticamente que cumple la especificación), ya que podemos utilizar propiedades ya demostradas de todas las subexpresiones que constituyen una expresión y que son válidas en cualquier contexto.
Wikimedia foundation. 2010.