Page 22 - 006963
P. 22

};
                     console.log(memoizedFactorial(10)); // 열 번 계산
                     console.log(memoizedFactorial(10)); // 한 번 캐싱
                     console.log(memoizedFactorial(11)); // 한 번 계산되고 캐싱


                   이 예제를 실행하면 값을 계산할 때마다 조회 테이블에 값이 추가(number 매개변수와 함께)된다
                   는 것을 알 수 있습니다. 첫 번째 memoizedFactorial(10) 함수 호출에서는 일을 조금 해야 하지
                   만, 두 번째 memoizedFactorial(10) 함수 호출에서는 lookup 테이블만 참조하면 됩니다. 세 번

                   째 memoizedFactorial(10) 함수 호출에서는 11을 연산해야 하는데, 이미 10 문제를 해결했기 때
                   문에 lookupTable에서 숫자 10까지의 결과를 가져와 11만 계산하면 됩니다.

                   하지만 이제 memoizedFactorial 함수는 명시적인 매개변수 이외의 다른 것에 의존합니다. 즉, 함
                   수가 순수성을 잃게 되었습니다. 이 상황을 어떻게 피할 수 있을까요? 다음과 같이 lookupTable
                   을 명시적 매개변수로 만들어야 합니다(예제 파일: factorial-2.js).

                     function memoizedFactorial(number, lookupTable = {}){
                       if(number in lookupTable){
                         console.log("cached");
                         return lookupTable[number];
                       }else{
                         console.log("calculating");
                         var reduceValue;
                         if(number < 2){
                           reduceValue = 1;
                         }else{
                           reduceValue =
                             number  *  (memoizedFactorial(number - 1, lookupTable))['result'];
                         };
                         lookupTable[number] = reduceValue;
                         return {result: reduceValue, lookupTable: lookupTable};
                       }
                     };
                     console.log(memoizedFactorial(10)['result']);
                     console.log(memoizedFactorial(10)['result']);

                   이 코드를 실행하면 두 번째 함수 호출에서는 캐싱되지 않음을 알 수 있습니다. 무엇을 호출
                   하고 있는지 살펴보면 그리 놀라운 사실은 아닙니다. 빈 객체로 구성된 기본 명시적 매개변수

                   lookupTable을 가지고 있지만, 실제로는 전달되지 않습니다. 즉, 캐시가 없으면 캐시를 이용할
                   수 없습니다.



             430




         리팩토링 자바스크립트(본문)최종.indd   430                                                            2018-09-19   오전 1:31:34
   17   18   19   20   21   22   23