리팩터링 8장

wonderful world·2022년 4월 2일
1

리팩토링 2판

목록 보기
3/9

기능 이동

8.1 함수 옮기기

모듈화: 서로 관련 있는 들이 잘 모아 놓는 것. 모듈성이 좋다면 해당 기능을 수정하려고 할 때 다른 것들은 이해하지 못해도 할 수 있게 만들어줌. 그리고 수정이 한 곳에서만 일어날 수 있음.

모든 함수는 컨텍스트 안에 존재하며, 대부분 특정 모듈에 속한다. 캡슐화를 위해 함수를 함수가 참조하는 곳이 많은 모듈로 옮겨주는 것이 좋다. 또한 호출자들의 현재 위치나 다음 업데이트 때 바뀌리라 예상되는 위치에 따라서도 함수를 옮겨야 할 수 있다.

절차

  1. 선택한 함수가 현재 컨텍스트에서 사용 중인 모든 프로그램 요소를 살펴본다. 이 요소들 중에도 함께 옮겨야 할 게 있는 지 고민해본다.
  2. 선택한 함수가 다형 메서드인지 확인한다.
  3. 선택한 함수를 타겟 컨텍스트로 복사한다. 타겟 함수가 새로운 터전에 잘 자리 잡도록 다듬는다.
  4. 정적 분석을 수행한다.
  5. 소스 컨텍스트에서 타겟 함수를 참조할 방법을 찾아 반영한다.
  6. 소스 함수를 타겟 함수의 위임 함수가 되도록 수정한다.
  7. 테스트 한다.
  8. 소스 함수를 인라인할지 고민해본다.
// before
function trackSummary(points) {
  const totalTime = calculateTime();
  const totalDistance = calculateDistance();
  const pace = totalTime / 60 / totalDistance;
  return {
    time: totalTime,
    distance: totalDistance,
    pace: pace
  };
  
  function calculateDistance() {
    let result = 0;
    for (let i = 1; i < points.length; i++) {
      result += distance(points[i-1], points[i]);
    }
    return result;
  }
  
  function distance(p1, p2) { ... }
  function radians(degrees) { ... }
  function calculateTime() { ... }
}
// after
function trackSummary(points) {
  const totalTime = calculateTime();
  const pace = totalTime / 60 / totalDistance(points);
  return {
    time: totalTime,
    distance: totalDistance(points),
    pace: pace
  };
}

function totalDistance(points) {
  let result = 0;
  for (let i = 1; i < points.length; i++) {
    result += distance(points[i-1], points[i]);
  }
  return result;
}
  
function distance(p1, p2) { ... }
function radians(degrees) { ... }
function calculateTime() { ... }

8.2 필드 옮기기

8.3 문장을 함수로 옮기기

8.4 문장을 호출한 곳으로 옮기기

Reference

profile
hello wirld

0개의 댓글