본문 바로가기

프로그램언어/Refactoring

[ Refactoring] Inline Method

메소드 몸체가 메소드의 이름만큼이나 명확할때는 호출하는 곳에 메소드의 몸체를 넣고, 메소드를 삭제하라

  int getRating() {
      return (moreThanFiveLateDeliveries()) ? 2 : 1;
  }
  boolean moreThanFiveLateDeliveries() {
      return _numberOfLateDeliveries > 5;
  }
  int getRating() {
      return (_numberOfLateDeliveries > 5) ? 2 : 1;
  }

동기

  • 이럴때는 메소드를 제거한다.
    • 때로는 메소드의 몸체가 메소드의 이름만큼이나 명확할때가 있다.
    • 메소드의 몸체를 메소드의 이름만큼이나 명확하게 리팩토링 할수도 있다.
    • 필요없는 인디렉션은 짜증나게 한다
  • 메소드가 잘못 나뉘어졌을때
    • 메소드를 다시 합쳐 하나의 큰 메소드로 만든 다음 다시 메소드 추출 ==> Replace Method with Method Object 를 사용하기 전에 이 방법 쓰면 좋다(Beck)
    • 메소드 객체가 포함하고 있어야할 동작을 가지 메소드에 의해 호출되는 여러 메소드를 인라인화 한다.
    • 메소드와 그 메소드가 호출하는 다른 여러 메소드를 옮기는 것보다는 메소드 하나만 옮기는 것이 더 쉽다.
  • 너무 많은 인디렉션이 사용되어 모든 메소드가 단순히 다른 메소드에 위임을 하고 있어 그 인디렉션 속에서 길을 잃을 염려가 있을때

절차

  • 메소드가 다형성을 가지고 있지 않은지 확인한다
    • 서브 클래스에서 오버라이드하고 있는 메소드에는 적용하지 않는다
    • 수퍼클래스에 없는 메소드를 서브클래스에서 오버라이드 할수는 없다
  • 메소드를 호출하고 있는 부분을 모두 찾는다
  • 각각의 메소드 호출을 메소드 몸체로 바꾼다
  • 컴파일과 테스트를 한다
  • 메소드 정의를 제거한다.
  • Inline Method가 간단한가?
    • 일반적으로 그리 간단하지 않다
    • 재귀가 사용되는 경우나 리턴 포인트가 여러 곳인 경우에 어떻게 하고 접근자가 없을때는 어떻게 다른 객체로 인라인화 하는지...
    • 이러면 하지 마라!