좋은 설계자 & 좋은관리자 & 좋은개발자/Code Refactoring

[2] 리펙토링 - 함수를 분리해라 _ 1편

hoonihoon 2014. 6. 24. 17:45



메서드의 목적을 분명해야 된다. 너무길거나 메서드의 목적을 알 수 없이 여러개의 목적이 들어 간다면 리펙토링 하는 것이 좋다. 

메서드는 짧고, 이름이 명확해야 한다.


 
void printOwing() {
    Enumeration e = _orders.elements();
    double outstanding = 0.0;
 
    // 배너출력
    System.out.println ("**************************");
    System.out.println ("***** Customer Owes ******");
    System.out.println ("**************************");
 
    // 미지불금액 계산
    while (e.hasMoreElements()) {
        Order each = (Order) e.nextElement();
        outstanding += each.getAmount();
    }
 
    // 상세출력
    System.out.println ("name:" + _name);
    System.out.println ("amount" + outstanding);
}


위 코드를 보면 함수명을 보면 미지불 금액을 출력하는데,  배너도 출력 하고 상세내역도 출력 한다.


이 함수를 기능별로 분리하는 방법을 선호 하는데 이유를 생각해 본다면 다음과 같다.


메서드를 분리 한다면, 분리된 함수들에 대한 사용성이 증가한다.  아래 코드를 보면 배너출력과 상세출력을 분리하였다. 함수명만 봐도 한눈에 이해하기 쉽다. 

또한, 추후에 지불된금액에 대해 출력을 할때,  printBanner() 를 재사용 할 수 있다.





void printOwing() { Enumeration e = _orders.elements(); double outstanding = 0.0; printBanner(); // 미지불금액 계산 while (e.hasMoreElements()) { Order each = (Order) e.nextElement(); outstanding += each.getAmount(); } printDetails(outstanding ); } // 배너출력 void printBanner() { System.out.println ("**************************"); System.out.println ("***** Customer Owes ******"); System.out.println ("**************************"); } // 상세 출력 void printDetails(double outstanding) { System.out.println ("name:" + _name); System.out.println ("amount" + outstanding); } // 추가된 지불된 금액 함수 void printPaidMoney() { printBanner(); // 함수 재사용 증가 }



미지불 금액 계산 로직도 함수로 뺄 수 있다.


void printOwing() { printBanner(); double outstanding = getOutstanding(); printDetails(outstanding ); } // 미지불금액 계산 double getOutstanding() { Enumeration e = _orders.elements(); double result = 0.0; while (e.hasMoreElements()) { Order each = (Order) e.nextElement(); result += each.getAmount(); } return result; } // 배너출력 void printBanner() { System.out.println ("**************************"); System.out.println ("***** Customer Owes ******"); System.out.println ("**************************"); } // 상세 출력 void printDetails(double outstanding) { System.out.println ("name:" + _name); System.out.println ("amount" + outstanding); }

리펙토링의 기본을 공부 했다. 

기억해야 할 부분은 함수는 한눈에 알아 보기 쉬워야 해야하며, 분리가 가능하다면 분리 하는 것이 재사용성이 좋다는 것.