오브젝트
9. 유연한설계
hun_dev
2025. 2. 4. 19:55
8장내용과 겹친다. DiscountPolicy를 추상화해서 Moive가 어떤 할인 정책을 사용할지 런타임에 정해주기.
확장에는 열려있고 수정에는 닫혀있음 (개방 폐쇄 원칙)
public class Movie {
private String title;
private Duration runningTime;
private Money fee;
private DiscountPolicy discountPolicy;
public Movie(String title, Duration runningTime, Money fee, DiscountPolicy discountPolicy) {
this.title = title;
this.runningTime = runningTime;
this.fee = fee;
this.discountPolicy = discountPolicy;
}
Client 클래스에서 movie를 생성하고 사용했다면, Factory라는 클래스를 따로 만들어서 Client는 사용만 하기(책임 분리)
public class Factory {
public Movie createAvatarMovie() {
return new Movie("아바타",
Duration.ofMinutes(120),
Money.wons(10000),
new AmountDiscountPolicy(
Money.wons(800),
new SequenceCondition(1),
new SequenceCondition(10)));
}
}
public class Client {
private Factory factory;
public Client(Factory factory) {
this.factory = factory;
}
public Money getAvatarFee() {
Movie avatar = factory.createAvatarMovie();
return avatar.getFee();
}
}
의존성 주입방법?
생성자 주입방법, setter 주입방법, 메서드 주입방법이 있음
생성자와 setter는 알꺼고 메서드 주입 방법은 함수에서 필요한 인스턴스를 만들어서 인자로 넣어주는거
return new Movie("아바타",
Duration.ofMinutes(120),
Money.wons(10000),
new AmountDiscountPolicy(
Money.wons(800),
new SequenceCondition(1),
new SequenceCondition(10)));
좋은설계?
인터페이스, 추상 클래스 만들어서 변경에 유연하게 설계하는거도 좋다.
하지만, 책에서는 인터페이스를 너무~ 많이 만들어서 추상화하지마라. 라고 한다.
예를들자면, 모든 필드를 인터페이스로 만들어버린다면? 너무 추상화되어 코드가 명확해지지 않을 것 같다....
또한, 객체를 성급하게 만들려고 하지말고, 책임과 협력을 중심으로 설계하고 객체를 만들어라!