Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > it.comp.lang.javascript > #8292

Re: programmazione funzionale

Path csiph.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail
From Alessandro Pellizzari <shuriken@amiran.it>
Newsgroups it.comp.lang.javascript
Subject Re: programmazione funzionale
Date Sun, 6 Jan 2019 08:42:43 +0000
Lines 63
Message-ID <g9dtc4Fhg3qU1@mid.individual.net> (permalink)
References <q0rg98$rp7$1@gioia.aioe.org>
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 <q0rg98$rp7$1@gioia.aioe.org>
Content-Language en-GB
Xref csiph.com it.comp.lang.javascript:8292

Show key headers only | View raw


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.

Back to it.comp.lang.javascript | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

programmazione funzionale son <son@mailnesia.com> - 2019-01-06 00:57 +0100
  Re: programmazione funzionale Alessandro Pellizzari <shuriken@amiran.it> - 2019-01-06 08:42 +0000
    Re: programmazione funzionale son <son@mailnesia.com> - 2019-01-06 10:48 +0100
      Re: programmazione funzionale Alessandro Pellizzari <shuriken@amiran.it> - 2019-01-06 10:36 +0000

csiph-web