생성한 AppConfig는 역할을 구분하기가 힘들었다.
리팩토링 전
중복을 제거하고, 역할에 따른 구현이 보이도록 리팩토링 필요!
package hello.core;
import hello.core.discount.FixDiscountPolicy;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import hello.core.member.MemoryMemberRepository;
import hello.core.order.OrderService;
import hello.core.order.OrderServiceImpl;
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(new MemoryMemberRepository());
}
public OrderService orderService() {
return new OrderServiceImpl(
new MemoryMemberRepository(),
new FixDiscountPolicy());
} }
리팩토링 후
new MemoryRepository() 부분이 중복 제거되었다. 그리고 MemberRepository 구현체를 변경할 때는 아래 17번째 줄만 변경해주면 된다!
아래의 AppConfig를 보면 역할과 구현 클래스가 한 눈에 들어온다! 애플리케이션 전체 구성이 어떻게 되어있는지 빠르게 파악할 수 있다!
package hello.core;
import hello.core.discount.FixDiscountPolicy;
import hello.core.member.MemberRepository;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import hello.core.member.MemoryMemberRepository;
import hello.core.order.OrderService;
import hello.core.order.OrderServiceImpl;
public class AppConfig{
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());//객체 생성하고 구현체 할당하는 것을 안에서 직접했었다.
}
private MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());//객체 생성하고 구현체 할당하는 것을 안에서 직접했었다.
}
private FixDiscountPolicy discountPolicy() {
return new FixDiscountPolicy();
}
}