리팩토링6. 메서드 올리기
- etc/리팩토링
- 2023. 4. 27.
들어가기 전
이 글은 인프런 백기선님의 리팩토링 강의를 복습하며 작성한 글입니다.
리팩토링 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()를 사용하게 된다.
템플릿 메서드 패턴 적용하기
위 코드에서는 템플릿 메서드 패턴을 적용하는 것이 불필요하다.
- 다른 일을 하는 코드는 Github에서 Issue를 가져오는 것이다. 이것은 eventID를 인자로 전달받거나, 30이라는 하드 코딩을 하거나의 차이에서 기인한다.
- 따라서 Github에서 Issue를 가져오는 부분을 추상 메서드로 만들어서 템플릿 메서드 패턴을 구현해 볼 수 있다.
- 각 하위 클래스에서는 Github에서 Issue를 가져오는 부분(getGithubIssue 메서드)에는 매개변수로 eventID를 전달해야한다. 따라서 각 하위 클래스가 구현할 클래스는 100% 동일한 구성을 가진다.
동일한 코드이기 때문에 Abstract Method로 빼서 각 하위 클래스에서 새로 구현할 필요가 전혀없다. 오히려 상위 클래스에서 하나의 메서드로 빼서 사용하는 것이 더 타당하다.
'etc > 리팩토링' 카테고리의 다른 글
리팩토링 17. 변수 캡슐화하기 (0) | 2023.04.27 |
---|---|
리팩토링 : 냄새 5 - 전역 데이터 (0) | 2023.04.27 |
리팩토링 5. 코드 정리하기 (0) | 2023.04.27 |
리팩토링 4. 함수 추출하기 (0) | 2023.04.27 |
리팩토링 냄새 2. 중복코드 (0) | 2023.04.27 |