TDD 1.0 Help

12장. 드디어, 더하기

우선 간단한 예인 $끼리의 덧셈부터 시작해보자.

@kotlin.test.Test fun testSimpleAddition() { val sum = Money.dollar(5).plus(Money.dollar(5)) assertEquals(Money.dollar(10), sum) }

위 테스트를 통과하기 위한 구현은 어떻게 구현할지가 명확하므로 바로 구현하자.

fun plus(addend: Money): Money { return Money(amount + addend.amount, currency) }

다중 통화 연산을 어떻게 표현해야 할까?

편하게 여러 환율을 표현할 수 있으면서도 산술 연산 비슷한 표현들을 여전히 산술 연산처럼 다룰 수 있는 해법이 있으면 좋을 것 같다.

해법은 Money와 비슷하게 동작하지만 사실은 두 Money의 합을 나타내는 객체를 만드는 것이다.

예를 들어 ($2 + 3CHF) x 5 같은 수식이 있다고 해보자. Money를 가장 작은 단위로 볼 수 있다. 연산의 결과로 Expression들이 생기는데, 그 중 하나는 Sum(합)이 될 것이다. 연산이 완료되면 환율을 이용해서 결과 Expression을 단일 통화로 축약할 수 있다.

테스트에 적용해보자.

@kotlin.test.Test fun testSimpleAddition() { val five = Money.dollar(5) val sum: Expression = five.plus(five) val bank = Bank() val reduced = bank.reduce(sum, "USD") assertEquals(Money.dollar(10), reduced) }
interface Expression open class Money(var amount: Int, var currency: String) : Expression { ... fun plus(addend: Money): Expression { return Money(amount + addend.amount, currency) } } open class Bank { fun reduce(source: Expression, to: String): Money? { return null } }

테스트가 성공하도록 가짜 구현을 해두자.

open class Bank { fun reduce(source: Expression, to: String): Money? { return Money.dollar(10) } }
Last modified: 31 January 2024