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 리팩토링 나쁜 디자인의 코드를 좋은 디자인으로 바꾸는 방법