지금 기분
할인 유형은 '할인 유형인 것'만 공통점이고, 구체적인 내용이 너무 다르다... 조건도, 할인금액도, 적용 로직도 다르다. 이걸 어떻게 일반화해야 할까? 가 큰 고민이었다.
공통적인 로직은, 예약 정보(예약날짜, 주문, 총 금액)를 토대로 특정 조건을 확인해 특정 할인 내용을 적용한다는 것이다. 일단 거기서 시작해보기로 했다.
원래는 로또 미션에서 했던 것처럼 각 혜택 항목을 객체로 만들어 배열에 담아서 상수화하고, 사용할 때는 이걸 불러와서 반복을 걸어 모든 할인을 적용시키는 식으로 하고싶었다. 근데 로또와는 다르게 할인 조건의 확인과 할인 적용 로직이 너무 판이하게 달라서 그런 식으로는 하기 힘들겠다 싶었다.
Benefit 추상 클래스를 만들고, 이를 상속해서 각각의 혜택 항목을 서브클래스로 구현했다.
공통점은 apply 메서드를 실행하면 조건을 확인, 할인내용을 적용한 결과를 반환한다 는 것이다.
한 가지 더 어려웠던 건, 증정 혜택의 처리였다. 증정 혜택은 다른 혜택과 다르게, 직접적으로 금액을 할인하는 게 아니라 증정품을 줌으로써 그 가격만큼 혜택을 주는 것이다. 여기서 두 가지 문제가 생겼다.
${name} ${count}개
와 같이 출력용 문자열을 던지게 만들었는데, 이러고 보니 출력 로직이 모델에 있네? 라는 생각이 들어서 결국엔 {this.#name, this.#count}를 반환하도록 수정했다.