✏️12.1 메서드 올리기

리팩터링 전

class Employee {...}

class Salesman extends Employee {
  get name() {...}
}

class Engineer extends Employee {
  get name() {...}
}

리팩터링 후

class Employee {
  get name() {...}
}

class Salesman extends Employee {...}
class Engineer extends Employee {...}

🧷 배경

중복된 두 메서드에 중복 코드가 있다면 메서드 올리기를 통해 리팩터링을 진행하자. 이러한 중복은 한쪽의 변경이 다른쪽에는 반영되지 않을 수 있다는 위험을 항상 수반한다.

🧷 절차

  1. 똑같이 동작하는 메서드인지 면밀히 살펴본다.

  2. 메서드 안에서 호출하는 다른 메서드와 참조하는 필드들을 슈퍼클래스에서도 호출하고 참조할 수 있는지 확인한다.

  3. 메서드 시그니처가 다르다면 함수 선언 바꾸기로 슈퍼클래스에서 사용하고 싶은 형태로 통일한다.

  4. 슈퍼클래스에 새로운 메서드를 생성하고, 대상 메서드의 코드를 복사해넣는다.

  5. 정적 검사를 수행한다.

  6. 서브클래스 중 하나의 메서드를 제거한다.

  7. 테스트한다.

  8. 모든 서브클래스의 메서드가 없어질 때까지 다른 서브클래스의 메서드를 하나씩 제거한다.

🧷 예시

🧷 리팩터링 전

class Employee extends Party {
  get annualCost() {
    return this.monthlyCost * 12;
  }
}

class Department extends Party {
  get totalAnnualCost() {
    return this.monthlyCost * 12;
  }
}

🧷 리팩터링 후

class Party {
  get annualCost() {
    return this.monthlyCost * 12;
  }
}

Last updated