Lavorare con funzioni pure può essere molto meno stressante, poiché puoi testarle facilmente e ragionarci sopra con maggiore sicurezza.
Le funzioni pure sono funzioni che non producono effetti collaterali e, se chiamate con gli stessi parametri di input, restituiranno sempre lo stesso output.
Puoi utilizzare le funzioni pure per assicurarti che il tuo codice sia pulito, gestibile e testabile. Queste funzioni sono ideali per queste attività perché sono prevedibili e non modificano gli stati esterni.
Sono anche più facili da eseguire il debug, rendendoli utili nello sviluppo di sistemi software complessi. Qui esplorerai le funzioni pure in JavaScript, le loro caratteristiche e i loro vantaggi.
Caratteristiche di una funzione pura
Per una funzione per essere “puro”, deve soddisfare alcuni requisiti.
Valore di ritorno costante
Una funzione pura dovrebbe sempre restituire lo stesso valore dato lo stesso input, indipendentemente dal numero di volte che viene chiamata.
Ad esempio, considera la funzione seguente:
funzionemoltiplicare(a, b) {
ritorno un * b;
}
IL moltiplicare La funzione nell'esempio precedente restituirà sempre il prodotto dei suoi due argomenti. Dato lo stesso set di argomenti, ha un valore di ritorno costante.
Chiamare questa funzione più volte con gli stessi argomenti produrrà lo stesso output ogni volta. Per esempio:
moltiplicare(2, 3); // restituisce 6
moltiplicare(2, 3); // restituisce 6
moltiplicare(2, 3); // restituisce 6
In alternativa, considera l'esempio seguente:
funzionemoltiplicareNumeroCasuale(num) {
ritorno numero * Matematica.pavimento(Matematica.casuale() * 10);
}
moltiplicaNumeroCasuale(5); // Risultati imprevedibili
moltiplicaNumeroCasuale(5); // Risultati imprevedibili
moltiplicaNumeroCasuale(5); // Risultati imprevedibili
IL moltiplicareNumeroCasuale la funzione sopra restituirà risultati diversi ogni volta che la chiami, rendendola impura. I risultati di questa funzione sono imprevedibili, quindi testare i componenti che si basano su di essa è difficile.
Nessun effetto collaterale
Una funzione pura non deve produrre alcun effetto collaterale. Un effetto collaterale si riferisce a qualsiasi modifica dello stato o del comportamento al di fuori dell'ambito della funzione, come la modifica delle variabili globali, l'output della console, le richieste di rete o la manipolazione del DOM.
Quando una funzione pura ha un effetto collaterale, non è più pura perché influenza lo stato esterno e viola il principio di non avere effetti collaterali osservabili. Pertanto, le funzioni pure evitano effetti collaterali per garantire che non alterino lo stato del programma.
Ad esempio, considera l'esempio seguente:
permettere contare = 0;
funzioneincremento() {
conta++;
consolare.log (conteggio);
}
incremento(); // Registri 1
incremento(); // Registri 2
incremento(); // Registri 3
IL incremento funzione in questo esempio ha l'effetto collaterale di modificare il file contare variabile al di fuori del suo ambito. Registra anche alla console.
Questa funzione non è pura perché ha un effetto collaterale, che può rendere più difficile prevederne l'output e testarlo isolatamente. Per renderlo puro, puoi modificarlo per includere il file contare variabile come argomento e restituire il valore incrementato senza modificare alcuno stato esterno.
Così:
funzioneincremento(contare) {
ritorno contare + 1;
}
incremento(1); // restituisce 2
incremento(1); // restituisce 2
incremento(1); // restituisce 2
La versione del incremento La funzione nell'esempio sopra non ha effetti collaterali in quanto non modifica alcuna variabile esterna né registra alcun valore. Inoltre, non importa quante volte lo chiami, restituisce lo stesso valore per lo stesso input. Pertanto, è una funzione pura.
Altre caratteristiche
Oltre ad avere un valore di ritorno costante e non produrre alcun effetto collaterale, dovresti rispettare le seguenti regole quando lo sei creazione di una funzione JavaScript che vuoi essere puro:
- La tua funzione non deve modificare nessuno dei suoi argomenti. Invece, se un'operazione richiede una mutazione, crea una copia dell'argomento e muta la copia.
- La tua funzione deve sempre avere un valore di ritorno. Se la tua funzione non ha un valore di ritorno o effetti collaterali, non può fare nulla!
- La tua funzione non deve dipendere da alcuno stato esterno.
Vantaggi delle funzioni pure
Le funzioni pure hanno alcuni vantaggi rispetto alle funzioni impure, alcune delle quali includono quanto segue.
Testabilità
Le funzioni pure sono facili da testare poiché il loro comportamento di input/output è ben definito. Inoltre, le funzioni pure non dipendono dallo stato esterno o dagli effetti collaterali. Pertanto, puoi testarli in modo isolato senza preoccuparti di eventuali dipendenze o interazioni con altre parti del programma.
Al contrario, testare funzioni impure che dipendono dallo stato esterno o producono effetti collaterali può essere più impegnativo perché il loro comportamento può dipendere dallo stato del programma o da altri fattori esterni. Ciò può rendere più difficile la creazione di casi di test completi e garantire che la funzione si comporti correttamente in tutti gli scenari.
Memoizzazione
Poiché le funzioni pure producono sempre lo stesso output per lo stesso input e non producono effetti collaterali, puoi memorizzarle facilmente.
Facendo affidamento su queste proprietà e utilizzando la memoizzazione, è possibile memorizzare nella cache il risultato di una chiamata di funzione pura per un input specifico. La tua funzione può quindi restituire il risultato memorizzato nella cache la prossima volta che viene chiamato con lo stesso input.
Memoizzare funzioni pure può migliorare le prestazioni di un programma, specialmente per calcoli costosi che trattano ripetutamente lo stesso input, senza preoccuparsi di interferenze con lo stato del programma.
Al contrario, le funzioni impure possono produrre risultati diversi per lo stesso input, a seconda dello stato del programma o di fattori esterni. Ciò li rende difficili da memorizzare perché il risultato memorizzato nella cache potrebbe non essere più valido se le dipendenze della funzione o lo stato esterno cambiano tra le chiamate.
Concorrenza
Poiché le funzioni pure non modificano alcuno stato esterno né producono alcun effetto collaterale, sono thread-safe. Puoi eseguirli contemporaneamente senza preoccuparti delle condizioni di gara o dei problemi di sincronizzazione.
Al contrario, le funzioni impure possono essere difficili da eseguire contemporaneamente perché possono interferire tra loro o produrre comportamenti imprevisti se eseguite in parallelo. Ad esempio, se due thread accedono e modificano la stessa variabile globale, possono sovrascrivere le modifiche reciproche o produrre risultati incoerenti.
Funzioni pure vs. Funzioni impure
Puoi scrivere programmi usando una combinazione di funzioni pure e impure, poiché ogni tipo ha i suoi usi.
Le funzioni pure sono facili da ottimizzare, testare e parallelizzare, rendendole adatte a casi d'uso come la programmazione funzionale, la memorizzazione nella cache, il test, la programmazione parallela e le attività di elaborazione dei dati.
Tuttavia, le funzioni impure pongono sfide nei test e nella concorrenza, ma sono utili quando si lavora con strutture di dati mutabili o si interagisce con sistemi e risorse esterni.