Ahora estoy leyendo "una guía en su mayoría adecuada para la programación funcional" del profesor Frisby, y me preguntaba cómo podemos hacer una búsqueda pura , y vi esta pieza de código aquí en el libro .
const pureHttpCall = memoize((url, params) => () => $.getJSON(url, params));Y dice
Lo interesante aquí es que en realidad no hacemos la llamada http; en su lugar, devolvemos una función que lo hará cuando se la llame. Esta función es pura porque siempre devolverá la misma salida dada la misma entrada: la función que hará la llamada http particular dada la url y los parámetros.
donde eso me dejó con cierta confusión, no entiendo cómo pureHttpCall ahora es puro y todavía tiene un código subyacente impuro (la parte de búsqueda).
Entonces, ¿qué me estoy perdiendo aquí que hace que el código sea puro y funcional ?
Lo que hace que la función sea pura es esto:
memoize( ... )La memorización es un tipo especial de almacenamiento en caché. Es posible que esté familiarizado con el almacenamiento en caché. Es decir, almacenas el resultado de una operación costosa en una variable y si esa variable ya existe devuelve el valor de esa variable en lugar de realizar la operación costosa. Memoizar es exactamente eso.
La principal diferencia entre memorizar y almacenar en caché es que memorizar es un caché permanente: el algoritmo de almacenamiento en caché más utilizado tiene un proceso de invalidación: podría estar basado en el tiempo (eliminar el caché si es anterior a x ), basado en el recuento (eliminar el caché si hay hay más de x elementos almacenados en caché), basado en la memoria (elimine el caché si el caché usa más de x megabytes de RAM), etc. La memorización nunca elimina el caché. Por lo tanto, la costosa operación se realiza una sola vez .
El hecho de que una operación se realice solo una vez hace que cada llamada a pureHttpCall garantice el mismo resultado. Esto significa que la función ahora es pura.
Sí, puede hacer lo mismo con Math.random() si lo memoriza haciendo que cada llamada a pureRandom devuelva exactamente el mismo número. Y esto haría pureRandom puro porque siempre devuelve el mismo resultado. Personalmente, no lo llamaría una función "aleatoria".
Una implementación muy simple de memoize podría ser algo como esto:
function memoize (fn) { let cache; return function () { if (cache === undefined) { cache = fn(); } return cache; } }El código anterior es 100 % síncrono para mayor claridad, pero es posible escribir una versión asíncrona de una función de memorización.
Según tengo entendido, el autor argumenta aquí que debido a que se agrega la capa de almacenamiento en caché, la función ahora tiene resultados predecibles:
Una vez que haya hecho una combinación de los argumentos de entrada, esa misma combinación siempre devolverá el mismo resultado que produjo la primera vez.
Entonces, si desconecta su cable de ethernet y hace pureHttpCall("http://google.com") , obtendrá una respuesta de error. Si ahora vuelve a conectar el cable, entonces pureHttpCall("http://google.com") aún producirá exactamente el mismo error que recibió la primera vez.
Sin embargo, no creo que esté de acuerdo, porque aquí hay una dependencia implícita. La función todavía depende del entorno cuando se llama por primera vez. Por ejemplo, si reinicia su programa entre desenchufar y volver a enchufar su cable ethernet, obtendrá resultados diferentes.