JAVA
메서드 추출(Extract Method)
junseokoh
2021. 5. 18. 13:08
장황한 메서드에는 너무 많은 정보와 복잡한 로직으로 얽혀 있습니다.
어떤 코드를 그룹으로 묶어도 되겠다고 판단될 땐 그 코드를 빼내어 목적을 잘 나타내는 직관적 이름의 메서드로 만들자
메서드 추출을 해야할 때
- 메서드가 너무 길때
- 코드에 주석을 달아야만 의도를 이해할 수 있을때
- 한 클래스의 두메서드 안에 같은 코드가 들어 있는 경우
- 한 클래스의 두 하위클래스에 같은 코드가 들어 있는 경우
메서드 추출에서 가장 힘든 작업
- 지역변수를 처리하는 것
방법
- 기능을 나타내는 이름의 새 메서드 생성
- 기존 메서드에서 빼낸 코드를 새로 생성한 메서드로 복사
- 빼낸 코드에서 기존 메서드의 모든 지역변수 참조를 찾는다.
- 그것들을 새로 생성한 메서드의 지역변수나 매개변수로 사용하게 된다.
- 빼낸 코드 안에서만 사용되는 임시변수가 있으면 새로 생성한 메서드 안에 임시변수로 선언
Before
After
Before
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
void 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
void 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 리팩토링 나쁜 디자인의 코드를 좋은 디자인으로 바꾸는 방법