Una visione contraria dell'immutabilità
TL / DR: l'immutabilità è più una tendenza della moda che una necessità in JavaScript. Se si utilizza React, fornisce una soluzione accurata ad alcune scelte di progettazione confuse nella gestione dello stato. Tuttavia, nella maggior parte delle altre situazioni, non aggiungerà abbastanza valore rispetto alla complessità che introduce, servendo più per riempire un curriculum che per soddisfare un'esigenza effettiva del cliente.
Risposta lunga: leggi sotto.
Perché l'immutabilità è così importante (o necessaria) in JavaScript?
Bene, sono contento che tu l'abbia chiesto!
Qualche tempo fa un ragazzo di grande talento di nome Dan Abramov ha scritto una libreria di gestione dello stato javascript chiamata Redux che utilizza funzioni pure e immutabilità. Ha anche realizzato alcuni video davvero interessanti che hanno reso l'idea (e la vendita) davvero facile da capire.
Il tempismo è stato perfetto. La novità di Angular stava svanendo e il mondo JavaScript era pronto a fissarsi sull'ultima cosa che aveva il giusto grado di cool, e questa libreria non era solo innovativa, ma si inseriva perfettamente con React che veniva commercializzato da un'altra centrale elettrica della Silicon Valley .
Per quanto triste, le mode dominano nel mondo di JavaScript. Ora Abramov viene accolto come un semidio e tutti noi semplici mortali dobbiamo sottometterci al Dao dell'Immutabilità ... Sia che abbia senso o no.
Cosa c'è di sbagliato negli oggetti mutanti?
Niente!
In effetti i programmatori hanno mutato oggetti per sempre ... purché ci siano stati oggetti da mutare. Più di 50 anni di sviluppo di applicazioni in altre parole.
E perché complicare le cose? Quando hai un oggetto cat
e muore, hai davvero bisogno di un secondo cat
per rintracciare il cambiamento? La maggior parte delle persone direbbe cat.isDead = true
e finirà.
(Oggetti mutanti) non rende le cose semplici?
SÌ! .. Certo che lo fa!
Specialmente in JavaScript, che in pratica è più utile per il rendering di una vista di alcuni stati mantenuta altrove (come in un database).
Cosa succede se ho un nuovo oggetto Notizie che deve essere aggiornato? ... Come posso ottenere in questo caso? Eliminare il negozio e ricrearlo? L'aggiunta di un oggetto all'array non è un'operazione meno costosa?
Bene, puoi seguire l'approccio tradizionale e aggiornare l' News
oggetto, quindi la tua rappresentazione in memoria di quell'oggetto cambia (e la vista mostrata all'utente, o almeno così si spera) ...
O in alternativa ...
Puoi provare l'approccio sexy FP / Immutabilità e aggiungere le tue modifiche News
all'oggetto a un array che tiene traccia di ogni cambiamento storico in modo da poter iterare attraverso l'array e capire quale dovrebbe essere la rappresentazione dello stato corretta (eh!).
Sto cercando di imparare cosa c'è proprio qui. Per favore, illuminami :)
La moda va e viene amico. Esistono molti modi per scuoiare un gatto.
Mi dispiace che tu debba sopportare la confusione di una serie in costante cambiamento di paradigmi di programmazione. Ma ehi, BENVENUTO NEL CLUB !!
Ora un paio di punti importanti da ricordare per quanto riguarda l'Immutabilità, e ti verranno lanciati contro con l'intensità febbrile che solo l'ingenuità può raccogliere.
1) L'immutabilità è eccezionale per evitare le condizioni di gara in ambienti multi-thread .
Gli ambienti multi-thread (come C ++, Java e C #) sono colpevoli della pratica di bloccare gli oggetti quando più di un thread vuole cambiarli. Ciò è negativo per le prestazioni, ma migliore dell'alternativa alla corruzione dei dati. Eppure non è buono come rendere tutto immutabile (lode di Haskell!).
MA AHIMÈ! In JavaScript operi sempre su un singolo thread . Perfino i web worker (ognuno funziona all'interno di un contesto separato ). Quindi, dal momento che non è possibile avere una race condition legata al thread all'interno del proprio contesto di esecuzione (tutte quelle adorabili variabili globali e chiusure), il punto principale a favore dell'Immutabilità va fuori dalla finestra.
(Detto questo, non v'è un vantaggio di utilizzare funzioni pure nei lavoratori web, che è che non avrete aspettative su giocherellare con oggetti sul thread principale.)
2) L'immutabilità può (in qualche modo) evitare le condizioni di gara nello stato della tua app.
Ed ecco il vero punto cruciale della questione, la maggior parte degli sviluppatori (React) ti dirà che Immutabilità e FP possono in qualche modo funzionare questa magia che consente allo stato della tua applicazione di diventare prevedibile.
Ovviamente questo non significa che puoi evitare le condizioni di competizione nel database , per risolverlo dovresti coordinare tutti gli utenti in tutti i browser e per questo avresti bisogno di una tecnologia push back-end come WebSocket ( ulteriori informazioni qui di seguito) che trasmetterà le modifiche a tutti coloro che eseguono l'app.
Né significa che c'è qualche problema inerente a JavaScript in cui lo stato della tua applicazione ha bisogno di immutabilità per diventare prevedibile, qualsiasi sviluppatore che ha codificato applicazioni front-end prima che React te lo dicesse.
Questa affermazione piuttosto confusa significa semplicemente che con React il tuo stato di applicazione diventerà più incline alle condizioni di gara , ma quell'immutabilità ti consente di eliminare quel dolore. Perché? Perché React è speciale .. è stato progettato come una libreria di rendering altamente ottimizzata con una gestione coerente dello stato che occupa il secondo posto, e quindi lo stato dei componenti è gestito tramite una catena di eventi asincrona ( nota anche come "associazione dati a una via") che non hai controllo e fai affidamento sul fatto che ti ricordi di non mutare direttamente lo stato ...
Dato questo contesto, è facile vedere come la necessità di immutabilità abbia poco a che fare con JavaScript e molto a che fare con le condizioni di gara in React: se hai un sacco di cambiamenti interdipendenti nella tua applicazione e nessun modo semplice per capire cosa il tuo stato è attualmente, ti confonderai , e quindi ha perfettamente senso usare l'immutabilità per tracciare ogni cambiamento storico .
3) Le condizioni di gara sono categoricamente cattive.
Bene, potrebbero esserlo se stai usando React. Ma sono rari se scegli un quadro diverso.
Inoltre, normalmente hai problemi molto più grandi da affrontare ... Problemi come l'inferno delle dipendenze. Come una base di codice gonfia. Come se il tuo CSS non venisse caricato. Come un processo di compilazione lento o essere bloccato su un back-end monolitico che rende quasi impossibile l'iterazione. Come gli sviluppatori inesperti che non capiscono cosa sta succedendo e fanno un casino di cose.
Sai. La realtà. Ma hey, a chi importa?
4) L'immutabilità utilizza i tipi di riferimento per ridurre l'impatto delle prestazioni del tracciamento di ogni cambiamento di stato.
Perché seriamente, se hai intenzione di copiare cose ogni volta che il tuo stato cambia, è meglio assicurarsi di essere furbo a riguardo.
5) L'immutabilità ti consente di ANNULLARE le cose .
Perché ehm ... questa è la caratteristica numero uno che il tuo project manager chiederà, giusto?
6) Lo stato immutabile ha un grande potenziale in combinazione con WebSocket
Ultimo ma non meno importante, l'accumulo di delta di stato costituisce un caso piuttosto convincente in combinazione con WebSocket, che consente un facile consumo di stato come flusso di eventi immutabili ...
Una volta che il penny scende su questo concetto (dichiarare che è un flusso di eventi - piuttosto che un insieme rozzo di documenti che rappresentano l'ultima visione), il mondo immutabile diventa un luogo magico in cui abitare. Una terra di meraviglia e possibilità che provengono da eventi che trascendono il tempo stesso . E quando fatto bene questo può sicuramente fare in tempo reale applicazioni easi er da realizzare, basta trasmettere il flusso degli eventi a tutti gli interessati in modo che possano costruire la loro propria rappresentazione del presente e scrivere di nuovo i propri cambiamenti nel flusso comune.
Ma ad un certo punto ti svegli e ti rendi conto che tutta quella meraviglia e magia non vengono gratis. A differenza dei tuoi colleghi desiderosi, i tuoi stakeholder (sì, le persone che ti pagano) si preoccupano poco della filosofia o della moda e molto dei soldi che pagano per costruire un prodotto che possono vendere. E la linea di fondo è che è più difficile scrivere codice immutabile e più facile romperlo, inoltre ha poco senso avere un front-end immutabile se non si ha un back-end per supportarlo. Quando (e se!) Alla fine convinci i tuoi stakeholder che dovresti pubblicare e consumare eventi tramite una tecnologia push come WebSocket, scopri che dolore è scalare nella produzione .
Ora, per un consiglio, dovresti scegliere di accettarlo.
Una scelta per scrivere JavaScript usando FP / Immutability è anche una scelta per rendere la base di codice della tua applicazione più grande, più complessa e più difficile da gestire. Direi fortemente di limitare questo approccio ai tuoi riduttori Redux, a meno che tu non sappia cosa stai facendo ... E SE hai intenzione di andare avanti e usare l'immutabilità a prescindere, quindi applicare lo stato immutabile a tutto il tuo stack di applicazioni , e non solo al lato client, poiché in caso contrario manchi il suo valore reale.
Ora, se sei abbastanza fortunato da poter fare delle scelte nel tuo lavoro, allora prova a usare la tua saggezza (o no) e fai ciò che è giusto per la persona che ti sta pagando . Puoi basarlo sulla tua esperienza, sul tuo intestino o su ciò che accade intorno a te (è vero che se tutti usano React / Redux, allora c'è un valido argomento secondo cui sarà più facile trovare una risorsa per continuare il tuo lavoro) .. In alternativa, puoi provare gli approcci Riprendi Driven Development o Hype Driven Development . Potrebbero essere più il tuo genere di cose.
In breve, la cosa da dire per l'immutabilità è che ti renderà di moda con i tuoi coetanei, almeno fino a quando non arriva la prossima mania, a quel punto sarai felice di andare avanti.
Ora, dopo questa sessione di autoterapia, vorrei sottolineare che l'ho aggiunto come articolo nel mio blog => Immutabilità in JavaScript: una visione contraria . Sentiti libero di rispondere lì se hai sentimenti forti e ti piacerebbe toglierti anche il petto;).