[리팩토링] 첫번째 기록

잡담에 대충 쓰긴 했으니 바로 본론!

100번 보는 것보다.. 한번 쳐보자~!

코드 내용을 그대로 다 올리면… 저작권에 문제가 될 것 같으니…

주요 내용 위주로 입력할 예정..

//비디오 종류별 대여료 계산
switch (each.getMovie().getPriceCode()) {
case Movie.REGULAR:
thisAmount += 2;
if (each.getDaysRented() > 2) {
thisAmount += (each.getDaysRented() – 2) * 1.5;
}
break;
case Movie.NEW_RELEASE:
thisAmount += each.getDaysRented() * 3;
break;
case Movie.CHILDRENS:
thisAmount += 1.5;
if (each.getDaysRented() > 3) {
thisAmount += (each.getDaysRented() – 3) * 1.5;
}
break;
}

statement() 내에 온갖 함수가 다 있는데 그 중에 상단에 위치한 코드를 우선 method로 분리하는 것이 1차 목표이다.

이 부분은 실무에서도 자주 마주하는 경우인데… switch 뿐 아니라 if문 / for 문 다양하게 적용 되는 것 같다.

그래도 어느정도 익숙해져서 초기 개발할 때에도 위와 같은 경우에는 미리 method로 분리해서 작업하게 된 것 같다.

책에 있는 예시를 보기 전 내 코드를 먼저 입력해보기로 한다.

어차피 위 내용이 거의 그대로 복사&붙여넣기 될 것 같긴하지만…
(바보 같이 편집기에서 치고 앉아 있었다..-_- 들여쓰기를 일일히 하려니 귀찮아..
라는 생각이 들 때쯤… 왜 이렇고 있나 싶어서 얼른 Intellij 로 이동..)

//switch 문 내용이 대여료를 구하는 것이므로.. method 명을 비슷하게 한다.
public String getAmout(int priceCode){
….
}

위와 같이 하고보니… 앗.. switch 안에..
each.getDaysRented() 와 같이 렌탈 기간도 사용하고 있는 걸 발견..
해서… 넘겨주는 paramter를 Rental 객체로 변경..


//비디오 종류별 대여료 계산
thisAmount = getPrice(each);


//각 비디오의 대여료를 계산
public double getPrice(Rental each){
int priceCode = each.getMovie().getPriceCode();
double thisAmount = 0;
switch (priceCode) {
case Movie.REGULAR:
thisAmount += 2;
if (each.getDaysRented() > 2) {
thisAmount += (each.getDaysRented() – 2) * 1.5;
}
break;
case Movie.NEW_RELEASE:
thisAmount += each.getDaysRented() * 3;
break;
case Movie.CHILDRENS:
thisAmount += 1.5;
if (each.getDaysRented() > 3) {
thisAmount += (each.getDaysRented() – 3) * 1.5;
}
break;
}
return thisAmount;
}

일단 심플하게 위 처럼 변환처리 했다…
Rental 객체인 each 대신 어차피 값이 2개(priceCode / daysRented) 만 넘겨도 될 것 같으나…
내 생각에는 확장성을 고려하면 Rental 객체인 each를 넘기는 것이 맞는 것 같다.
예를 들어 대여료의 조건이 추가 되거나 하는 경우라던가…?

개발에 정답은 없어서 좋기도 하지만 한편으로 이게 맞나..(?) 라는 생각도 드는 것도 사실인지라…
책과 한번 비교를… 해보자.

private int amountFor(Rental each){
int thisAmount = 0;
switch (each.getMovie().getPriceCode()) {
case Movie.REGULAR:
thisAmount += 2;
if (each.getDaysRented() > 2) {
thisAmount += (each.getDaysRented() – 2) * 1.5;
}
break;
case Movie.NEW_RELEASE:
thisAmount += each.getDaysRented() * 3;
break;
case Movie.CHILDRENS:
thisAmount += 1.5;
if (each.getDaysRented() > 3) {
thisAmount += (each.getDaysRented() – 3) * 1.5;
}
break;
}
return thisAmount;
}

책에서는 위와 같이 1차적으로 변경하였다가 컴파일 시 오류가 발생하여
amountFor 의 return 값을 double 로 변경하였다고 한다.

나도 위와 같은 실수를 할 뻔했는데…
(내가 Rental객체를 설계한게 아니기 때문…)
그래서 해당 객체 내부를 살펴보고 return 값을 정하였기 때문에 책과 같은 실수를 하지는 않았다.

1 글이 마음에 드셨다면 하트 꾸욱~!