Function Cache

Function Cache

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.

//Usage example:
var complexFunction = function(arg1, arg2) {
  /* complex calculation in here */
};
var cachedFunction = cache(complexFunction);

cachedFunction('foo', 'bar');
// complex function should be executed

cachedFunction('foo', 'bar');
// complex function should not be invoked again, instead the cached result should be returned

cachedFunction('foo', 'baz');
// should be executed, because the method wasn't invoked before with these arguments

어떠한 함수가 이전에 호출했던 동일한 arguments를 재전달 받았을 때, 재연산을 하는 것이 아니고 기존에 실행했던 결과값을 저장했다가 다시 되불러 오도록 하는 wrapper 함수 cache를 만드는 문제입니다.

underbar 라이브러리의 _.memoize의 기능을 하는 함수를 구현하는 것이라, 위의 문제는 조금 익숙했습니다.

함수가 실행되면, 전달 받은 인자에 상응하는 결과값이 있는지 먼저 확인 후 있으면 저장했던 값을 반환합니다. 그렇지 않으면 연산을 한 수 결과값을 저장 및 반환합니다.

function cache(func) {
  var cached = {};

  return function() {
    var key = JSON.stringify(arguments);
    var isComputed = cached.hasOwnProperty(key);

    if (isComputed) {
      return cached[key];
    } else {
      cached[key] = func.apply(null, arguments);
      return cached[key];
    }
  };
}

다른 사람들의 풀이도 대부분 위의 풀이와 유사해, 다른 접근 방법에 대한 리뷰는 생략하겠습니다. : )