Es una buena idea mantener el cálculo de valores (expresiones) separado de la ejecución de acciones (declaraciones). Queremos un control preciso sobre dónde y cuándo se tomarán acciones (como mostrar mensajes), pero al calcular los valores, preferimos trabajar a un nivel más abstracto y no tener que preocuparnos por cómo se calculan esos valores.
Una función que solo calcula un valor de retorno, usando solo los argumentos que se dan, se llama pura .
Una "función" que realiza una acción es en realidad un procedimiento , que tiene un efecto .
Todos los efectos causados durante el cálculo de un valor se denominan efectos secundarios , y es mejor evitarlos cuando sea posible ("¡Solo necesitaba esa cadena, no sabía que dañaría la base de datos!").
Para minimizar la posibilidad de efectos secundarios, debemos evitar enviar demasiados datos a nuestros procedimientos, o poner algún cálculo en ellos; Si es necesario realizar algún cálculo de antemano, generalmente es mejor hacerlo por separado en una función pura, luego pasar solo el resultado requerido al procedimiento. Esto mantiene el propósito del procedimiento claro y reduce la posibilidad de que sea reutilizado más tarde como parte de un cálculo (la función pura se puede reutilizar en su lugar).
Por la misma razón, debemos evitar procesar los resultados dentro de un procedimiento. Es mejor devolver el resultado (si lo hay) a nuestra acción y realizar cualquier procesamiento posterior con funciones puras.
Si seguimos estas reglas, podríamos terminar con un procedimiento como sayHello, que no necesita ningún dato y no tiene un resultado. Por lo tanto, la mejor interfaz es no tener argumentos y no devolver un valor. Esto es preferible a, por ejemplo, llamar a "console.log" en medio de algún cálculo.
Para reducir la necesidad de efectos durante el cálculo, podemos tener cálculos que devuelvan procedimientos ; p.ej. Si necesitamos decidir qué acción tomar, podemos tener una función pura, elegir un procedimiento y devolverlo, en lugar de ejecutarlo directamente.
Del mismo modo, para reducir la necesidad de cálculo durante los procedimientos, podemos hacer que los procedimientos tomen otros procedimientos como parámetros (posiblemente el resultado de una función); p.ej. tomando una serie de procedimientos y ejecutándose uno tras otro.