티스토리 뷰

서론

- 이전 포스트에서 순수 Java만 사용하여 비즈니스 요구사항에 맞게 프로젝트를 설계하였다.

- 이제 새로운 할인 정책을 개발하여 프로젝트를 확장해보자.

- 이때, 객체 지향의 설계 원칙을 잘 준수했는지 확인해 보자.

 


 

1. 새로운 할인 정책 개발

- 상황 : 서비스 오픈 직전에 할인 정책에 대한 기획자의 요구사항이 변경되었다.

  • 기획자 : 고정 할인 정책(1000원)이 아니라 정률 할인 정책(10%)으로 바꿉시다!
  • 개발자 : ㅠㅠ

RateDiscountPolicy 추가

RateDiscountPolicy 구현 및 Test코드 작성

 

새로운 할인 정책을 설계했으면 이제 OrderService에서 기존에 사용하던 FixDiscountPolicy대신 RateDiscountPolicy로 대체한다.

이때, 문제점이 발견된다.

  • 분명히 역할과 구현을 충실하게 분리했다.
  • 다형성도 활용하고 인처페이스와 구현 객체를 분리했다.
  • 하지만 위의 상황에서 OCPDIP를 위반하게된다.
    • OrderService의 코드를 변경하였으며(OCP 위반) 인터페이스가 아니라 구현체에도 의존하고있다. (DIP 위반)
    • 고정 할인 정책을 적용했을때의 의존관계는 다음과 같다
      이처럼 OrderServiceImpl이 DiscountPolicy 인터페이스 뿐만 아니라 FixDiscountPolicy 구현체에도 의존하고 있다..
    • 정률 할인 정책을 적용했을때의 의존관계는 다음과 같다
    • 이처럼 RateDiscountPolicy로 바꾼다고 해도 DIP위반이며 OrderServiceImpl을 변경하므로 OCP위반인 셈이다.

 

이제 이 문제를 해결해보자.

먼저, DIP원칙을 지키려면 인터페이스에만 의존하도록 코드를 변경해야한다.

  • 구현체를 new 했던 코드를 지우자.

    12번 라인도 DIP를 위반하지만 일단 DiscountPolicy만 보자.
  • 테스트를 돌리면 당연히 NullPointerException이 발생한다.

  • 어떻게 해결해야할까?

 

해결방안

누군가 클라이언트인 OrderServiceImpl에 DiscountPolicy의 구현 객체를 대신 생성하고 주입해야 한다.

 


 

꿀팁

 - Ctrl + Shift + T 를 눌러 쉽게 테스트 클래스를 생성할 수 있다!

 

- 한글이 깨질 경우, Edit Custom VM Options 에서 마지막줄 아래에 다음의 코드 추가 후 재시작

-Dfile.encoding=UTF-8

 

- Test 코드의 Assertions는 static import 하는것이 좋다. 편리해지고 코드도 간결해 진다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함