메서드 추출

어떤 코드를 그룹으로 묶어도 되겠다고 판단되면,
그 코드를 뺴내어 목적을 잘 나타내는 직관적 이름의 메서드로 만든다

특징

  • 매우 자주 사용됨
  • 메서드가 너무 길거나 코드에 주석을 달아야만 의도를 이해할 수 있을때 사용
  • 메서드가 적절히 잘게 쪼개져있으면 다른 메서드에서 사용하기 수월함
  • 효과를 보려면 메서드의 이름도 잘 지어야 한다
    • 그리고 쪼개는 것도 해야겠지… 명확하게
  • 메서드명과 메서드 내용의 의미적 차이가 중요하다
    • 명료하기만 하면 메서드 길이가 메서드명보다 짧아도된다

방법

  1. 목적에 부합하는 새 이름의 메서드를 생성한다
    • 메서드명은 원리가 아니라 기능을 나타내야 한다.
  2. 기존 메서드에서 빼낸 코드를 새로 생성한 메서드로 복사한다
  3. 뺴낸 코드에서 기존 메서드의 모든 지역변수 참조를 찾는다
    • 새로 생성한 메서드의 지역변수나 매개변수로 활용할 것이다
  4. 추출한 메서드에서 사용되는 임시변수에 대해 처리한다
  5. 원본 메서드에서 뺴낸 코드 부분을 새로 생성한 메서드 호출로 수정한다

지역변수 처리

  • 추출한 메서드에서만 사용되는 값일 경우

    • 해당 메서드로 임시변수를 분리
  • 원본 메서드, 추출한 메서드 양쪽에서 다 사용되는 지역변수인데 추출한 메서드에서는 읽히기만 할 경우

    • 추출한 메서드에 매개변수로 전달
  • 원본 메서드, 추출한 메서드 양쪽에서 다 사용되는 지역변수이고 추출한 메서드에서 값이 변경될 경우

    • 변경되는 지역변수가 1개일 경우 리턴해주는 형식으로 작성 가능

      1
      2
      3
      4
      5
      int a = 0;

      // do something to `a`

      print(a);

      는 아래처럼 변경 가능

      1
      2
      int a = doSomething(0); // 필요한 값을 매개변수로 전달해줄 수 있음  
      print(a);
    • 2개 이상의 변수가 변경되는 경우, 메서드가 하나의 값을 반환하도록 더욱 분리해주는 것이 좋다.

      가능하면 하나의 값만 반환하는 것이 좋다고 한다.

  • 임시변수가 너무 많으면 임시 변수를 메서드 호출로 전환 같은 것을 사용해서 임시변수의 수를 줄이는 것이 좋다.

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