리팩토링6. 메서드 올리기

    들어가기 전

    이 글은 인프런 백기선님의 리팩토링 강의를 복습하며 작성한 글입니다. 


    리팩토링 6. 메서드 올리기(Pull Up Method)

    • Pull Up Method
      • 주로 상속 구조에서 발견할 수 있는 하위 클래스의 중복 메서드를 상위 클래스로 올려주는 리팩토링 기술이다.
    • 중복 코드는 당장은 잘 동작하더라도 미래에 버그를 만들어 낼 빌미를 제공한다.
      • 예) A 클래스에서 코드를 고치고, B 클래스에는 반영하지 않은 경우
    • 수정 할 때
      • 여러 하위 클래스에 동일한 코드가 있다면 손쉽게 적용 가능함.
      • 비슷하지만 일부 값만 다른 경우라면, "함수 매개변수화하기" 리팩토링을 적용한 이후에 이 방법을 사용 가능.
      • 하위 클래스에 있는 코드가 상위 클래스가 아닌 하위 클래스 기능에 의존하고 있다면 '필드 올리기'를 적용한 이후 '메서드 올리기'를 적용할 수 있음.
      • 두 메서드가 비슷한 절차를 따르고 있다면 '템플릿 메서드 패턴' 적용을 고려해 볼 수 있음.

    'Pull up Method'는 자주 사용되는 형태의 기술은 아니다. 그런데 하위 클래스에 중복 코드를 발견했다면, 중복 코드를 메서드로 빼내고 상위 클래스로 올려서 단단한 코드를 작성할 때 유용하게 사용할 수 있는 기술이다.


    적용해보기 Step1

    아래 이미지는 Dashboard의 두 하위 클래스를 보여준다. printParticipants(), printReviewers()는 비슷한 기능을 하는 코드지만 아직까지 완전히 동일한 코드는 아니다. 이 부분을 수정한다면 동일한 코드처럼 바꿀 수 있게 된다.

    • printReveiwers()에서는 하드 코딩된 값을 사용하고 있으며, printParticipants()에서는 eventID 변수를 이용해서 설정한다.
    • 각각 호출하는 변수의 이름이 participatns, reviewers로 다르다. 

    위에서 이야기한 다른 부분을 수정하면 하나의 공통된 코드로 작성할 수 있다. 사용되는 변수의 이름은 다르지만 각 코드가 하는 전체적인 작업이 동일한 작업이기 때문이다. 예를 들어 ReviewerDashboard의 코드는 printUsers()라는 메서드 이름으로 추출해 볼 수 있다. 

     

     

    적용해보기 Step2

    앞서 ReviewerDashboard, ParticipantDashboard 클래스에서 printUsers()로 동일한 이름으로 메서드를 공통 추출했다. 이제 Pull Up 메서드를 이용해서 하위 클래스의 printUsers()를 상위 클래스로 올려서 함께 사용할 수 있게 된다. 다음 순서대로 하면 된다.

    • 인텔리제이 → 메서드 이름 우클릭 → Refactor → Pull Members Up 클릭

    Pull Members Up을 실행하면 다음과 같은 변경 사항이 발생한다

    • 하위 클래스에 있던 printUsers() 메서드가 상위 클래스인 Dashboard로 올라온다. 
    • 하위 클래스는 상위 클래스의 printUsers()를 사용하게 된다. 


    템플릿 메서드 패턴 적용하기

    위 코드에서는 템플릿 메서드 패턴을 적용하는 것이 불필요하다. 

    1. 다른 일을 하는 코드는 Github에서 Issue를 가져오는 것이다. 이것은 eventID를 인자로 전달받거나, 30이라는 하드 코딩을 하거나의 차이에서 기인한다.
    2. 따라서 Github에서 Issue를 가져오는 부분을 추상 메서드로 만들어서 템플릿 메서드 패턴을 구현해 볼 수 있다.
    3. 각 하위 클래스에서는 Github에서 Issue를 가져오는 부분(getGithubIssue 메서드)에는 매개변수로 eventID를 전달해야한다. 따라서 각 하위 클래스가 구현할 클래스는 100% 동일한 구성을 가진다. 

    동일한 코드이기 때문에 Abstract Method로 빼서 각 하위 클래스에서 새로 구현할 필요가 전혀없다. 오히려 상위 클래스에서 하나의 메서드로 빼서 사용하는 것이 더 타당하다.

     

     

    댓글

    Designed by JB FACTORY