객체 지향 원리 적용

황준하·2023년 7월 13일

Spring 기본

목록 보기
14/38
post-thumbnail

새로운 할인 정책 개발

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

RateDiscountPolicy.java

package hello.core.dicount;

import hello.core.Member.Grade;
import hello.core.Member.Member;

public class RateDiscountPolicy implements DiscountPolicy{

    private int discountPercent = 10;

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

RateDiscountPolicyTest.java

package hello.core.dicount;

import hello.core.Member.Grade;
import hello.core.Member.Member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.*;

class RateDiscountPolicyTest {

    RateDiscountPolicy discountPolicy = new RateDiscountPolicy();

    @Test
    @DisplayName("VIP는 10% 할인이 적용되어야 한다")
    void vip_o() {
        //given
        Member member = new Member(1L, "memberVIP", Grade.VIP);
        //when
        int discount = discountPolicy.discount(member, 10000);
        //then
        assertThat(discount).isEqualTo(1000);

    }

    @Test
    @DisplayName("VIP가 아니면 할인이 적용되지 않아야 한다")
    void vip_x() {
        //given
        Member member = new Member(1L, "memberBASIC", Grade.BASIC);
        //when
        int discount = discountPolicy.discount(member, 10000);
        //then
        assertThat(discount).isEqualTo(0);
    }
}

할인 정책을 애플리케이션에 적용

OrderServiceImpl.java

//private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
private final DiscountPolicy discountPolicy = new RateDiscountPolicy();

할인 정책을 변경하려면 클라이언트인 'OrderServiceImpl' 코드를 고쳐야 한다.

기능을 확장해서 변경하면 기존 코드에 영향을 준다. \=> OCP 위반

인터페이스 뿐만 아니라 구체 클래스도 함께 의존하고 있다. \=> DIP 위반

문제 해결방법

0개의 댓글