아래의 글은 마틴 파울러 지음 김지원 옮김, 『리팩토링 코드 품질을 개선하는 객체지향 사고법』,한빛미디어(2012)의 내용을 기반으로 작성하였습니다.

 

이름 요약 동기 예제
Extract Method
메서드 추출
코드의 뭉치를 별도의 메서드로 빼내는 기법 가장 많이 사용하고 핵심적인 기법
메서드 이름을 이해하기 쉽게 작성


Inline Method
메서드 내용 직접 삽입
메서드 내용이 너무 단순해서 메서드 명만 봐도 너무 뻔할 땐 그 메서더의 기능을 호출하는 메서드에 넣어버리고 그 메서드는 삭제하자 메서드를 간결하게 만드는 것
과다한 인다이렉션과 동시에 단순 위임이 너무 많을 때 사용
int getRating() {
return moreThanFiveLaterDeliveries() ? 2 : 1
}
boolean moreThanFiveDeliveries() {
return numberOfLateDelivereis > 5;
}

RF >

int geetRating() {
return numberOfLateDeliveries > 5 ? 2 : 1
}
Inline Temp
임시변수 내용 직접 삽입
간단한 수식을 대입 받는 임시변수로 인해 임시변수를 참조하는 부분을 전부 수식으로 치환   double basePrice = anOrder.basePrice();
return basePrice > 1000;

RF >

return anOrder.basePrice() > 1000
Replace Temp with Query
임시변수를 메서드 호출로 전환
수식의 결과를 저장하는 임시변수가 있을 땐 그 수식을 빼내어 메서드로 만든후 교체 임시변수에 값이 한번만 대입되고 대입문을 이루는 수식에 문제가 없는 경우 double basePrice = quantity * itemPrice;
if ( basePrice > 1000 ) 
return basePrice * 0.95;
else 
return basePrice * 0.98;

RF >

if (basePrice() > 1000) 
return basePrice * 0.95
else 
return basePrice * 0.98

double basePrice() {
return quantity * itemPrice;
}


Introduce Explaining Variable
직관적 임시변수 사용
수식이 복잡해서 이해하기 어려울 경우   if ( platform.indexOf("MAC") > -1) && resize > 0) {
}

RF >

boolean isMac = platform.indexOf("MAC) > -1;
boolean wasResized = resize > 0;

if ( isMac && wasResized ) {
}

Split Temporary Variable
임시변수 분리

루프변수나 값 누적용 임시변수가 아닌 여러 번 값이 때입될땐 각 대입마다 다른 임시변수 사용   double acc = primaryForce / mass;

if ( secondTime > 0) {
acc = primaryForce + secondaryForce / mass;
}

RF >

if (secondTime > 0) {
final double secondaryAcc = primaryForce + secondaryForce / mass;
}
Remove Assignments to Parameters
매개변수로의 값 대입 제거
매개 변수로 대입하는 코드가 있을 땐 매개변수 대신 임시변수를 사용하자   int discount ( int inputVal, int quantity, int yearToDate) {
if (inputVal > 50) inputVal -= 2;
return inputVal;
}
RF >

int discount(int inputVal, int quantity, int yearToDate) {
int result = inputVal;
if ( inputVal > 50 ) result -= 2;
return result;
}

Replace Metod with Method Object
매서드를 매서드 객체로 전환
지역변수 때문에 매서드 추출을 적용할 수 없는 긴 메서드가 있을때 그 메서드 자체를 객체로 전환해서 모든 지역변수를 객체의 필드로 만들고 그런 다음 그 메서드를 객체 안의 여러 매서드로 쪼개기    
Substitude Algorithm
알고리즘 전환
알로리즘을 더 분명한 것으로 교체해야 할 땐, 해당 메서드의 내용을 새 알고리즘을 바꾸자   String foundPerson(String[] people) {
for (String p : people) {
if (p.equals("Don") return "Don";
if (p.equals("John") return "John";
return "None";
}

RF >

String foundPerson(String[] people) {
List matchName = Arrays.asList("Don", "John");
for (String p : people) {
if (p.contains(matchName(i)) return matchName(i);
}
}

 

+ Recent posts