컴퓨터/이론 및 tools 사용

[리팩토링 refactoring] Composing Method 메소드 구성 - Extract Method 메소드 추출

review777777 2017. 1. 30. 14:36
반응형

Extract Method 메소드 추출


메소드에서 행이 많을수록 메소드가하는 일을 파악하는 것이 더 어렵다.



코드에서 거친 모서리를 제거하는 것 외에도 메소드 추출은 다른 많은 리팩토링 접근법의 한 걸음이기도하다.



Problem


함께 구룹화 할 수 있는 코드 조각이 있다.


void printOwing() {
  printBanner();

  //print details
  System.out.println("name: " + name);
  System.out.println("amount: " + getOutstanding());
}



Solution


이 코드를 별도의 새 메서드 (또는 함수)로 이동하고 이전 코드를 메서드 호출로 바꾼다.


void printOwing() {
  printBanner();
  printDetails(getOutstanding());
}

void printDetails(double outstanding) {
  System.out.println("name: " + name);
  System.out.println("amount: " + outstanding);
}




Benefits




• 더 읽기 쉬운 코드! 새 메서드에 메서드의 용도를 설명하는 이름 (createOrder (), renderCustomerInfo () 등)을 지정해야한다.


• 적은 코드 중복. 메소드에서 발견되는 코드는 종종 프로그램의 다른 위치에서 재사용 될 수 있다. 따라서 복제본을 새 메소드 호출로 대체 할 수 있다.


• 코드의 독립적 인 부분을 분리한다. 즉, 잘못된 변수가 수정 된 경우와 같이 오류가 적다.



How to Refactor



1. 새로운 방법을 만들고 목적을 자명하게하는 방식으로 이름을 지정.


2. 새 메소드로 관련 코드 조각을 복사. 이전 위치에서 프래그먼트를 삭제하고 대신 새 메소드를 호출.


이 코드 조각에 사용 된 모든 변수를 찾고 조각 내에서 선언되고 외부에서 사용되지 않으면 간단히 변경하지 않고 새 방법의 지역 변수가된다.

3. 추출 할 코드보다 먼저 변수를 선언하면 이전에 포함 된 값을 사용하기 위해 이러한 변수를 새 메소드의 매개 변수에 전달해야한다. Temp with Query를 사용하여 이러한 변수를 없애는 것이 더 쉬운 경우가 있다.


4. 지역 변수가 어떤 식 으로든 추출 된 코드에서 변경되는 것을 알게되면,이 변경된 값이 나중에 메인 메소드에서 필요하다. 이중 점검! 이것이 사실이라면이 변수의 값을 기본 메소드로 리턴하여 모든 기능을 유지해야 한다.



Example 



Before

void printOwing() {

  printBanner();

  double outstanding = getOutstanding();

  printDetails(outstanding);

}


void printBanner() {

  System.out.println("*****************************");

  System.out.println("****** Customer totals ******");

  System.out.println("*****************************");

}


void printDetails(double outstanding) {

  System.out.println("name: " + name);

  System.out.println("amount: " + outstanding);

}


double getOutstanding() {

  Enumeration elements = orders.elements();

  double outstanding = 0.0;

  while (elements.hasMoreElements()) {

    Order each = (Order) elements.nextElement();

    outstanding += each.getAmount();

  }

  return outstanding;

}


After

void printOwing() {

  Enumeration elements = orders.elements();

  double outstanding = 0.0;


  // print banner

  System.out.println ("*****************************");

  System.out.println ("****** Customer totals ******");

  System.out.println ("*****************************");


  // print owings

  while (elements.hasMoreElements()) {

    Order each = (Order) elements.nextElement();

    outstanding += each.getAmount();

  }


  // print details

  System.out.println("name: " + name);

  System.out.println("amount: " + outstanding);

}


반응형