-
메서드 추출(Extract Method)JAVA 2021. 5. 18. 13:08
장황한 메서드에는 너무 많은 정보와 복잡한 로직으로 얽혀 있습니다.
어떤 코드를 그룹으로 묶어도 되겠다고 판단될 땐 그 코드를 빼내어 목적을 잘 나타내는 직관적 이름의 메서드로 만들자
메서드 추출을 해야할 때
- 메서드가 너무 길때
- 코드에 주석을 달아야만 의도를 이해할 수 있을때
- 한 클래스의 두메서드 안에 같은 코드가 들어 있는 경우
- 한 클래스의 두 하위클래스에 같은 코드가 들어 있는 경우
메서드 추출에서 가장 힘든 작업
- 지역변수를 처리하는 것
방법
- 기능을 나타내는 이름의 새 메서드 생성
- 기존 메서드에서 빼낸 코드를 새로 생성한 메서드로 복사
- 빼낸 코드에서 기존 메서드의 모든 지역변수 참조를 찾는다.
- 그것들을 새로 생성한 메서드의 지역변수나 매개변수로 사용하게 된다.
- 빼낸 코드 안에서만 사용되는 임시변수가 있으면 새로 생성한 메서드 안에 임시변수로 선언
Before
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersvoid printOwing(double amount) { printBanner(); // 세부 정보 출력 System.out.println("name : " + _name); System.out.println("amout : " + amount); } After
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersvoid printOwing(double amount) { printBanner(); printDetails(amount); } void printDetails(double amount) { System.out.println("name : " + _name); System.out.println("amout : " + amount); } Before
123456789101112131415void printOwing(double amount) {Enumeration e = _orders.elements();double outstanding = 0.0;printBanner();while (e.hasMoreElements()) {Order each = (Order) e.nextElement();outstanding += each.getAmount();}System.out.println("name:" + _name);System.out.println("amouunt:" + amount);}cs After
1234567891011121314151617void printOwing() {printBanner();double outstanding = getOutstanding();printDetails(outstanding);}private double getOutstanding() {Enumeration e = _orders.elements();double outstanding = 0.0;while (e.hasMoreElements()) {Order each = (Order) e.nextElement();outstanding += each.getAmount();}return outstanding;}cs 같이 봐야 하는 것
- 임시변수를 메서드 호출로 전환
- 임시변수 분리
- 메서드를 메서드 객체로 전환
- 매개변수로의 값 대입 제거
- 알고리즘 전환
참고도서 : Refactoring 리팩토링 나쁜 디자인의 코드를 좋은 디자인으로 바꾸는 방법
'JAVA' 카테고리의 다른 글
TDD 요약 정리 - 테스트 주도 개발/테스팅 패턴, 빨간/초록 막대 (0) 2022.07.04 TDD - 2부 xUnit 간단 정리 (0) 2022.06.27 TDD 17장. Money 회고 요약 및 정리 (0) 2022.06.27 primitive type vs wrapper class (0) 2021.10.31 Builder Pattern (0) 2021.06.03