È una buona idea mantenere il calcolo dei valori (espressioni) separato dall'esecuzione delle azioni (istruzioni). Vogliamo un controllo preciso su dove e quando verranno intraprese le azioni (come la visualizzazione di messaggi), ma quando calcoliamo i valori preferiremmo lavorare a un livello più astratto e non dovremmo preoccuparci di come vengono calcolati quei valori.
Una funzione che calcola solo un valore di ritorno, usando solo gli argomenti forniti, è chiamata pura .
Una "funzione" che esegue un'azione è in realtà una procedura , che ha un effetto .
Tutti gli effetti causati durante il calcolo di un valore sono chiamati effetti collaterali , ed è meglio evitarli ove possibile ("Avevo solo bisogno di quella stringa, non sapevo che avrebbe martellato il database!").
Per ridurre al minimo la possibilità di effetti collaterali, dovremmo evitare di inviare troppi dati alle nostre procedure o di inserire alcun calcolo in esse; se è necessario eseguire preventivamente alcuni calcoli, di solito è meglio farlo separatamente in una funzione pura, quindi passare solo il risultato richiesto alla procedura. Ciò mantiene chiaro lo scopo della procedura e riduce la possibilità che venga riutilizzato in seguito come parte di un calcolo (la funzione pura può invece essere riutilizzata).
Per lo stesso motivo, dovremmo evitare di elaborare i risultati all'interno di una procedura. È meglio restituire il risultato (se presente) alla nostra azione ed eseguire qualsiasi elaborazione successiva con funzioni pure.
Se seguiamo queste regole, potremmo finire con una procedura simile sayHello
, che non ha bisogno di dati e non ha risultati. Quindi la migliore interfaccia per esso è di non avere argomenti e non restituire un valore. È preferibile, ad esempio, chiamare "console.log" nel mezzo di alcuni calcoli.
Per ridurre la necessità di effetti durante il calcolo, possiamo avere calcoli che restituiscono procedure ; per esempio. se dobbiamo decidere un'azione da intraprendere, possiamo avere una pura funzione scegliere una procedura e restituirla, anziché eseguirla direttamente.
Allo stesso modo, per ridurre la necessità di calcoli durante le procedure, possiamo fare in modo che le procedure prendano altre procedure come parametri (possibilmente il risultato di una funzione); per esempio. prendendo una serie di procedure ed eseguendo una dopo l'altra.