TIL

04 설계 품질과 트레이드 오프

01 데이터 중심의 영화 예매 시스템

데이터를 준비하자

영화를 예매하자

02 설계 트레이드 오프

캡슐화

응집도와 결합도

03 데이터 중심 영화 예매 시스템의 문제점

캡슐화 위반

public class Movie {
    private Money fee;

    public Money getFee() {
        return fee;
    }

    public void setFee(Money fee) {
        this.fee = fee;
    }
}

높은 결합도

public class ReservationAgency {
    public Reservation reserve(Screening screening, Customer customer,
                               int audienceCount) {
        // ...

        Money fee;
        if (discountable) { // 할인 적용 대상이면 금액 계산
            // ...
        }
            fee = movie.getFee().minus(discountAmount).times(audienceCount);
        } else {
            fee = movie.getFee().times(audienceCount);
        }
        // ...
    }
}

낮은 응집도

04 자율적인 객체를 향해

캡슐화를 지켜라

스스로 자신의 데이터를 책임지는 객체

public class DiscountCondition {
    // ...

    public DiscountConditionType getType() {
        return type;
    }

    // 기간 할인 조건인 경우 사용하는 메서드
    public boolean isDiscountable(DayOfWeek dayOfWeek, LocalTime time) { ... }

    // 순서 할인 조건인 경우 사용하는 메서드
    public boolean isDiscountable(int sequence) {... }
}

public class Movie 
    // ...

    // 금액 할인 정책일 때 사용하는 메서드
    public Money calculateAmountDiscountedFee(){ ... }

    // 비율 할인 정책일 때 사용하는 메서드
    public Money calculatePercentDiscountedFee() { ... }

    // 할인 조건 없을 때 사용하는 메서드
    public Money calculateNoneDiscountedFee() { ... }

    // 할인 조건 판단 메서드
    public boolean isDiscountable(LocalDateTime whenScreened, int sequence) { ... }
}

public class Screening {
    // ...

    public Money calculateFee(int audienceCount) { ... }
}

05 하지만 여전히 부족하다.

캡슐화 위반

캡슐화의 진정한 의미는 데이터 뿐만 아니라 변경될 수 있는 어떤 것이라도 감추는 것을 의미한다.

높은 결합도

낮은 응집도

06 데이터 중심 설계의 문제점