더북(TheBook)

이 단계에서는 더 이상 신용 카드 지급이 어떻게 이뤄지는지를 신경 쓰지 않는다. 이로 인해 애플리케이션을 작성하는 방법을 더 자유롭게 선택할 수 있다. 지급을 즉시 처리할 수도 있고, 나중에 처리하기 위해 저장해 둘 수도 있다. 심지어는 같은 카드를 사용하는 여러 지급을 저장했다가 한꺼번에 한 연산으로 처리할 수도 있다. 한꺼번에 처리하면 신용 카드 서비스에 대한 은행 수수료를 최소화함으로써 돈을 아낄 수 있다.

예제 1-3에 있는 combine 함수는 여러 지급을 하나로 묶어준다. 신용 카드가 서로 같지 않다면 combine이 예외를 던진다. 이렇게 예외를 던진다고 해도 안전한 프로그램은 예외를 던지지 않는다고 말했던 내용과 모순되는 것은 아니다. 여기서 서로 다른 두 신용 카드의 지급을 하나로 묶는 것은 버그로 간주해야 하므로 애플리케이션을 중단시켜야 한다(이런 상황을 예외로 던지지 않고 어떻게 처리할 수 있는지는 7장에서 배운다).

예제 1-3 여러 지급을 하나로 묶기

class Payment(val creditCard: CreditCard, val amount: Int) {
    fun combine(payment: Payment): Payment =
        if (creditCard == payment.creditCard)
            Payment(creditCard, amount + payment.amount)
        else
            throw IllegalStateException("Cards don't match.")
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.