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);
}