1. 개방 - 폐쇄 원칙

OCP 개방 폐쇄 원칙

  1. 확장에 열려 있다.
    1. 애플리케이션의 요구사항이 변경될 때 이 변경에 맞게 새로운 동작을 추가해서 애플리케이션의 기능을 확장할 수 있다
  2. 수정에 닫혀 있다
    1. 기존의 코드를 수정하지 않고도 애플리케이션의 동작을 추가하거나 변경할 수 있다.

컴파일타임 의존성을 고정시키고 런타임 의존성을 변경하라. 그러기 위해 추상화에 의존하라

2. 생성 사용 분리

Factory 추가하기

기존에 clent는 movie를 생성하면서 사용하였다.

public class Client {
  public Money getAvatarFee() {
    Movie avatar = new Movie("아바타", Duration.ofMinutes(120), Money.wons(10000), new AmountDiscountPolicy());
    return avartar.getFee();
  }
}

객체 생성과 관련된 책임만 전담하는 별도의 객체를 추가하고 Client는 이 객체를 사용하도록 만들 수 있다.

public class Factory {
  public Movie createAvartarMovie() {
    return new Movie("아바타", Duration.ofMinutes(120), Money.wons(10000), new AmountDiscountPolicy());
  }
}
public class Client {
  
  private Factory factory;
  
  public Client(Factory factory) {
    this.factory = factory;
  }
  
  public Money getAvatarFee() {
    Movie avatar = factory.createAvartarMovie();
    return avartar.getFee();
  }
}

순수한 가공물에게 책임 할당하기

어떤 행동을 추가하려고 하는데 이 행동을 책임질 마땅한 도메인 개면이 존재하지 않는다면 PURE FABRICATION을 추가하고 이 객체에게 책임을 할당하라.

3. 의존성 주입

  1. 생성자 주입
    1. 생성자의 인자 값으로 인스턴스를 전달
  2. setter 주입
    1. setter 메서드를 통해서 인스턴스 전달
  3. 메서드 주입
    1. 메서드 인자 값으로 인스턴스 전달

숨겨진 의존성은 나쁘다