데코레이터와 포워딩

데코레이터

캐싱기능을 위해 인수로 받은 함수의 행동을 변경시켜주는 함수

자주 사용되는 함수의 재연산 시간을 줄이기 위해 캐싱 기능을 위해 래퍼 함수 만들기

function slow(x) {
  // CPU 집약적인 작업이 여기에 올 수 있습니다.
  alert(`slow(${x})을/를 호출함`);
  return x;
}

function cachingDecorator(func) {
  let cache = new Map();

  return function (x) {
    if (cache.has(x)) {
      // cache에 해당 키가 있으면
      return cache.get(x); // 대응하는 값을 cache에서 읽어옵니다.
    }

    let result = func(x); // 그렇지 않은 경우엔 func를 호출하고,

    cache.set(x, result); // 그 결과를 캐싱(저장)합니다.
    return result;
  };
}

slow = cachingDecorator(slow);
  • cachingDecorator함수를 생성하여 없는 결과값이면 메모리에 저장하고 이미 실행되었던 함수 인자라면 실행없이 바로 결과를 return해주는 캐시 기능의 함수로 return값은 캐싱기능이 추가되어 wraaping된 함수가 반환되므로 동일한 작업을 수행하는 것은 변함이 없다.

    캐싱 데코레이터는 객체 메서드에 사용하기에 적합하지 않기 때문에 func.call함수 이용 (객체 함수에서 this이용시 decorator함수로 wrapp도중 this가 undefined되기 때문에)

  • func.call : this를 명시적으로 고정해 함수를 호출할 수 있게 해주는 내장 메서드

let worker = {
  slow(x) {
    alert(`slow(${x})을/를 호출함`);
    return x * this.someMethod();
  },
};

function cachingDecorator(func) {
  let cache = new Map();
  return function (x) {
    if (cache.has(x)) {
      return cache.get(x);
    }
    let result = func.call(this, x); // 이젠 'this'가 제대로 전달됩니다.
    cache.set(x, result);
    return result;
  };
}

worker.slow = cachingDecorator(worker.slow); // 캐싱 데코레이터 적용

Last updated