Me gustaría comenzar a jugar con ClojureScript, pero estoy desconcertado sobre algunos puntos. Mi problema es cuál es una buena manera de lidiar con los cambios de estado derivados de la interacción del usuario, cuando intenta trabajar funcionalmente.
Déjame darte un par de ejemplos. Tengo en mente las aplicaciones que se ejecutan en el navegador, pero creo que el problema es más general. Por supuesto, algo va a cambiar, el DOM al menos. Pero me gustaría saber cómo organizar el resto del código para trabajar con estructuras de datos inmutables.
1) Di que quiero adjuntar algunos eventos a algún objeto DOM. Esto no es difícil de hacer de una manera principalmente funcional: cuando crea el nodo, lo adjunta un mapa hash con los diversos controladores de eventos. Pero considere el caso en el que está utilizando la delegación de eventos. Luego, cuando cree un nuevo nodo, puede adjuntar un controlador de eventos a algún nodo principal que probablemente ya exista. Por lo tanto, tendría que cambiar el hash asociado al nodo ya existente.
2) Digamos que estoy diseñando un módulo de autocompletar para un campo de entrada. Cada vez que el usuario presiona una tecla, puedo hacer una llamada a un servidor para obtener las sugerencias. Esto es facil. Pero ahora supongamos que quiero optimizarlo un poco. Si sé que todos los resultados coinciden, foo
no tiene sentido volver a preguntar por todos los resultados foobar
; Solo puedo filtrar el primero. Entonces necesito construir algún tipo de caché. Este caché se actualizará cada vez que el usuario inserte una nueva palabra que no sea un superconjunto de las palabras ingresadas previamente. Nuevamente: ¿cómo modelo el caché? La forma más razonable parece ser un mapa hash que asigna palabras a resultados, pero debe ser mutable.
¿Puede sugerir algunos patrones que faciliten la incorporación de cambios debido a la interacción del usuario en un diseño funcional?
fuente
Respuestas:
Como se menciona en los comentarios, debe buscar "Programación funcional reactiva" y también debe leer algunas de las publicaciones en http://prog21.dadgum.com/archives.html . Más específicamente, probablemente debería leer " No se enamore de su tecnología ", " Escriba el código como acaba de aprender a programar ", " La programación funcional no funciona (y qué hacer al respecto) ", y tal vez un algunos otros
Evitar completamente la mutabilidad y los efectos secundarios es prácticamente imposible. Incluso los programadores de Haskell de vez en cuando harán uso del
unsafePerformIO
paradigma puramente funcional, libre de efectos secundarios y de tipo estático para hacer ciertas cosas. Si se embarca en este proyecto como un ejercicio puramente académico, siga adelante y evite la mutabilidad y los efectos secundarios tanto como sea posible, pero si está tratando de construir un producto utilizable en una fecha límite, entonces ningún patrón lo salvará.fuente