Path: csiph.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Alessandro Pellizzari Newsgroups: it.comp.lang.javascript Subject: Re: programmazione funzionale Date: Sun, 6 Jan 2019 08:42:43 +0000 Lines: 63 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: individual.net 3tbkCVlvI3kjeO61IvN1twhdRcK3mPUa4Pk0vTllm9yMBJFcY= Cancel-Lock: sha1:fgem5Evh1+fWZGUGuhYppQr/DXk= User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1 In-Reply-To: Content-Language: en-GB Xref: csiph.com it.comp.lang.javascript:8292 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.