Тема: Function Cache
Показать сообщение отдельно
  #1 (permalink)  
Старый 06.12.2014, 22:41
Интересующийся
Отправить личное сообщение для y0uix Посмотреть профиль Найти все сообщения от y0uix
 
Регистрация: 22.10.2013
Сообщений: 11

Function Cache
Всем привет!

Задача в том, что:

0) Создается некоторая функция, принимающая N аргументов;
1) Создается кэширующая функция, которая принимает вышеуказанную в качестве фунарга и дальше с возвращенным ей значением мы можем работать следующим образом:
- если такая функция-обертка вызывается с новым набором аргументов, то выполняется оригинальная функция;
- в противном случае, если вызов с такими аргументами уже был, то возвращается закэшированный результат, без вызова.

Вот оригинальное описание: "If you are calculating complex things or execute time-consuming API calls, you sometimes want to cache the results. In this case we want you to create a function wrapper, which takes a function and caches its results depending on the arguments, that were applied to the function."

Мой код:

function cache(func) {
  var cached_func = func,
      cached_func_data = [];
  
  return function() {
    var args_len = arguments.length,
        i,
        j;
    
    if (!cached_func_data.length) {
      return callCachedFunc(arguments);
    }
    
    for (i = 0; i < args_len; i++) {
      for (j = 0; j < cached_func_data[i].args.length; j++) {
        if (cached_func_data[i].args[i] === arguments[i]) {
          continue;
        }
        return cached_func_data[i].res;
      }
      return callCachedFunc(arguments);
    }
    
    function callCachedFunc(arguments) {
      var cache_obj = {};
      cache_obj.args = Array.prototype.slice.call(arguments);
      cache_obj.res = cached_func.apply(null, arguments);
      cached_func_data.push(cache_obj);
      return cache_obj.res;
    }
  }
}


Прошу провести ревью кода. Решение не полностью корректно, но я не могу пока что, к большому своему огорчению, найти ошибку.

Спасибо.
Ответить с цитированием