Memoization y persistencia

Ya hemos visto como crear nuestra propia librería de memoization. Pero sus beneficios duran solo mientras la aplicación está en memoria. Si por ejemplo recargamos la web donde la usamos perdemos todos los resultados memorizados. Para evitar eso podríamos exportar el mapa de clave valor que guarda los parámetros y su valor. Una vez exportado podemos persistirlo como queramos. En el servidor, en el almacenamiento local del navegador donde se quiera.

Todo lo que se comenta en este texto se puede encontrar en la librería memo.js

Para exportado vamos a convertirlo en una cadena de texto que contenga los datos en formato JSON. En nuestro caso los datos están guardados dentro de la variable cache, la cual convertiremos a cadena usando JSON.stringify()

    getCache(){
        return JSON.stringify(this.cache);
    }

Una vez tenemos la cadena de texto para poder persistirla es necesario poder hacer el paso contrario. Recuperar los datos de la cache partiendo de la cadena para ellos emplearemos JSON.parse()

    loadCache(cache){
        this.cache = JSON.parse(cache);
    }

Vamos a ver un ejemplo sacado de la librería memo.js de como usar estas dos funciones para “clonar” un objeto que guarda la memoization de la función sum:

<html>

<script src="memo.js"> </script>

<body>
Abre la consola!!!!
</body>

<script>
function sum(a,b){
    console.log("calculando "+a+" + "+b);
    return a+b;
}

let memo = new Memo(sum);

console.log(memo.call(1,2)); //invoca sum
console.log(memo.call(1,2)); //no invoca sum
console.log(memo.call(2,3)); //invoca sum
console.log(memo.call(2,1)); //invoca sum

let storeMemoCache = memo.getCache(); //exporta la cache a String

//si se desea persisitir la memoization basta con persistir storeMemoCache

let memo2 = new Memo(sum);
memo2.loadCache(storeMemoCache); //carga la cache
console.log(memo2.call(1,2)); //no invoca sum

</script>

</html>