Para procedimientos en los que ...¿Qué idiomas tienen soporte para el almacenamiento en caché del valor de retorno sin el código repetitivo?
- existe una estática uno-a-uno entre la entrada y la salida, y
- el costo de crear el objeto de salida es relativamente alta, y
- el método se llama repetidamente con la misma entrada
... hay una necesidad de valores de resultado de almacenamiento en caché.
En mi código el siguiente patrón de valor del resultado de almacenamiento en caché se repite mucho (pseudo-código en Java, pero la pregunta es independiente del idioma):
private static Map<Input, Output> fooResultMap = new HashMap<Input, Output>();
public getFoo(Input input) {
if (fooResultMap.get(input) != null) {
return fooResultMap.get(input);
}
Output output = null;
// Some code to obtain the object since we don't have it in the cache.
fooResultMap.put(input, output);
return output;
}
Repitiendo esta estructura todo el tiempo es una violación clara del principio DRY
Idealmente, me gustaría que el código anterior a reducirse a lo siguiente:
@CacheResult
public getFoo(Input input) {
Output output = null;
// Some code to obtain the object since we don't have it in the cache.
return output;
}
Cuando la anotación CacheResult teórica se haría cargo del almacenamiento en caché actualmente estoy haciendo con la mano.
El término general para este tipo de almacenamiento en caché es "memoization".
Un buen ejemplo de la funcionalidad exacta que estoy buscando es Perl core module "Memoize".
¿En qué idiomas existe una solución de almacenamiento en caché similar a Memoize (ya sea en el nivel de idioma o en el nivel de la biblioteca)? En particular, ¿existe una solución de este tipo para cualquier plataforma principal como Java o .NET?
(. Nota, las fugas de código que se muestra y no es seguro para subprocesos) –
Esto se está ejecutando un contexto web, y donde tienes que obtener el valor de Foo de una base de datos cada vez? –
@Chris: No, la pregunta es neutral al contexto. – knorv