이름이 같은 메서드가 여러 하위클래스에 들어 있을 땐,
그 메서드를 상위 클래스로 옮긴다
특징
- 다른 리팩토링 단계를 마친 후 적용하는 것이 일반적이다
- 다른 클래스에 있는 두 개의 메서드가 매개변수로 전환되어 결국 같은 메서드가 될 수도 있다
- 하위클래스가 상위 클래스 기능을 재정의했음에도 불구하고 기능이 같다면, 바로 실시해야 한다
- 두 메서드가 똑같진 않고 비슷한 부분이 있다면
템플릿 메서드 형성
을 실시하는 방법도 있다
방법
- 메서드가 서로 같은지 검사한다
- 거의 비슷한데 똑같진 않다면
알고리즘 전환
을 적용해서 메서드를 똑같게 만든다
- 거의 비슷한데 똑같진 않다면
- 메서드 시그니처가 서로 다르다면 모든 시그니처를 상위클래스에서 사용하고자 하는 시그니처로 수정한다
- 상위클래스에 새 메서드를 작성하고, 하위클래스의 메서드를 복사해서 넣은 뒤 적절히 수정하고 컴파일한다
- 메서드가 하위클래스의 메서드를 사용한다면 상위클래스에 abstract 타입 메서드를 선언한다
- 메서드가 하위클래스의 필드를 사용한다면
필드 상향
이나필드 자체 캡슐화
를 적용한다
- 하위클래스 메서드를 하나 삭제하고 컴파일과 테스트를 실시한다
- 4번과 같은 식으로 상위클래스 메서드만 남을때까지 메서드를 계속 삭제한다
- 메서드 호출하는 부분을 상위클래스로 대체할 수 있는지 파악하고, 수정할 수 있으면 수정한다
참고 : 마틴 파울러, 『리팩토링』, 김지원 옮김, 한빛미디어(2012)