2011-03-21 31 views
7

La mayoría de los tutoriales/artículos/libros hablan sobre los efectos secundarios al presentar la programación funcional. Tome este código Python:Programación funcional: Efectos secundarios

def isPrime(n): 
    k = 2 
    while k < n: 
     if n % k == 0: 
      return False 
     k += 1 
    return True 

El texto dice que la función anterior tiene efectos secundarios locales, y no lo entiendo. Veo que la variable "k" está cambiando, no entiendo qué es lo malo que sale de ella.

¿Puede alguien dar un claro ejemplo de los efectos secundarios negativos, y cómo se evita mediante la programación funcional?

+0

W.r.t. efectos secundarios, tenga en cuenta que FP vs. programación procedural [es ortogonal a IP vs. DP] (http://stackoverflow.com/questions/602444/what-is-functional-declarative-and-imperative-programming/8357604#8357604) –

Respuesta

16

El texto al que se refiere es correcto, cambiar una variable local se considera un efecto secundario.

No dice necesariamente que esto sea algo malo. Simplemente no es programación funcional. En lenguajes de programación funcionales puros, escribiría el ciclo de forma recursiva, eliminando la necesidad de cambiar variables.

Escribir funciones como estas (que no tienen efectos secundarios observables) es una buena práctica en cualquier idioma, simplemente no es una programación funcional.

Editar: Ahora veo tu observación sobre los efectos secundarios "malos". No diría que los efectos secundarios son malos. En la mayoría de los lenguajes principales, es difícil programar sin ellos, y creo que muchos programadores piensan en términos de efectos secundarios. Pero en grandes proyectos de software, confiar demasiado en los efectos secundarios puede hacer que su vida sea bastante miserable. Here's a nice example involving singletons (the ultimate way to cause side effects)

En un lenguaje que prohíbe los efectos secundarios, hay menos sorpresas para usted como programador, pero también para el compilador. El código funcional puro es más fácil de analizar y paralelizar, y es, al menos teóricamente, más fácil de optimizar por el compilador.

3

Los efectos secundarios (específicamente no tener transparencia referencial) hacen que result of your code depend on the order of execution of the statements. Por lo tanto, un cambio en el orden de invocación de un par de llamadas de función podría alterar el comportamiento en un área desconectada de su programa. Esto se debe a que no estaban realmente desconectados, debido al intercambio mutuo de efectos secundarios.

Esto hace que la descomposición de su programa sea difícil de implantar, frustrando así los intentos de componer su código existente con código nuevo, o aislar y separar la funcionalidad de cualquier parte de su código. En otras palabras, los efectos secundarios son como el pegamento Rigor Mortis que derrama todo y hace que sea un spaghetti monolítico impenetrable. Intente sacar un fideo, sin causar una cascada de perturbaciones en la mayoría de los otros fideos.

Cuestiones relacionadas