일반적인 TDD 주기
우리의 목적은
작동하는 깔끔한 코드를 얻는 것이다.
나같은 나부랭이 프로그래머에게는 너무너무 어렵지만 쉬운 말이다...
하지만 방법은 있다.
나누어서 정복하자(divide and conquer)
'작동하는' 이라는 부분을 먼저 해결하고
'깔끔한 코드' 부분을 해결하는 것이다.
$5 + 10 CHF = $10(환율이 2:1일 경우)
$5 X 2 = $10
amount를 private으로 만들기
Dollar 부작용(side effect)?
Money 반올림
앞서 살펴본 테스트를 통과했지만 뭔가 이상하다.
바로 Dollar에 대해 연산을 수행한 후에 해당 Dollar의 값이 바뀌는 점이다.
@Test
public void testMultiplication(){
Dollar five = new Dollar(5);
five.times(2);
assertEquals(10, five.amount);
five.times(3);
assertEquals(15,five.amount);
}
다시 공포의 빨간 막대...
그렇다면 times()에서 새로운 객체를 반환하게 하면 어떨까?
이렇게 되면 Dollar의 인터페이스를 수정해야 하고 그러기 위해서는 테스트도 수정해야 한다.
@Test
public void testMultiplication(){
Dollar five = new Dollar(5);
Dollar product = five.times(2);
assertEquals(10, product.amount);
product = five.times(3);
assertEquals(15,product.amount);
}
Dollar.times()를 아래와 같이 수정하면 그제서야 테스트가 돌아갈것이다.
근데 이제 NullpointException 을 곁들인
public Dollar times(int multiplier) {
this.amount *= multiplier;
return null;
}
자! 올바른 Dollar 객체를 반환시켜보자
public Dollar times(int multiplier) {
return new Dollar(amount * multiplier);
}
$5 + 10 CHF = $10(환율이 2:1일 경우)
$5 X 2 = $10
amount를 private으로 만들기
Dollar 부작용(side effect)?
Money 반올림
드디어..
기분이 좋아졌다
일단 지금까지 배운것을 검토해보자.
일단 올바른 행위에 대해 결정을 내린 후에 그 행위를 얻어낼 수 있는 최상의 방법에 대해 이야기할 수 있다.