Transparencia Referencial
Enviado por MerariKeren • 17 de Septiembre de 2014 • 865 Palabras (4 Páginas) • 264 Visitas
TRANSPARENCIA REFERENCIAL
Hay transparencia referencial si al reemplazar una operación por su resultado se logra el mismo efecto. Una definición alternativa dice: Hay transparencia referencial cuando al realizar una operación con los mismos valores siempre da el mismo resultado. Si bien esta parece más fácil de entender, no es tan precisa como la primera; puede ser útil para dar los primeros pasos, pero para el final hay que terminar de entender la otra.
También se puede pensar en las propiedades necesarias para tener Transparencia Referencial.
Decimos que una operación tiene transparencia referencial si es:
Independiente: No dependen del estado de nada que este fuera de si misma
Sin estado/Stateless: No tiene un estado que se mantenga de llamada en llamada
Determinística: Siempre devuelven el mismo valor dados los mismos argumentos
Ejemplos
Cuando hablamos de que "algo" tiene transparencia referencial, efecto de lado o asignación destructiva, ese "algo" es la realización de una operación, de un lenguaje en particular o de un paradigma.
Estos tres conceptos suelen ir de la mano y si bien pueden darse relaciones entre ellas es saludable poder detectar la aparición de cada uno de ellos individualmente. Una relación que surge de la definición de transparencia referencial es que para ésta se dé, no puede haber efecto colateral, ya que si el estado del sistema se modifica, no es lo mismo ejecutar esa operación que reemplazar por el resultado.
A continuación mostramos algunos ejemplos en Smalltalk, ya que permite la aparición de todas estas características, para dejar más en claro de qué manera podemos identificarlas.
Ejemplo 1: consulta no determinística
Date today
Transparencia Referencial: NO (Con cualquiera de las 2 definiciones de transparencia referencial)
Efecto de Lado: NO
Asignación Destructiva: NO
Evaluarlo con los mismos parámetros (o sea ninguno) en días distintos va a dar resultados distintos. Reemplazar la operación por el resultado una vez que cambia el día se rompe todo. Asignación destructiva y efecto de lado hay, pero en la CPU que actualiza la variable que indica el tiempo, no en el mensaje today que consulta ese valor (no se si es tan así, pero es a modo ilustrativo).
El efecto colateral de otra operación afecta a esta operación y le hace perder la transparencia referencial, a pesar de que esta operación por si misma NO tiene efecto de lado.
Ejemplos como este hacen que transparencia referencial y efecto colateral no sean conceptos opuestos.
Ejemplo 2: método con efecto
#LaColeccionConEfectoDeLado
>>add: unElemento
"El add: siempre devuelve lo que se agrega. Acá se redefine para avisarle
al elemento que fue agregado (no se me ocurrió nada mejor)"
unElemento teAgregaronEn: self.
^super add: unElemento.
Transparencia Referencial:
...