<aside> 💡 개채 ( 클래스 / 모듈 / 함수 ... )는 확장에 대해 열려있어야 하고, 수정에 대해서는 닫혀 있어야 함
</aside>
<aside> 💡 컴파일 타임 의존성을 수정하지 않고도, 런타임 의존성을 쉽게 변경 할 수 있음
</aside>

<aside>
💡 OCP 원칙에서 가장 중요한것은, 추상화에 의존 하는것
</aside>
추상화
핵심적인 부분만 남기고, 불필요한 부분은 생략함으로써 복잡성을 극복하는 기법
문맥에 따라 변하는 부분 → 불필요한 부분
OCP원칙의 관점에서, 생략되지않고 남겨지는 부분은 다양한 상황에서 공통점을 반영한 추상화의 결과물
추상화를 통해 생략된 부분은 확장의 여지를 남김
따라서, 추상화를 통해서 OCP를 달성 할 수 있음
public abstract class DiscountPolicy {
private List<DiscountCondition> conditions = new ArrayList();
public DiacountPolicy(DiscountCondition ... conditions) {
this.conditions = Arrays.asList(conditions);
}
public Money calculateDiscountAmount(Screening screening) {
for(DiscountCondition each : conditions) {
if(each.isSatisfiedBy(Screening)){
return getDiscountedFee(screening);
}
}
return screening.getMovieFee();
}
abstract protected Money getDiscountAmount(Screening screening);
}
위 코드에서, getDiscountAmount 를 판단하는 부분은 변하는 부분이고, calculateDiscountAmount 부분은 변하지 않는 부분임
따라서 변하는 부분을 추상화를 통해 생략하여 확장의 여지를 남길 수 있음
의존
public class Movie {
...
private DiscountPolicy discountPolicy;
public Movie(String title, Duration runningTime, Money fee, DiscountPolicy discountPolicy){
...
this.discountPolicy = discountPolicy;
}
public Money calculateMovieFee(Screening screening) {
return fee.minus(dicountPolicy.calculateDiscountAmount(screening));
}
}