좋은 객체 지향 프로그래밍은 "다형성"을 만족시킨다.
운전자-자동차로 보는 다형성: 자동차가 바뀌어도 운전자는 바뀔 필요가 없다.(역할과 구현으로 세상을 구분)
역할과 구현을 분리: 역할과 구현으로 구분하면 세상이 단순해지고, 유연해지며, 변경도 편리해진다.
객체를 설계할 때 역할과 구현을 명확히 분리(역할=인터페이스, 구현=인터페이스를 구현한 클래스, 구현 객체)
객체 설계시 역할(인터페이스)을 먼저 부여하고, 그 역할을 수행하는 구현 객체 만들기
package hello.core.member;
public class MemberServiceImpl implements MemberService{
//의존 관계가 구현까지 발생함(DIP에 어긋남)
private final MemberRepository memberRepository = new MemoryMemberRepository();
@Override
public void join(Member member) {
memberRepository.save(member);
}
@Override
public Member findMember(Long memberId) {
return memberRepository.findById(memberId);
}
}
package hello.core.order;
import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
import hello.core.member.Member;
import hello.core.member.MemberRepository;
import hello.core.member.MemoryMemberRepository;
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository = new MemoryMemberRepository();
private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
@Override
public Order createOrder(Long memberId, String itemName, int itemPrice) {
Member member = memberRepository.findById(memberId);
int discountPrice = discountPolicy.discount(member, itemPrice);
//DIP 에 따라 잘 설계되었다.
return new Order(memberId, itemName, itemPrice, discountPrice);
}
}