메서드가 자신을 호출한 부분의 정보를 더 많이 알아야 할 땐
그 정보를 전달할 수 있는 매개변수를 추가한다
동기
- 사실 이 리팩토링은 자주 실행되면 안된다
- 매개변수를 추가하는 대신 다른 방법을 사용할 수 있을 때도 많고, 그럴 땐 가능하면 그 대안을 사용하는 것이 낫다
- 매개변수를 추가하면 매개변수 세트가 더 길어지고, 기억하거나 알아보기 힘들어진다
- 대안이 없다면 실행해도 된다
- 기존 매개변수 세트를 살펴보면서 새 매개변수를 추가하면 어떻게 될지 생각해봐야 한다
방법
-
메서드 시그니쳐가 상위클래스나 하위클래스에 선언되어 있는지 검사한다
- 구현되어 있다면 이 과정을 모든 구현부마다 실행한다
-
추가한 매개변수를 전달받는 새 메서드를 선언하고, 원본 메서드의 내용을 복사한다
-
새 메서드를 호출하게 원본 메서드의 내용을 수정한다
1
2
3
4
5
6
7
8public int originMethod(int a, int b) {
return newMethod(a, b, 0);
}
public int newMethod(int a, int b, int c) {
// do somtehing
return someVar;
}- 새 매개변수가 객체일 경우는 보통 null을 전달한다
- primitive 타입일 경우는 명백히 이상한 값을 전달해서 참조하는 부분을 찾아낸다(?)
- int일 경우 보통 0을 전달한다
- 참조하는 부분이 별로 없다면 생략 가능하다
-
원본 메서드 호출 부분을 전부 찾아서 새 메서드 호출로 바꾼다
-
원본 메서드를 삭제한다
- 원본 메서드의 모든 호출 부분에 접근할 수 없다면
@Deprecated
로 표시한다
- 원본 메서드의 모든 호출 부분에 접근할 수 없다면
참고 : 마틴 파울러, 『리팩토링』, 김지원 옮김, 한빛미디어(2012)