애자일 소프트웨어 개발 선언 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 위반