Какие языки имеют поддержку возвращаемого значения, кэширующегося без шаблонного кода?

При вызове метода scrollspy вы обычно указываете тег body и элемент nav.


JavaScript выше эквивалентен:


Единственная ситуация, когда вы не указываете тег body, это если вы хотите отслеживать элемент с помощью вложенной полосы прокрутки, как в JSFiddle выше .

5
задан 6 revs 21 May 2009 в 12:21
поделиться

9 ответов

Не является встроенным языком, поместите модуль CPAN Memoize достаточно популярен в стране Perl, я думаю:

   # Compute Fibonacci numbers
    sub fib {
      my $n = shift;
      return $n if $n < 2;
      fib($n-1) + fib($n-2);
    }

    use Memoize;
    memoize('fib');
4
ответ дан 14 December 2019 в 19:23
поделиться

Python имеет ряд декораторов рецепты, например, модуль декоратора , которые работают для этого ( если все параметры неизменяемы), и он имеет реализации как на JVM, так и на .NET.

1
ответ дан 14 December 2019 в 19:23
поделиться

Инкубационная зона Spring, springmodules имеет именно эту функциональность для Java.

Кэш Springmodules все еще находится на уровне выпуска 0.8, но в целом он работал достаточно хорошо, когда я пробовал его в прошлом году. Есть параметры для настройки кэширования в файлах конфигурации Spring, а также с аннотациями, что очень похоже на ваш пример. Из их документации:

public class TigerCacheableService implements CacheableService {

  @Cacheable(modelId = "testCaching")
  public final String getName(int index) {
    // some implementation.
  }
...
}

Вы можете выбрать внутреннюю реализацию кеша. Когда я пробовал его, у меня были хорошие результаты, подключив его к ehcache , который также имеет хорошую интеграцию с Spring. Вы можете декларативно настроить ehcache для кэширования (в памяти и / или на диске) результатов методов, помеченных аннотацией @Cacheable .

1
ответ дан 14 December 2019 в 19:23
поделиться

Не прямой ответ на ваш вопрос, но если вы обслуживаете много кешей, возможно, стоит использовать OSCache (Java) для управления этими кешами. Вытеснение устаревших объектов и т. Д. Становится проблемой, о которой вам не нужно беспокоиться.

Тем не менее, вам все равно придется использовать базовый шаблон «проверить кеш», «вернуть кешированный» или «создать и добавить в кеш».

-1
ответ дан 14 December 2019 в 19:23
поделиться

Microsoft T-SQL может кэшировать возвращаемые значения из функции CLR на пр. основа запроса ...

(Нет шаблона, кроме правильных атрибутов метода при его написании в CLR.)

0
ответ дан 14 December 2019 в 19:23
поделиться

Вы можете реализовать аннотацию @CacheResult в Java, используя, например, ASM в преобразование метод добавления мемоизации код.

0
ответ дан 14 December 2019 в 19:23
поделиться

В Java можно исключить подобный код, хотя синтаксис Java остается подробным

private static final Cache<Input, Output> fooCache = Caches.newInstance(
    new Factory<Input, Output>() { public Output create(Input input) {
        return ... some code ...;
    }}
);
public static Output getFoo(Input input) {
    return fooCache.get(input);
}

С улучшенной синтаксической поддержкой анонимных внутренних классов это могло бы стать, скажем, следующим образом:

private static final Cache<Input, Output> fooCache =
    (Input input) (... some code ...);
public static Output getFoo(Input input) {
    return fooCache.get(input);
}

Это единственное, что может сделать решение АОП, за счет того, что придется иметь дело с небольшим количеством магии.

-1
ответ дан 14 December 2019 в 19:23
поделиться

Этот вопрос / ответ касается мемоизации в C #. Он не кэширует результаты, но его можно легко изменить, чтобы сделать карту статической с помощью ReaderWriterLock.

Вот пример из ссылки , указанной :

public static Func<A, R> Memoize<A, R>(this Func<A, R> f)
{
  var map = new Dictionary<A, R>();
  return a =>
    {
      R value;
      if (map.TryGetValue(a, out value))
        return value;
      value = f(a);
      map.Add(a, value);
      return value;
    };
}
-1
ответ дан 14 December 2019 в 19:23
поделиться

Обработчик кэширования - в .Net 'Enterprise Library'

http://msdn.microsoft.com/en-us/library/cc511757.aspx

[CachingCallHandler(0, 0, 30)]
public decimal GetSavingsBalance(int accountNumber)
{
  // Code here to extract balance from database.
  return balance;
}
2
ответ дан 14 December 2019 в 19:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: