2장. 타락한 객체
다시 한 번 일반적인 TDD 주기를 상세히 살펴보자
테스트를 작성하고, 원하는 인터페이스를 개발한다. 올바른 답을 얻기 위해 필요한 이야기에 모든 요소를 포함시켜라
실행 가능하게 만든다. 다른 무엇보다도 중요한 것은 빨리 초록 막대를 보는 것이다. 깔끔하고 단순한 해법이 보인다면 그것을 입력한다. 만약 깔끔하고 단순한 해법이 있지만 구현에 몇 분 정도 걸릴 것 같으면 일단 적어두고 원래 문제로 돌아오자.
올바르게 만든다. 이제 시스템이 작동하므로 직전에 저질렀던 죄악을 수습해야 한다. 좁고 올곧은 소프트웨어 정의의 길로 되돌와와서 중복을 제거하고 초록 막대로 되돌리자.
우리의 목적은 작동하는 깔끔한 코드를 얻는 것이다. 이 목적을 이루기 위해서는 '작동하는'에 해당하는 부분을 먼저 해결하고, '깔끔한 코드' 부분을 해결하라.
이제 할일 목록을 보자.
- 할일 목록
$5 + 10CHF = $10 (환율이 2:1로 가정)
$5 x 2 = $10
amount를 private으로 만들기
Dollar side effect?
Money 반올림?
테스트를 하나 통과했지만 이상한 점을 느낄 수 있다. 바로 Dollar에 대해 연산을 수행한 후에는 해당 Dollar의 값이 바뀌어 버린다는 점이다.
times()를 처음 호출한 이후에 five는 더 이상 5가 아니다. 그렇다면 times()에서 새 객체를 반환하게 만들면 어떨까?
Dollar.times()를 아래와 같이 수정하기 전에는 컴파일조차 되지 않는다.
컴파일은 되지만 실행되지는 않는다. 테스트를 통과하기 위해서는 올바른 금액을 갖는 새 Dollar를 반환해야 한다.

- 할일 목록
$5 + 10CHF = $10 (환율이 2:1로 가정)
$5 x 2 = $10
amount를 private으로 만들기
Dollar side effect?
Money 반올림?
1장에서는 테스트를 통과하기 위해 가짜 구현으로 시작해서 점차 실제 구현을 만들어갔다. 하지만 이번에는 올바른 구현이라고 생각한 내용을 입력한 후 테스트를 실행하였다. 운이 좋아서 테스트를 통과했고, 또 한 항목을 그어 없앨 수 있었다.
다음은 최대한 빨리 초록색을 보기 위해 취할 수 있는 세 가지 전략 중 두 가지이다.
가짜로 구현하기: 상수를 반환하게 만들고 진짜 코드를 얻을 때까지 단계적으로 상수를 변수로 바꾸어 간다.
명백한 구현 사용하기: 실제 구현을 입력한다.
모든 일이 자연스럽게 잘 진행되고 내가 뭘 입력해야 할지 알 때는 명백한 구현을 계속 더해 나가다가, 예상치 못한 빨간 막대를 만나게 되면 뒤로 한 발 물러서서 가짜로 구현하기 방법을 사용하면서 올바른 코드로 리팩토링하는 것이다.
3장에서는 삼각측량(triangulation)이라 부르는 세 번째 방법도 있지만, 일단은 지금까지 배운 것을 검토해보자.
느낌을 테스트로 변환하는 것(예제에서 Dollar객체가 부작용이 있을거라는 느낌을 하나의 Dollar 객체에 곱하기를 두 번 수행해보는 것)은 TDD의 일반적 주제이다. 이런 작업을 오래 할수록 미적 판단을 테스트로 담아내는 것에 익숙해지게 된다.