Для методов, где ...
- существует статическое взаимно-однозначное отображение между входом и выходом, а
- стоимость создания выходного объекта относительно высока, а
- метод вызывается повторно с одним и тем же входом
... необходимо кэшировать значения результатов.
В моем коде следующий шаблон кэширования значения результата многократно повторяется (псевдокод в Java, но вопрос не зависит от языка):
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;
}
Постоянное повторение этой структуры является явным нарушением принципа СУХОЙ.
В идеале я бы хотел, чтобы приведенный выше код был сокращен до следующего:
@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;
}
Где теоретическая аннотация CacheResult позаботится о кэшировании, которое я сейчас выполняю вручную.
Общий термин для этого типа кэширования: " памятка ".
Хороший пример точной функциональности, которую я ищу, - Модуль ядра Perl "Memoize" .
На каких языках существует такое решение кэширования, подобное Memoize (либо на уровне языка, либо на уровне библиотеки)? В частности - существует ли такое решение для какой-либо крупной платформы, такой как Java или .NET?