Una visión contraria de la inmutabilidad
TL / DR: la inmutabilidad es más una tendencia de moda que una necesidad en JavaScript. Si está utilizando React, proporciona una solución clara para algunas opciones de diseño confusas en la administración del estado. Sin embargo, en la mayoría de las otras situaciones, no agregará suficiente valor sobre la complejidad que presenta, sirviendo más para completar un currículum que para satisfacer una necesidad real del cliente.
Respuesta larga: lea a continuación.
¿Por qué la inmutabilidad es tan importante (o necesaria) en JavaScript?
¡Bien, me alegra que lo hayas preguntado!
Hace algún tiempo, un tipo muy talentoso llamado Dan Abramov escribió una biblioteca de administración de estado de JavaScript llamada Redux que usa funciones puras e inmutabilidad. También hizo algunos videos realmente geniales que hicieron que la idea fuera realmente fácil de entender (y vender).
El momento fue perfecto. La novedad de Angular se estaba desvaneciendo, y el mundo de JavaScript estaba listo para concentrarse en lo último que tenía el grado correcto de genialidad, y esta biblioteca no solo era innovadora sino que se integraba perfectamente con React, que estaba siendo promovida por otra potencia de Silicon Valley .
Triste como puede ser, las modas gobiernan en el mundo de JavaScript. Ahora Abramov está siendo aclamado como un semidiós y todos nosotros, simples mortales, tenemos que someternos al Dao de la Inmutabilidad ... Ya sea que tenga sentido o no.
¿Qué hay de malo en mutar objetos?
¡Nada!
De hecho, los programadores han estado mutando objetos durante er ... siempre que haya objetos para mutar. Más de 50 años de desarrollo de aplicaciones en otras palabras.
¿Y por qué complicar las cosas? Cuando tienes un objeto cat
y muere, ¿realmente necesitas un segundo cat
para seguir el cambio? La mayoría de la gente simplemente diría cat.isDead = true
y acabaría con eso.
¿No hace (objetos mutantes) que las cosas sean simples?
¡SI! .. ¡Claro que lo hace!
Especialmente en JavaScript, que en la práctica es más útil para representar una vista de algún estado que se mantiene en otro lugar (como en una base de datos).
¿Qué sucede si tengo un nuevo objeto de Noticias que debe actualizarse? ... ¿Cómo lo logro en este caso? ¿Eliminar la tienda y recrearla? ¿Agregar un objeto a la matriz no es una operación menos costosa?
Bueno, puedes seguir el enfoque tradicional y actualizar el News
objeto, por lo que su representación en memoria de ese objeto cambia (y la vista que se muestra al usuario, o eso es lo que uno esperaría) ...
O alternativamente...
Puede probar el enfoque atractivo de FP / Inmutabilidad y agregar sus cambios al News
objeto a una matriz que rastrea cada cambio histórico para que pueda iterar a través de la matriz y descubrir cuál debería ser la representación de estado correcta (¡uf!).
Estoy tratando de aprender lo que está aquí. Por favor, ilumíneme :)
Las modas van y vienen, amigo. Hay muchas formas de despellejar a un gato.
Lamento que tenga que soportar la confusión de un conjunto de paradigmas de programación en constante cambio. Pero bueno, BIENVENIDOS AL CLUB !!
Ahora hay un par de puntos importantes para recordar con respecto a la Inmutabilidad, y te los arrojará con la intensidad febril que solo la ingenuidad puede reunir.
1) La inmutabilidad es increíble para evitar las condiciones de carrera en entornos de subprocesos múltiples .
Los entornos de subprocesos múltiples (como C ++, Java y C #) son culpables de la práctica de bloquear objetos cuando más de un subproceso quiere cambiarlos. Esto es malo para el rendimiento, pero mejor que la alternativa de corrupción de datos. Y sin embargo, no es tan bueno como hacer que todo sea inmutable (¡Alabado sea Haskell!).
¡PERO AY! En JavaScript siempre operas en un solo hilo . Incluso los trabajadores web (cada uno se ejecuta dentro de un contexto separado ). Entonces, como no puede tener una condición de carrera relacionada con el hilo dentro de su contexto de ejecución (todas esas encantadoras variables globales y cierres), el punto principal a favor de la Inmutabilidad desaparece.
(Una vez dicho esto, no es una ventaja para el uso de funciones puras de los trabajadores web, que es que usted no tiene expectativas sobre jugueteando con objetos en el hilo principal.)
2) La inmutabilidad puede (de alguna manera) evitar las condiciones de carrera en el estado de su aplicación.
Y aquí está el quid de la cuestión, la mayoría de los desarrolladores (React) le dirán que la Inmutabilidad y FP pueden de alguna manera hacer funcionar esta magia que permite que el estado de su aplicación sea predecible.
Por supuesto, esto no significa que pueda evitar las condiciones de carrera en la base de datos , para lograrlo tendría que coordinar a todos los usuarios en todos los navegadores , y para eso necesitaría una tecnología push de back-end como WebSockets ( más sobre esto a continuación) que transmitirá los cambios a todos los que ejecuten la aplicación.
Tampoco significa que haya algún problema inherente en JavaScript en el que el estado de su aplicación necesita inmutabilidad para ser predecible, cualquier desarrollador que haya codificado aplicaciones front-end antes de React le diría esto.
Esta afirmación bastante confusa simplemente significa que con React su estado de aplicación será más propenso a las condiciones de carrera , pero que la inmutabilidad le permite eliminar ese dolor. ¿Por qué? Debido a que React es especial ... ha sido diseñado como una biblioteca de renderizado altamente optimizada con una administración de estado coherente que ocupa el segundo lugar, y por lo tanto, el estado de los componentes se administra a través de una cadena de eventos asincrónica (también conocida como "enlace de datos unidireccional") que no tiene control y confía en ti recordando no mutar el estado directamente ...
Dado este contexto, es fácil ver cómo la necesidad de inmutabilidad tiene poco que ver con JavaScript y mucho con las condiciones de carrera en React: si tiene un montón de cambios interdependientes en su aplicación y no hay una manera fácil de averiguar qué su estado se encuentra actualmente, se confundirá y, por lo tanto , tiene mucho sentido usar la inmutabilidad para rastrear cada cambio histórico .
3) Las condiciones de carrera son categóricamente malas.
Bueno, podrían ser si estás usando React. Pero son raros si elige un marco diferente.
Además, normalmente tienes problemas mucho más grandes con los que lidiar ... Problemas como el infierno de la dependencia. Como una base de código hinchada. Como si tu CSS no se cargara. Como un proceso de construcción lento o estar atascado en un back-end monolítico que hace que la iteración sea casi imposible. Al igual que los desarrolladores sin experiencia que no entienden lo que está sucediendo y hacen un desastre.
Ya sabes. Realidad. Pero oye, ¿a quién le importa eso?
4) La inmutabilidad utiliza los Tipos de referencia para reducir el impacto en el rendimiento del seguimiento de cada cambio de estado.
Porque en serio, si vas a copiar cosas cada vez que cambia tu estado, es mejor que te asegures de ser inteligente al respecto.
5) La inmutabilidad le permite deshacer cosas .
Porque er ... esta es la característica número uno que su gerente de proyecto va a pedir, ¿verdad?
6) El estado inmutable tiene un gran potencial en combinación con WebSockets
Por último, pero no menos importante, la acumulación de deltas de estado es un caso bastante convincente en combinación con WebSockets, lo que permite un consumo fácil de estado como un flujo de eventos inmutables ...
Una vez que el centavo cae sobre este concepto (el estado es un flujo de eventos , en lugar de un conjunto crudo de registros que representan la última vista), el mundo inmutable se convierte en un lugar mágico para habitar. Una tierra de maravillas y posibilidades derivadas de eventos que trasciende el tiempo mismo . Y cuando se hace bien esto definitivamente puede hacer en tiempo real aplicaciones EASI er lograr, que acaba de emitir el flujo de los acontecimientos a todos los interesados para que puedan construir su propia representación de la presente y escribir de nuevo sus propios cambios en el flujo comunal.
Pero en algún momento te despiertas y te das cuenta de que toda esa maravilla y magia no vienen gratis. A diferencia de sus entusiastas colegas, sus partes interesadas (sí, las personas que le pagan) se preocupan poco por la filosofía o la moda y mucho por el dinero que pagan para construir un producto que pueden vender. Y la conclusión es que es más difícil escribir código inmutable y más fácil de descifrar, además tiene poco sentido tener un front-end inmutable si no tiene un back-end para soportarlo. Cuando (¡y si!) Finalmente convence a sus partes interesadas de que debe publicar y consumir eventos a través de una tecnología de inserción como WebSockets, descubre lo difícil que es escalar la producción .
Ahora para algunos consejos, si decide aceptarlo.
La opción de escribir JavaScript usando FP / Inmutabilidad también es una opción para hacer que la base de código de su aplicación sea más grande, más compleja y más difícil de administrar. Yo recomendaría encarecidamente limitar este enfoque a sus reductores Redux, a menos que sepa lo que está haciendo ... Y SI va a seguir adelante y usar la inmutabilidad de todos modos, aplique el estado inmutable a toda su pila de aplicaciones , y no solo del lado del cliente, ya que de lo contrario te estás perdiendo el valor real.
Ahora, si tiene la suerte de poder tomar decisiones en su trabajo, intente usar su sabiduría (o no) y haga lo correcto por la persona que le paga . Puede basar esto en su experiencia, en su instinto o en lo que sucede a su alrededor (es cierto que si todos usan React / Redux, entonces existe un argumento válido de que será más fácil encontrar un recurso para continuar su trabajo). Alternativamente, se puede tratar ya sea Reanudar Driven Development o bombo Driven Development se acerca. Podrían ser más tu tipo de cosas.
En resumen, lo que hay que decir sobre la inmutabilidad es que te pondrá de moda con tus compañeros, al menos hasta que llegue la próxima moda, momento en el que estarás contento de seguir adelante.
Ahora, después de esta sesión de autoterapia, me gustaría señalar que he agregado esto como un artículo en mi blog => Inmutabilidad en JavaScript: una visión contraria . Siéntete libre de responder allí si tienes sentimientos fuertes que también te gustaría quitarte de encima;).