On 05/01/2019 23:57, son wrote:
> Ma cosa si intende per changing-state and mutable data che andrebbero
> evitati come la peste?
Significa che quando hai una variabile con un certo valore, non dovresti
più cambiarlo. Di fatto programmi solo con costanti.
Non sempre è fattibile, o efficiente, ma aiuta a evitare parecchi
problemi, soprattutto quando fai programmazione concorrente (multithread
o asincrona).
Se usi ES6 e transpili, puoi usare `const` al posto di `var` o `let`,
anche se non è proprio costante del tutto. :D
Per esempio, diciamo che hai un array:
const a = [1, 2]
Se devi aggiungere un terzo elemento, non lo aggiungi all'array con
push, ma copi tutto l'array in un nuovo array e aggiungi il terzo
elemento alla fine:
const b = [...a, 3]
In questo modo, se stai usando a in una callback che verrà eseguita alla
fine di una promise, per esempio, sei sicuro che conterrà sempre e solo
2 valori (1 e 2) indipendentemente da quanto tempo dopo la callback
viene chiamata.
È un concetto fondamentale in FP perché, assieme alle funzioni pure,
permette di parallelizzare qualsiasi cosa.
Per esempio:
const a = ['http://...', 'https://...', ...] // (1000 URL)
const options = Object.freeze({
cache: 'no-cache',
headers: {'Content-type':'application/json'},
})
const res = a.map(url => fetch(url, options))
Stai potenzialmente lanciando 1000 thread (o meglio: funzioni
asincrone), ma non sai quando verranno lanciate, o quando finiranno.
Se qualcosa modifica la variabile options mentre il motore sta ancora
lanciando queste fetch, potresti trovarti una parte (indeterminata)
delle funzioni che passano valori sbagliati.
Rendendo options immutabile (non basta const, per questo uso anche
Object.freeze) garantisci che non possa succedere.
Una cosa che ancora manca nella "cultura" dello sviluppatore JS medio è
il concetto di Monad, anche se una Promise in realtà lo è (più o meno :D).
È un concetto utile quando hai side-effects, e infatti fetch lo usa
appunto per gestire il side-effect di connettersi a un canale di I/O,
così come le funzioni di accesso asincrono ai file.
Spero di non aver creato più confusione di prima. :D
Bye.