관련 높은 책임들을 할당했는지
를 나타낸다.public class Screening {
public Money calculateFee(int audienceCount) {
switch (movie.getMovieType()) {
case AMOUNT_DISCOUNT:
if (movie.isDiscountable(whenScreened, sequence) {
return movie.calculateAmountDiscountedFee().times(audienceCount);
}
break;
case PERCENT_DISCOUNT:
if (movie.isDiscountable(whenScreened, sequence)) {
return movie.calculatePercentDiscountedFee().times(audienceCount);
}
break;
case NONE_DISCOUNT:
return movie.calculateNoneDiscountedFee().times(audienceCount);
}
return movie.calculatedNoneDiscountedFee().times(audienceCount);
}
}
협력에 필요한 적절한 수준의 관계만을 유지
하는 것이 중요하다. 높은 결합도
낮은 결합도
public class Movie {
public boolean isDiscountable(LocalDateTime whenScreened, int sequence) {
for (DiscountCondition condition : discountConditions) {
if (condition.getType() == DiscountConditionType.PERIOD) {
if (condition.isDiscountable(whenScreened.getDayOfWeek(), whenScreened.toLocalTime())) {
return true;
}
} else {
if (condition.isDiscountable(sequence)) {
return true;
}
}
}
return false;
}
}
좋은 설계는 올바른 객체에게 올바른 책임을 할당하면서 낮은 결합도와 높은 응집도를 지향하는 것이다. 조금 더 단순하게 말하면, 객체가 변경되는 이유는 한 가지 뿐이어야 하며, 그 변경의 여파가 다른 객체로 전파되지 않아야 한다.
이를 효과적으로 지원해주는 방법은 바로 캡슐화
이다. 캡슐화에 대해서는 다음 포스팅에서 자세히 알아보겠다.
지금까지 내용을 간단히 정리해보면, 객체는 행위 기반의 책임을 바탕으로 설계되어야하며, 낮은 결합도와 높은 응집도를 지향하기 위해서는 단일 책임을 가져야하며 이를 지원해주는 매커니즘은 캡슐화이다.