코드 그라데이션

새로운 할인 정책 개발 본문

Spring/핵심 원리 구현

새로운 할인 정책 개발

완벽한 장면 2024. 1. 15. 21:36

새로운 할인 정책 개발

**새로운 할인 정책을 확장해보자.**

1) 악덕 기획자

: 서비스 오픈 직전에 할인 정책을 지금처럼 고정 금액 할인이 아니라

  좀 더 합리적인 주문 금액당 할인하는 정률% 할인으로 변경하고 싶어요

 

  예를 들어서 기존 정책은 VIP가 10000원을 주문하든 20000원을 주문하든 항상 1000원을 할인했는데,

  이번에 새로 나온 정책은 10%로 지정해두면 고객이 10000원 주문시 1000원을 할인해주고, 

  20000원 주문시에 2000원을 할인해주는 거에요!

 

2) 순진 개발자

: 제가 처음부터 고정 금액 할인은 아니라고 했잖아요.

 

1) 악덕 기획자

: 애자일 소프트웨어 개발 선언 몰라요? “계획을 따르기보다 변화에 대응하기를”

 

2) **순진 개발자**

: … (하지만 난 유연한 설계가 가능하도록 객체지향 설계 원칙을 준수했지 후후)

 

참고: 애자일 소프트웨어 개발 선언 https://agilemanifesto.org/iso/ko/manifesto.html

 

애자일 소프트웨어 개발 선언

애자일 소프트웨어 개발 선언 우리는 소프트웨어를 개발하고, 또 다른 사람의 개발을 도와주면서 소프트웨어 개발의 더 나은 방법들을 찾아가고 있다. 이 작업을 통해 우리는 다음을 가치 있게

agilemanifesto.org

 

순진 개발자가 정말 객체지향 설계 원칙을 잘 준수 했는지 확인해보자. 

이번에는 주문한 금액의 %를 할인해주는 새로운 정률 할인 정책을 추가한다.

 


 

RateDiscountPolicy 추가

 

RateDiscountPolicy 코드 작성

package inflearn.spring_core.discount;

import inflearn.spring_core.member.Grade;
import inflearn.spring_core.member.Member;

public class RateDiscountPolicy implements DiscountPolicy {

    private int discountPercent = 10; // 할인율 10%


    @Override
    public int discount(Member member, int price) {
        if (member.getGrade() == Grade.VIP) {
            return price * discountPercent / 100; // 10퍼센트
        } else {
            return 0;
        }
    }
}

 

 

RateDiscountPolicy 테스트 추가

package inflearn.spring_core.discount;

import inflearn.spring_core.member.Grade;
import inflearn.spring_core.member.Member;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;

class RateDiscountPolicyTest {

    RateDiscountPolicy discountPolicy = new RateDiscountPolicy();

    @DisplayName("VIP는 10% 할인 적용")
    @Test
    void discount_yes() {
        //given
        Member member = new Member(1L, "vip", Grade.VIP);

        //when
        int discount = discountPolicy.discount(member, 10000);

        //then
        assertThat(discount).isEqualTo(1000); // 10% 할인되는지를 확인
    }


    @DisplayName("VIP 아닌 자는 10% 할인 미적용")
    @Test
    void discount_no() {
        //given
        Member member = new Member(2L, "basic", Grade.BASIC);

        //when
        int discount = discountPolicy.discount(member, 10000);

        //then
        assertThat(discount).isEqualTo(0);
    }
}

 

테스트 실행 결과

 

문제 없다!

728x90
Comments