Expression.plus 를 끝내려면, Sum.plus() 를 구현해야한다. 그리고, Expression.times() 를 구현하면 끝난다. 다음은 Sum.plus() 테스트다.
1 2 3 4 5 6 7 8 9 10 11
| @Test void testSumPlusMoney() { Expression fiveBucks = Money.dollar(5); Expression tenFrancs = Money.franc(10); Bank bank = new Bank(); bank.addRate("CHF", "USD", 2); Expression sum = new Sum(fiveBucks, tenFrancs).plus(fiveBucks); Money result = bank.reduce(sum, "USD"); assertEquals(Money.dollar(15), result);
}
|
테스트가 코드보다 더 길다. 그리고 코드는 Money 의 코드와 똑같다.
1 2 3 4 5
| @Override public Expression plus(Expression addend) { return new Sum(this, addend); }
|
일단, Sum.times() 가 작동하게 된다면, Expression.times() 를 선언하는 일은 쉽다. 테스트는,
1 2 3 4 5 6 7 8 9 10
| @Test void testSumTimes(){ Expression fiveBucks = Money.dollar(5); Expression tenFrancs = Money.franc(10); Bank bank = new Bank(); bank.addRate("CHF", "USD", 2); Expression sum = new Sum(fiveBucks, tenFrancs).times(2); Money result = bank.reduce(sum, "USD"); assertEquals(Money.dollar(20), result); }
|
1 2 3 4 5 6
| Expression times(int multiplier) { return new Sum( augend.times(multiplier), addend.times(multiplier) ); }
|
이제 컴파일되게 만들려면, Expression 에 times() 를 선언해야한다.
1 2 3 4 5 6 7
| interface Expression { Money reduce(Bank bank, String to);
Expression plus(Expression addend);
Expression times(int multiplier); }
|
위 작업 때문에, Money.times() 와 Sum.times() 의 가시성을 높여야한다.
1 2 3 4
| public Money times(int multiplier) { return new Money(amount * multiplier, currency); }
|
1 2 3 4 5 6
| public Expression times(int multiplier) { return new Sum( augend.times(multiplier), addend.times(multiplier) ); }
|
테스트가 통과한다.
테스트 주도 개발 <켄트 벡>