매개변수 추가

메서드가 자신을 호출한 부분의 정보를 더 많이 알아야 할 땐
그 정보를 전달할 수 있는 매개변수를 추가한다

동기

  • 사실 이 리팩토링은 자주 실행되면 안된다
    • 매개변수를 추가하는 대신 다른 방법을 사용할 수 있을 때도 많고, 그럴 땐 가능하면 그 대안을 사용하는 것이 낫다
    • 매개변수를 추가하면 매개변수 세트가 더 길어지고, 기억하거나 알아보기 힘들어진다
  • 대안이 없다면 실행해도 된다
  • 기존 매개변수 세트를 살펴보면서 새 매개변수를 추가하면 어떻게 될지 생각해봐야 한다

방법

  1. 메서드 시그니쳐가 상위클래스나 하위클래스에 선언되어 있는지 검사한다

    • 구현되어 있다면 이 과정을 모든 구현부마다 실행한다
  2. 추가한 매개변수를 전달받는 새 메서드를 선언하고, 원본 메서드의 내용을 복사한다

  3. 새 메서드를 호출하게 원본 메서드의 내용을 수정한다

    1
    2
    3
    4
    5
    6
    7
    8
    public 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을 전달한다
    • 참조하는 부분이 별로 없다면 생략 가능하다
  4. 원본 메서드 호출 부분을 전부 찾아서 새 메서드 호출로 바꾼다

  5. 원본 메서드를 삭제한다

    • 원본 메서드의 모든 호출 부분에 접근할 수 없다면 @Deprecated로 표시한다

참고 : 마틴 파울러, 『리팩토링』, 김지원 옮김, 한빛미디어(2012)