우리가 짠 코드를 SRP, DIP, OCP 세 가지 원칙 측면에서 살펴보자
💡 한 클래스는 하나의 책임만 가져야 한다.
AppConfig
: 구현 객체를 생성하고 연결하는 책임클라이언트 객체
: 객체를 실행하는 책임만 담당
💡 프로그래머는 추상화에 의존해야지, 구체화에 의존하면 안된다.
// AppConfig
// 의존 관계를 외부에서 생성해서 넣어준다.
public OrderService orderService(){
return new OrderServiceImp(memberRepository(), discountPolicy());
}
// OrderServiceImp
// 외부에서 넣어주기 때문에 객체는 추상화에 의존하고 있다.
public OrderServiceImp(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
OrderServiceImpl
(클라이언트 코드)는 DIP를 지키며 DiscountPolicy
추상화 인터페이스에 의존하는 것 같았지만, FixDiscountPolicy
구체화 구현 클래스에도 함께 의존하고 있었다.DiscountPolicy
추상화 인터페이스에만 의존하도록 코드를 변경한다.AppConfig
가 FixDiscountPolicy
객체 인스턴스를 클라이언트 코드 대신 생성해서 클라이언트 코드에 의존관계를 주입했다.💡 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다
FixDiscountPolicy
→ RateDiscountPolicy
로 변경해서 클라이언트 코드에 주입하므로 클라이언트 코드는 변경하지 않아도 된다.