10
Transparencia Referencial

Transparencia Referencial

Embed Size (px)

Citation preview

Page 1: Transparencia Referencial

Transparencia Referencial

Page 2: Transparencia Referencial

Definición • 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.

Page 3: Transparencia Referencial

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.

Page 4: Transparencia Referencial

Efecto de Lado/Colateral (Side Effect)

• Hay efecto de lado cuando un cambio se estado sobrevive a la realización de una operación.

• Por ejemplo: Una operación puede ser modificar una variable global, modificar uno de sus argumentos, escribir datos a la pantalla o a un archivo, o hacer uso de otras operaciones que tienen efecto de lado.

• Otra definición valida es: • Si le sacas fotos al sistema (llamémosla F1), después realizas la

operación de tu interés, y le vuelves a sacar una foto al sistema (F2).Si F1 y F2 son distintas => la operación que hiciste tiene efecto colateral.

Page 5: Transparencia Referencial

Asignación Destructiva

• Asignar destructivamente es reemplazar el valor de una variable por otro valor.

• La unificación no se considera asignación. Unificar es encontrar una sustitución capaz de igualar 2 términos. Cuando se efectiviza esta sustitución hablamos de ligado de variable.

Page 6: Transparencia Referencial

• Cuando hablamos de que “algo” tiene transparencia referencial, efecto de lado o asignación destructiva es la realización de una operación, de un lenguaje en particular o de una 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 el resultado.

Page 7: Transparencia Referencial

Ejemplos

• 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 va a dar resultados

distintos. Reemplazar la operación por el resultado una vez que cambia el día se rompe todo

Page 8: Transparencia Referencial

• 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: NO. En un final, si se da un caso como este y están en duda, justifiquen por qué si o no.

• Efecto colateral: SI, porque la colección, luego de recibir el mensaje add: se modifica.

• Asignación destructiva: no se la ve directamente en este método, si bien puede estar presente en teAgregaronEn: o en add: Probablemente no tenga mucho sentido hablar de asignación destructiva en este ejemplo.

Page 9: Transparencia Referencial

• Asumiendo que los parámetros siempre entienden el mensaje #teAgregaronEn: no importa cuantas veces se realicen estás operaciones siempre devuelven el parámetro.

LaColeccionConEfectoDeLado new add: 4. “Devuelve 4”LaColeccionConEfectoDeLado new add: pepita. “Devuelve pepita”

• Pero obviamente no es lo mismo escribir(LaColeccionConEfectoDeLado new add: 4) que esto (4)

• Acá se puede ver la importancia de utilizar la definición correcta de transparencia referencial.

Page 10: Transparencia Referencial

• Ejemplo 3: método de consulta determinística•

#Number >>factorial | resultado | resultado := 1. self < 0 ifTrue: [ self error: ‘Como que no va pedirle el factorial a un numero negativo’ ]. 1 to: self do: [ :índice | resultado := resultado * índice ]. ^resultado

• Transparencia Referencial: SI (con las 2 definiciones)• Efecto colateral: NO• Asignaciones Destructivas: SI