기존 코드의 문제점
•
출력 형식이 달라지면, 비슷한 형식의 statement 코드를 똑같이 붙여 넣어야한다.
•
statement를 결국 계산하기 위해서 필요한 연산들이 캡슐화되어있지 않다.
•
이의 연장선으로 요금 종류가 추가되거나, 계산 방식이 바뀌었을 때, 캡슐화되어있지 않아 변화가 전파된다.
개선 방향
•
연산을 일단 캡슐화하는 방향으로 진행하자.
•
가격 계산은 Movie의 종류에 따라 달라진다. 따라서 Price라는 클래스를 이용해 switch문을 없애자. frequentRenterPoint도 마찬가지
•
가격을 계산하려면 몇 일 걸렸는지 필요하다. 이는 Rental 클래스에서 결국 넘겨줘야할 정보이다.
◦
따라서 Customer 클래스는 자신의 Rental 클래스를 호출하고, Rental 클래스는 본인의 정보와 함께 요금 계산을 위해 Movie 클래스에게 연산을 위임
•
누적 계산은 어떻게 할 거냐
◦
임시 변수를 써서 계산하지 말고, total을 구하는 질의 메서드를 사용해서 캡슐화하자.
◦
누적에 대한 정보는 Customer 자체에서 가지고 있는 것이 맞다.
책의 리팩토링 방향
•
statement 메서드의 switch 문을 메서드 추출
•
추출된 메서드가 적절한 위치에 있지 않음(본인의 정보를 이용하지 않기에) → Rental 클래스로 이동
•
임시 변수들 없애기 → 임시 변수가 많으면 불필요하게 ㅁ낳은 매개변수를 전달하는 문제가 생김
•
total 정보를 구하기 위핸 질의 메서드를 작성(임시 변수를 메서드 호출로 전환)
•
Rental 의 switch 문의 인자가 본인의 정보가 아니므로, 본인의 정보를 사용하여 계산하도록, Movie로 이동.
•
조건문을 재정의로 교체 → State 패턴