Ver Mensaje Individual
  #12  
Antiguo 19-09-2012
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.913
Reputación: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
Empezado por Julián Ver Mensaje
Y ¿Cuales son eso efectos colaterales?
http://docs.python.org/howto/functional.html

Cita:
In a functional program, input flows through a set of functions. Each function operates on its input and produces some output. Functional style discourages functions with side effects that modify internal state or make other changes that aren’t visible in the function’s return value. Functions that have no side effects at all are called purely functional. Avoiding side effects means not using data structures that get updated as a program runs; every function’s output must only depend on its input.
El efecto colateral es este: amigos.sort()

Supongamos que el codigo que puse (ambos son python, pongo etiqueta PHP por los colores, ya que no hay para python) fuera una funcion:

Código PHP:
def listarAmigos(amigos):
    
amigos.sort()

    for 
amigo in amigos:
        
yield amigo.upper()


amigos = ['b','a','c']

print list(
listarAmigos(amigos))
>> 
RESULTADO: ['A''B''C']
print 
amigos
>> RESULTADO: ['a''b''c'
Como ves, al invocar listarAmigos ocurrio un efecto colateral: La funcion altero los datos/objetos.

En la programacion funcional se busca que con la MISMA entrada ocurra EXACTAMENTE, SIEMPRE, la MISMA salida. Esto ayuda a que el programa sea mas confiable, correcto y sin sorpresas inesperadas.

O en otras palabras, se busca la inmutabilidad de los datos, y se prefiere retornar copias nuevas de los datos transformadas por funciones.

En forma funcional:

Código PHP:
def listarAmigos(amigos):
    for 
amigo in sorted(amigos):
        
yield amigo.upper()


amigos = ['b','a','c']

print list(
listarAmigos(amigos))
>> 
RESULTADO: ['A''B''C']
print 
amigos
>> RESULTADO: ['b''a''c'
No se altero la estructura inicial (amigos).

Los efectos colaterales son causas de muchos errores y dificultad en depurar los programas, porque en cualquier momento, una estructura cambia su significado e informacion al ir pasando de un lado al otro, y el manejo del estado se debe chequear manualmente (recordar que si paso un objeto mutable lo que envie me puede devolver algo inesperado).

Cita:
Functional programming can be considered the opposite of object-oriented programming. Objects are little capsules containing some internal state along with a collection of method calls that let you modify this state, and programs consist of making the right set of state changes. Functional programming wants to avoid state changes as much as possible and works with data flowing between functions. In Python you might combine the two approaches by writing functions that take and return instances representing objects in your application (e-mail messages, transactions, etc.).
Por lo tanto, se puede decir que OO es manipular maquinas de estado, donde cada "palanca" y "boton" representa un conjunto de datos y operaciones diferentes, mientras en funcional, cada funcion representa una transformacion de datos.

En OO se puede llegar a cosas raras como:

Código PHP:
class BD:
    
conexion = ...
    
esActivo false

    def open
(self):
        
self.conexion Conexion()
        
self.esActivo true

    def consulta
(selfsql):
        
#Esto es un error en potencia. El significado
        #de consulta depende de que previamente se abra
        #la conexion! Se debe colocar guardas
        
return self.conexion.ExeSql(sql)
        
#Ok, una guarda        
        
if self.esActivo:
            
#El colocar una guarda NO garantiza la ejecucion! El estado esta desconectado de los datos!
            
return self.conexion.ExeSql(sql)

bd = new BD()

bd.open()

#ERROR. No hay garantia del manejo de estado, sin 
#programacion cuidadosa
bd.conexion None

print bd.consulta("SELECT 1"
Este es un ejemplo de como los estados con efectos colaterales complican la programacion y generan potenciales errores.
__________________
El malabarista.
Responder Con Cita