ventajas paginas español ejemplos ecmascript desventajas descargar definicion caracteristicas javascript functional-programming node.js serverside-javascript underscore.js

paginas - javascript español



¿Cómo se presenta una aplicación de JavaScript funcional basada en programación? (4)

Así que 2 cosas para señalar,

  1. En su primer ejemplo, su variable no se filtraría en el área global y es la forma en que debe hacerse. Intente nunca usar variables sin declararlas, es decir, prueba = ''datos'' causaría que los datos se filtren en el área global.

  2. Tu segundo ejemplo también es correcto, bar1 y bar2 solo se declararán en el objeto Foo.

Lo que debe tener en cuenta es tratar de no abusar del uso de prototipos, ya que se aplica a cada objeto que crea, esto podría requerir un gran uso de memoria dependiendo de la complejidad de sus objetos.

Si está buscando un marco de desarrollo de aplicaciones, eche un vistazo a ExtJs . Personalmente, creo que encajaría perfectamente en el modelo contra el que intenta desarrollarse. Solo tenga en cuenta cómo funciona su modelo de licencia antes de invertir fuertemente en él.

He estado trabajando con node.js por un tiempo en una aplicación de chat (lo sé, muy original, pero pensé que sería un buen proyecto de aprendizaje). Underscore.js proporciona una gran cantidad de conceptos de programación funcional que parecen interesantes, así que me gustaría entender cómo se configuraría un programa funcional en JavaScript.

Desde mi entendimiento de la programación funcional (que puede estar equivocada), la idea general es evitar los efectos secundarios, que básicamente tienen una función que actualiza otra variable fuera de la función, por lo que algo así como

var external; function foo() { external = ''bar''; } foo();

Estaría creando un efecto secundario, ¿correcto? Entonces, como regla general, usted quiere evitar variables perturbadoras en el ámbito global.

Ok, entonces, ¿cómo funciona eso cuando estás tratando con objetos y qué no? Por ejemplo, muchas veces, tendré un constructor y un método init que inicializa el objeto, así:

var Foo = function(initVars) { this.init(initVars); } Foo.prototype.init = function(initVars) { this.bar1 = initVars[''bar1'']; this.bar2 = initVars[''bar2'']; //.... } var myFoo = new Foo({''bar1'': ''1'', ''bar2'': ''2''});

Entonces, mi método de inicio está causando intencionalmente efectos secundarios, pero ¿cuál sería una forma funcional de manejar el mismo tipo de situación?

Además, si alguien pudiera indicarme un código fuente de Python o JavaScript de un programa que intenta ser lo más funcional posible, eso también sería muy apreciado. Siento que estoy cerca de "conseguirlo", pero simplemente no estoy allí. Principalmente estoy interesado en cómo funciona la programación funcional con el concepto tradicional de clases de POO (o lo elimina por algo diferente si ese es el caso).


Creo que Underscore.js debe ser adecuado para lo que necesita: proporciona las funciones de orden superior más importantes para la programación funcional y no tiene funciones del lado del cliente para la manipulación de DOM que usted no No es necesario para el lado del servidor. Aunque no tengo experiencia con eso.

Como una nota al margen: la característica principal de IMHO de la programación funcional es la transparencia referencial de una función - el resultado de la función depende solo de sus parámetros - la función no depende de los cambios en otros objetos y no introduce ningún cambio excepto su valor de resultado. Facilita el razonamiento sobre la corrección del programa y es muy valioso para la implementación de subprocesos múltiples predecibles (si es relevante). Aunque JavaScript no es el lenguaje de apuestas para FP, espero que el uso de estructuras de datos inmutables sea muy costoso en términos de rendimiento.


Deberías leer esta pregunta:

Javascript como lenguaje funcional

Hay muchos enlaces útiles, incluyendo:

Ahora, para mi opinión. Mucha gente entiende mal el JavaScript , posiblemente porque su sintaxis se parece a la mayoría de los lenguajes de programación (donde Lisp / Haskell / OCaml se ven completamente diferentes). JavaScript no está orientado a objetos, en realidad es un lenguaje basado en prototipos . No tiene clases ni herencia clásica, por lo que no debería compararse con Java o C ++.

JavaScript puede ser mejor en comparación con un Lisp; Cuenta con cierres y funciones de primera clase. Usándolos puede crear otras técnicas de programación funcional, como aplicación parcial (currying).

Tomemos un ejemplo (usando sys.puts de node.js):

var external; function foo() { external = Math.random() * 1000; } foo(); sys.puts(external);

Para deshacerse de los efectos secundarios globales, podemos envolverlo en un cierre:

(function() { var external; function foo() { external = Math.random() * 1000; } foo(); sys.puts(external); })();

Tenga en cuenta que no podemos hacer nada con external o fuera del alcance. Están completamente envueltos en su propio cierre, intocable.

Ahora, para deshacerse del efecto secundario external :

(function() { function foo() { return Math.random() * 1000; } sys.puts(foo()); })();

Al final, el ejemplo no es puramente funcional porque no puede ser. Utilizar un número aleatorio de lecturas del estado global (para obtener una semilla) e imprimir en la consola es un efecto secundario.

También quiero señalar que mezclar programación funcional con objetos es perfectamente correcto. Toma esto por ejemplo:

var Square = function(x, y, w, h) { this.x = x; this.y = y; this.w = w; this.h = h; }; function getArea(square) { return square.w * square.h; } function sum(values) { var total = 0; values.forEach(function(value) { total += value; }); return total; } sys.puts(sum([new Square(0, 0, 10, 10), new Square(5, 2, 30, 50), new Square(100, 40, 20, 19)].map(function(square) { return getArea(square); })));

Como puede ver, el uso de objetos en un lenguaje funcional puede estar bien. Algunos Lisps incluso tienen cosas llamadas listas de propiedades que se pueden considerar como objetos.

El verdadero truco para usar objetos en un estilo funcional es asegurarse de que no confía en sus efectos secundarios, sino que los trata como si fueran inmutables. Una forma fácil es cuando quiera cambiar una propiedad, simplemente cree un nuevo objeto con los nuevos detalles y pase esa en su lugar (este es el enfoque que se usa a menudo en Clojure y Haskell).

Creo firmemente que los aspectos funcionales pueden ser muy útiles en JavaScript, pero en última instancia, debe usar lo que hace que el código sea más legible y lo que funcione para usted.


Tienes que entender que la programación funcional y la programación orientada a objetos son algo antitéticas entre sí. No es posible ser puramente funcional y puramente orientado a objetos.

La programación funcional tiene que ver con los cálculos sin estado. La programación orientada a objetos tiene que ver con las transiciones de estado. (Parafraseando this . Ojalá no tan mal)

JavaScript está más orientado a objetos que funcional. Lo que significa que si desea programar en un estilo puramente funcional, tiene que renunciar a grandes partes del lenguaje. Específicamente todas las piezas orientadas al objeto.

Si está dispuesto a ser más pragmático al respecto, existen algunas inspiraciones del mundo puramente funcional que podría usar.

Intento cumplir con las siguientes reglas:

Las funciones que realizan cálculos no deben alterar el estado. Y las funciones que alteran el estado no deben realizar cálculos. Además, las funciones que alteran el estado deberían alterar el menor estado posible. El objetivo es tener muchas funciones pequeñas que solo hacen una cosa. Luego, si necesita hacer algo grande, componga un montón de pequeñas funciones para hacer lo que necesita.

Hay una serie de beneficios que se pueden obtener al seguir estas reglas:

  1. Facilidad de reutilización. Cuanto más larga y compleja es una función, más especializada también es, y por lo tanto, menos probable es que pueda reutilizarse. La implicación inversa es que las funciones más cortas tienden a ser más genéricas y, por lo tanto, más fáciles de reutilizar.

  2. Fiabilidad del código. Es más fácil razonar sobre la corrección del código si es menos complejo.

  3. Es más fácil probar funciones cuando hacen una sola cosa. De esa manera hay menos casos especiales para probar.

Actualizar:

Sugerencia incorporada del comentario.

Actualización 2:

Añadido algunos enlaces útiles.