Shared State significa que diferentes métodos trabajan a partir de una misma variable. y, así como aprendimos en clases anteriores, cuando modificamos variables con el mismo objeto de referencia podemos encontrarnos con algunos problemas y obtener resultados inesperados a pesar de ejecutar el mismo código y recibir los mismos parámetros:
// Intento #1const a ={value:2}constaddOne=()=> a.value+=1consttimesTwo=()=> a.value*=2addOne()timesTwo()console.log(a.value)// 6// Sin embargo, si ejecutamos las mismas funciones en orden invertido// obtenemos resultados diferentestimesTwo()addOne()console.log(a.value)// 5 !??
Para resolver este tipo de problemas debemos utilizar la programación funcional, en vez de modificar la variable original, nuestras funciones deben copiar y modificar sus argumentos:
const b ={value:2}constaddOne=x=>Object.assign({}, x,{value: x.value+1})consttimesTwo=x=>Object.assign({}, x,{value: x.value*2})addOne(b)timesTwo(b)// El resultado siempre es el mismo a pesar de// ejecutar las funciones en orden diferentetimesTwo(b)addOne(b)console.log(b.value)
debido a que se ejecuta promero timesTwo() va ejeceutando de adentro hacia afuera de los paréntesis
Exactamente, eso sucede debido al higher order function
Prácticamente lo que hacían las primeras funciones que creamos era mutar directamente la variable global (Podían ser accedidas gracias a su scope), de la segunda forma lo que se hizo fue simplemente hacer que esa variable no se mutara globalmente, sino que la función crea su propia variable y retorna el resultado ^^
Nota: Al igual que los objectos, los Arreglos también se pasan por referencia.
Me quedé un rato con el video pausado analizando porque estaba seguro que el resultado era 5 y no 6 :D al final si era así.
Que diferencia hay entre el Object.assign y el spread syntax(...) para crear copias de los objetos?
Si solo requieres una copia , puedes usar cualquiera, hacen lo mismo.
por qué hay funciones que si necesitan "laves después de "=>" y otras no?
Hola, depende. Las arrow functions solo necesitan llaves si vana ejecutar más de una línea de código, pero si solo van a ejecutar una sola línea de código entonces no es necesario :D
que tanto afecta el rendimiento de la app si se sobre usara el metodo de inmutabilidad?
como determinar correctamente cuando debemos hacer inmutable una variable?
Saludos. Hay un repositorio con los ejemplos de todas las clases?
Hola, Carl.
Repositorio creo que no hay pero si puedes descargar todo el proyecto.
Igualmente al final del curso yo les comparto mi repositorio.
Saludos
quiero que me ayuden a recordar algo, los objetos vacíos y arrays vacios hace referencia a una copia exacta de todos los valores que tiene un objeto y array original ?
Creo que por definición, si está vacío, no tiene valores.
🤔
Creo que la forma correcta de usar el assign en este contexto seria asi:
¿No es necesario llamar al objecto primero como referencia?
Para el ejemplo de la clase si serviría esa forma, pero si el objeto tuviera otro atributo ya no lo copiará
//The problem of shared state.//it becomes apparently pure function in impure function, because are actually mutable functions (modified the original property), for that reason in long term that kind of function are not predictable.//==================================Bad==================================const myObject ={value:2}constaddOne=()=> myObject.value+=1;consttwoTimes=()=> myObject.value*=2;// I know the value is 2, in order to obtain 3 I add one.addOne();//3// I know the value is 2, so in order to obtain 4 i multiply by 2.twoTimes();//6, i don't excepted it, and it actually add one, there is a side effectconsole.log(myObject.value);//returns: 6// I know the value is 2, so in order to obtain 4 i multiply by 2.twoTimes();//4// I know the value is 2, in order to obtain 3 I add one.addOne();//5, i don't excepted it, and it actually add one, there is a side effectconsole.log(myObject.value);//returns: 5//the problem is that its not a real control about the original value, someone can modify it and get a side effect in the code.//¿How i can prevent side effects in this case? Using copies.//==================================Good==================================const myObject2 ={value:2}constaddOne_good=(originalObj)=>Object.assign({},{value: originalObj.value+1});consttwoTimes_good=(originalObj)=>Object.assign({},{value: originalObj.value*2});// I know the value is 2, so in order to obtain 4 i multiply by 2.addOne_good(myObject2);//4// I know the value is 2, in order to obtain 3 I add one.twoTimes_good(myObject2);//3console.log(myObject2.value);//returns: 2, the original value.// I know the value is 2, i want 6let= result =twoTimes_good(addOne_good(myObject2));console.log(result.value);// 6
os datos deben ser inmutables para evitar shared state, side effects, impure functions... Todo lo que hagamos será sobre copias y no sobre los datos compartidos con más partes de la aplicación.