BooK Plus2008.02.15 12:49

출처 : 리팩토링 ( 저자 : 마틴 파울러  / 윤성준 . 조재박 옮김)

---------------------------------------------------------------------------------------------------
메소드 정리 - > Extract Method

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

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

void printOwing(double amount){
printBanner();
printDetails(amount);
}

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


☆ 동기

Extract Method는 내가 가장 자주 사용하는 리팩토링 가운데 하나이다. 나는 지나치게 긴 메소드를 보거나, 목적을 이해하기 위해서 주석이 필요한 코드를 보면 그 부분을 하나의 메소드로 뽑아낸다 .
나는 다음과 같은 이유료 짧고, 이해하기 쉬운 이름으로 된 메소드를 좋아한다. 첫째, 메소드가 잘게 쪼개져 있을 때 다른 메소드에서 사용될 확률이 높아진다. 둘째, 고수준의 메소드를 볼 때 이련의 주석을 읽는 것 같은 느김이 들도록 할 수 있다. 또한, 메소드가 잘게 쪼개져 있을 때 오버라이드 하는 것도 훨씬 쉽다. 만약 큰 메소드에 익수해져 있다면 메소드를 잘게 쪼개는 것에 익숙해지는 데는 약간 시간이 걸릴 것이다. 작은 메소드는 실제로 이름을 잘 지었을 때문 그 진가가 드러나므로, 이름을 지을 때 주의해야 한다.
사람들은 때때로 나에게 한 메소드의 길이가 어느 종도 되ㅇ야 할 지를 묻는다. 그러나 나는 길이가 중요하다고 생각 하지 않는다. 중요한것은 메소드의 이름과 메소드 몸체의 의미적 차이다. 뽑아내는 것이 코드를 더욱 명확하게 하며느 새로 만든 메소드의 이름이 원래 코드의 길이보다 길어져도 뽑아낸다.

☆ 절차
 - 메소드를 새로 만들고 , 의도를 잘 나타낼 수 잇도록 이름을 정한다(어떻게 하는지를 나타내는 방식으로 이름을 정하지 말고, 무엇을 하는지를 나타내게 이름을 정한다).
 ->  뽑아내고자 하는 부분이 한줄의 메시지나 함수 호출과 같이 아주 간단한 경우에는 새로운 메소드의 이름이 그 코드의 의도를 더 잘 나타낼수 있을 때만 뽑아낸다. 더 이해하기 쉬운 이름을 지을 수 없다면 코드를 뽑아내지 않는 것이 낮다.
- 원래 메소드에서 뽑아내고자 하는 부분의 코드를 복사하여 새 메소드로 옮긴다.
- 원래 메소드에서 사용되고 있는 지역변수가 뽑아낸 코드에 있는지 확인한다. 이런 지역변수는 새로운 메소드의 지역변수나 파라미터가 된다.
- 뽑아낸 코드내에서만 사용되는 임시변수가 있는지 본다. 있다면 새로 만든 메소드의 임수변수로 선언한다.
- 뽑아낸 코드내에서 지역변수의 값이 수정되는지 본다. 만약 하나의 지역변수만 수정된 다면, 뽑아낸 코드의 질의를 보고ㅡ 주정된 결과를 관련된 변수에 대입할 수 있는지 본다. 이렇게 하는 것이 이상하거나, 값이 수정되는 지역변수가 두개 이상있다면 쉽게 메소드로  추출할 수 없는 경우이다. 이럴때는 split Temporart Variable(155)을 사용한 다음 다시 시도해야 한다. 임시변수는 Replace Temp with Quert(147)로 제거할 수 잇다.(예제에서 토의된 내용 참조).
- 뽑아낸 코드에서 읽기만 하는 변수는 새 메소드의 파라미터로 넘긴다.
- 지역변수와 관련되 사항을 다룬 후에는 컴파일을 한다.
- 원래 메소드에서 뽑아낸 코드 부분은 새로 만든 메소드를 호출하도록 바꾼다.
 => 새로 만든 메소드로 옮긴 임시 변수가 잇는 경우 그 임시변수가 원래 메소드의 밖에서 선언되었는지를 확인한다. 만약 그렇다면 새로 만들 메소드에서는 선언을 해줄 필요가 없다.
- 컴파일과 테스트를 한다.

---------------------------------------------------------------------------------------------------

extract method 는 이클립스에서도 자동으로 지원 되는 리펙토링중 하나이다. 그만큼 많이 쓰인다는건가;?
저자가 말한것 처럼 가장 많이 사용하는 리팩토링 가운데 하나라고 하는것 처럼..

음냥;; 나도 뭐 저자를 따라하려고 많이 노력하고 있는데..
참.. 그게 새로운 메소드를 이름으로 짓는다는것이 어렵던지... ;; 쩝;;

영어에 약한 사람은... 힘들어요;;

무튼... 이 리팩토링을 사용하면.. 코드가 좀더 깔끔해 보인다.
분산을 시켜서 그런지;;
뭐 단점은... 보려면.. 여기 봤다가 저기 봤다가 해야 하니;;ㅋ
그래도.. 저자 말대로 이름을 잘지으면... 중간에 새로 뽑아낸 메소드도 그냥 단순히 코드의 한줄로 읽을 수
있지 않을까 하는 생각입니다~~~~

Posted by is윤군

댓글을 달아 주세요