블로그 이미지
암초보

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Notice

Tag

01-31 09:22
2011. 9. 19. 02:44 프로그래밍/Refactoring

※ 어떤 수식의 결과값을 저장하기 위해서 임시변수를 사용하고 있다면, 수식을 뽑아내서 메소드로 만들고, 임시변수를 참조하는 곳을 찾아 모두 메소드 호출로 바꾼다. 새로 만든 메소드에서도 사용될 수 있다.

※ Extract Method 하기 전의 필수 단계

※ 절차
1. 임시변수에 값이 한번만 대입되는지 확인 (여러번이라면 Split Temporary Variable을 먼저 적용)
2. 임시변수를 final로 선언 후 컴파일 (임시변수에 값이 한번만 대입되는지 확인)
3. 대입문의 우변을 메소드로 추출
- 처음에 메소드를  private로 선언, 이후에 판단하여 접근 권한 변경
- 추출된 메소드에 부작용이 없는지 확인 (있다면 Separate Query from Modifier를 사용)
4. 컴파일 및 테스트
5. Inline Temp 적용

Before
double getPrice() {
   int basePrice = _quantity * _itemPrice;
   double discountFactor;
   if (basePrice > 1000) discountFactor = 0.95;
   else discountFactor = 0.98;
   return basePrice * discountFactor;
}

Step 1.
double getPrice() {
   final int basePrice = _quantity * _itemPrice;
   final double discountFactor;
   if (basePrice > 1000) discountFactor = 0.95;
   else discountFactor = 0.98;
   return basePrice * discountFactor;
}

Step 2.
double getPrice() {
   final int basePrice = basePrice();
   final double discountFactor;
   if (basePrice > 1000) discountFactor = 0.95;
   else discountFactor = 0.98;
   return basePrice * discountFactor;
}

private int basePrice() {
   return _quantity * _itemPrice;
}

Step 3.
double getPrice() {
   final int basePrice = basePrice();
   final double discountFactor;
   if (basePrice() > 1000) discountFactor = 0.95;
   else discountFactor = 0.98;
   return basePrice * discountFactor;
}

private int basePrice() {
   return _quantity * _itemPrice;
}

Step 4.
double getPrice() {
   final double discountFactor;
   if (basePrice() > 1000) discountFactor = 0.95;
   else discountFactor = 0.98;
   return basePrice() * discountFactor;
}

private int basePrice() {
   return _quantity * _itemPrice;
}

Step 5.
double getPrice() {
   final double discountFactor = discountFactor();
   return basePrice() * discountFactor;
}

private int basePrice() {
   return _quantity * _itemPrice;
}

private double discountFactor() {
 if (basePrice() > 1000) return 0.95;
   else return 0.98;

}

Step 6.
double getPrice() {
   return basePrice() * discountFactor();
}

private int basePrice() {
   return _quantity * _itemPrice;
}

private double discountFactor() {
 if (basePrice() > 1000) return 0.95;
   else return 0.98;

}




//////////////////////////////////////////////////////////////////////////////////////////
출처 : 마틴 파울러의 리팩토링
//////////////////////////////////////////////////////////////////////////////////////////

'프로그래밍 > Refactoring' 카테고리의 다른 글

Split Temporary Variable  (0) 2011.09.19
Introduce Explaining Variable  (0) 2011.09.19
Inline Temp  (0) 2011.09.18
Inline Method  (0) 2011.09.18
Extract Method  (0) 2011.09.18
posted by 암초보
2011. 9. 18. 18:04 프로그래밍/Refactoring

※ 간단한 수식의 결과값을 가지는 임시변수가 있고, 그 임시변수가 다른 리팩토링을 하는데 방해가 된다면, 이 임시변소를 참조하는 부분을 모두 원래의 수식으로 바꾸라.

※ Replace Temp with Query 의 한 부분으로 사용됨

Before
   double basePrice = anOrder.basePrice();
   return (basePrice > 1000);
(임시변수를 final로 선언한다음 컴파일해본다. 임시변수에 값이 단 한번만 대입되고 있는지를 확인)

After
   return (anOrder.basePrice() > 1000);






//////////////////////////////////////////////////////////////////////////////////////////
출처 : 마틴 파울러의 리팩토링
//////////////////////////////////////////////////////////////////////////////////////////

'프로그래밍 > Refactoring' 카테고리의 다른 글

Introduce Explaining Variable  (0) 2011.09.19
Replace Temp with Query  (0) 2011.09.19
Inline Method  (0) 2011.09.18
Extract Method  (0) 2011.09.18
리팩토링으로 해결될 수 있는 문제가 있다는 징후  (0) 2011.09.18
posted by 암초보
2011. 9. 18. 17:59 프로그래밍/Refactoring

※ 메소드 몸체가 메소드의 이름 만큼이나 명확할 때는, 호출하는 곳에 메소드의 몸체를 넣고, 메소드를 삭제하라.

Before
 int getRating() {
   return (moreThanFiveLateDeliveries()) ? 2:1;
}
boolean moreThanFiveLateDeliveries() {
   return _numberOfLateDeliveries > 5
}

After
 int getRating() {
   return (_numberOfLateDeliveries > 5) ? 2:1;
}




//////////////////////////////////////////////////////////////////////////////////////////
출처 : 마틴 파울러의 리팩토링
//////////////////////////////////////////////////////////////////////////////////////////

'프로그래밍 > Refactoring' 카테고리의 다른 글

Replace Temp with Query  (0) 2011.09.19
Inline Temp  (0) 2011.09.18
Extract Method  (0) 2011.09.18
리팩토링으로 해결될 수 있는 문제가 있다는 징후  (0) 2011.09.18
이클립스 리팩토링 단축키  (0) 2011.09.17
posted by 암초보
2011. 9. 18. 17:52 프로그래밍/Refactoring

간단하게 정리, 상세한 부분은 생략

※ 그룹으로 함께 묶을 수 있는 코드 조각이 있으면, 코드의 목적이 잘 드러나도록 메소드의 이름을 지어 별도의 메소드로 뽑아낸다.

Before
 void printOwing(double amount) {
   printBanner();
   //상세 정보 표시
   System.out.println("name:"+_name);
   System.out.println("amount:"+amount);
}

After
 void printOwing(double amount) {
   printBanner();
   printDetails(amount)
}
 void printDetails(double amount) {
   System.out.println("name:"+_name);
   System.out.println("amount:"+amount);
}




//////////////////////////////////////////////////////////////////////////////////////////
출처 : 마틴 파울러의 리팩토링
//////////////////////////////////////////////////////////////////////////////////////////

'프로그래밍 > Refactoring' 카테고리의 다른 글

Inline Temp  (0) 2011.09.18
Inline Method  (0) 2011.09.18
리팩토링으로 해결될 수 있는 문제가 있다는 징후  (0) 2011.09.18
이클립스 리팩토링 단축키  (0) 2011.09.17
리팩토링이란?  (0) 2011.09.17
posted by 암초보
2011. 9. 18. 03:18 프로그래밍/Refactoring

1. 중복된 코드

2. 긴 메소드
- 주석 대신 메소드
- 주석 대신 코드의 목적을 잘 설명하는 메소드 이름
 
3. 거대한 클래스

4. 긴 파라미터 리스트
- 이해하기 어려움
- 일관성이 없거나 사용하기 어려움
- 다른 데이터가 필요할 때마다 계속 고쳐야함

5. 확산적 변경

6. 산탄총 수술

7. 기능에 대한 욕심

8. 데이터 덩어리

9. 기본 타입에 대한 강박관념

10. Switch 문

11. 평행 상속 구조

12. 게으른 클래스

13. 추측성 일반화

14. 임시 필드

15. 메시지 체인

16. 미들 맨

17. 부적절한 친밀

18. 다른 인터페이스를 가진 대체 클래스

19. 불완전한 라이브러리 클래스

20. 데이터 클래스

21. 거부된 유산

22. 주석

'프로그래밍 > Refactoring' 카테고리의 다른 글

Inline Method  (0) 2011.09.18
Extract Method  (0) 2011.09.18
이클립스 리팩토링 단축키  (0) 2011.09.17
리팩토링이란?  (0) 2011.09.17
코드를 짤 때는..  (0) 2011.09.17
posted by 암초보
2011. 9. 18. 00:55 프로그래밍/Java

'프로그래밍 > Java' 카테고리의 다른 글

예외처리 방법  (0) 2011.09.24
예외의 종류  (0) 2011.09.24
Java transient  (0) 2011.09.05
Class.forName() 과 DriverManager  (0) 2011.08.31
org.apache.commons.lang.StringEscapeUtils  (0) 2011.08.25
posted by 암초보
2011. 9. 17. 22:58 프로그래밍/Refactoring

alt+shift+t
posted by 암초보
2011. 9. 17. 18:21 프로그래밍/Refactoring

명사 : 소프트웨어를 보다 쉽게 이해할 수 있고, 적은 비용으로 수정할 수 있도록 내부 구조를 변경하는 것
동사 : 일련의 리팩토링을 적용하여 겉으로 보이는 동작의 변화 없이 소프트웨어의 구조를 바꾸다.
posted by 암초보
2011. 9. 17. 18:16 프로그래밍/Refactoring

"컴퓨터가 이해할 수 있는 코드는 어느 바보나 다 짤 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다"
posted by 암초보
2011. 9. 17. 18:14 프로그래밍/Refactoring

리팩토링 할 부분의 코드에 대한 견고한 테스트 세트를 만는 것

'프로그래밍 > Refactoring' 카테고리의 다른 글

리팩토링으로 해결될 수 있는 문제가 있다는 징후  (0) 2011.09.18
이클립스 리팩토링 단축키  (0) 2011.09.17
리팩토링이란?  (0) 2011.09.17
코드를 짤 때는..  (0) 2011.09.17
리팩토링은 언제?  (0) 2011.09.17
posted by 암초보