Project: BurgerQueen (5)

SJW·2023년 6월 26일
0

할인 기능

  • 고정할인: (1) 코드스테이츠 수강생에게 10% 할인 , (2) 20세 미만 청소년에게 500원 할인
    (10% 할인 → 고정 비율 할인을 구현),( 500원 할인 → 고정 금액 할인을 구현),( 코드스테이츠 수강생, 20세 미만 청소년 → 특정 할인 조건이 부합되는 경우에만 할인을 적용)
  • 상시 또는 불특한 할인 이벤트를 진행할 수 있어야 한다.
    상시 또는 불특한 할인 이벤트를 진행 → 객체지향 원리를 도입하여 설계함으로써, 변화에 유연하게 대응할 수 있도록 해야 할 것

할인 정책

  • 고정 비율 할인 : FixedRateDiscountPolicy 클래스
  • 고정 비용 할인 : FixedAmountDiscountPolicy 클래스

할인 조건

  • 코드스테이츠 수강생 할인 : CozDiscountCondition 클래스
  • 청소년 할인 : KidDiscountCondition 클래스

객체지향적인 설계

  • 객체지향적이지 않은 코드를 작성
  • 그 다음 리팩토링

1.할인 정책 구현

할인 정책으로 고정 비율 할인과 고정 비용 할인을 구현하여야 한다. burgerqueen 패키지 내에 discount 패키지를 만들고, 그 안에 discountPoicy 패키지를 만들어두고 나서, 고정 비율 할인 먼저 구현.

1-1. FixedRateDiscountPolicy

1-2. FixedAmountDiscountPolicy

2. 할인 조건 구현

1.할인 조건 검사 : 사용자가 할인 조건에 부합하는지 검사하고, 조건 부합 여부를 저장할 수 있어야 한다.
2.할인 정책 결정 : 할인 조건에 따라 적용할 할인 정책을 지정할 수 있어야 한다.

즉,
할인 조건 검사를 위한 메서드가 각 할인 조건마다 필요하며,
할인 조건 검사의 결과(==사용자가 할인 조건에 부합하는지의 여부)를 저장할 수 있어야 하며,
해당 할인 조건에 부합하는 경우, 어떤 할인 정책을 적용시킬 것인지 지정해주어야 하며,
할인을 적용한 가격을 계산해서 사용자에게 보여줄 수 있어야 한다.

위에서 언급한 4가지는 각각 아래의 필드와 메서드로 지정할 수 있다.

할인 조건 검사 → checkDiscountCondition() 메서드
할인 조건 검사 결과 → isSatisfied 필드
적용시킬 할인 정책 → fixedRateDiscountPolicy / fixedAmountDiscountPolicy 필드
할인 적용 → applyDiscount() 메서드

먼저, discount 패키지 내에 discountCondition 패키지를 만들고, 그 안에서 코드스테이츠 수강생 할인 조건(CozDiscountCondition)과 청소년 할인 조건(KidDiscountCondition)을 클래스로 만들어야 한다.

2-1. CozDiscountCondition

2-1-1.checkDiscountCondition()&isSatisfied

할인을 적용하기 위해서는 먼저 할인 조건에 부합하는지를 검사해야 하며, 부합 여부를 isSatisfied의 값으로 저장해 줄 수 있어야 한다. 요구 사항에서는 아래와 같이 코드스테이츠 수강생인지 물어봄으로써 할인 조건을 검사하고 있다.

위의 빨간 박스 내의 기능을 다시 한번 정리해 보자면
할인 조건에 부합하는지의 여부를 물어보는 문장을 출력해야 한다.
사용자가 입력한 값에 따라 isSatisfied의 값을 적절히 바꿔주어야 한다.

checkDiscountCondition() 메서드를 정의하자

Setter의 접근 제어자가 public일 이유가 없다. 왜냐하면 할인 조건 검사는 철저히 CozDiscountCondition 내부에서 일어나는 동작이기 때문에, 외부에서 Setter를 통해 isSatisfied를 변경할 일이 없도록 해야 하기 때문이다.

객체 내부의 세부 동작을 외부로부터 감추기 위해, 즉 캡슐화를 위해 Setter의 접근 제어자를 private으로 변경

2-1-2. fixedRateDiscountPolicy

  • 코드스테이츠 수강생 → 고정 비율 할인
  • 청소년 → 고정 금액 할인
    할인 정책은 할인 조건에 종속되어야만 한다. 다시 말해, 할인 조건을 구현하는 클래스에 할인 정책을 필드로 정의해야 한다.
    요구 사항에 맞게 아래와 같이 CozDiscountCondition에 맞는 할인 정책인 fixedRateDiscountPolicy를 필드로 정의해 주고, 10퍼센트 할인을 의미하는 10을 인자로 전달하면서 FixedRateDiscountPolicy를 인스턴스화하여 할당한다.

2-1-3. applyDiscount()

applyDiscount()는 할인 정책을 적용하여 실제 할인 금액을 리턴해주는 메서드이다.

2-2. KidDiscountCondition

KidDiscountCondition은 앞서 작성한 CozDiscountCondition와 크게 다르지 않다.

할인 기능 적용

할인 기능은 주문하기를 눌렀을 때 적용되어야 한다. 따라서, 할인 조건을 묻고, 할인을 적용해 주는 메서드인 checkDiscountCondition()과 applyDiscount()는 Order에서 호출해주어야 한다.

0개의 댓글