[테스트 주도 개발] 2장_타락한 객체

TDD 주기는 다음과 같다.

  1. 테스트를 작성한다.
  2. 실행가능하게 만든다.
  3. 올바르게 만든다. (중복 제거)

“작동하는 깔끔한 코드” 를 얻어야한다는 전체 문제 중에서, “작동하는” 에 해당하는 부분을 먼저 해결해라.
테스트를 하나 통과했지만, Dollar 에 대한 연산을 수행한 후에 해당 Dollar 의 값이 바뀌는 것이 이상하다.

1
2
3
4
5
6
7
void testMultiplication() {
Dollar product = new Dollar(5);
product.times(2);
assertEquals(10, product.amount);
product.times(3);
assertEquals(15, product.amount);
}

times() 를 처음 호출한 이후에 product 는 더이상 5가 아니다. times() 가 새로운 객체를 반환하면 어떨까 ?

1
2
3
4
5
6
7
void testMultiplication() {
Dollar five = new Dollar(5);
Dollar product = five.times(2);
assertEquals(10, product.amount);
product = five.times(3);
assertEquals(15, product.amount);
}
1
2
3
4
5
6
7
8
9
10
11
12
class Dollar {
int amount;

Dollar(int amount) {
this.amount = amount;
}

Dollar times(int multiplier) {
amount *= multiplier;
return null;
}
}

위 코드는 컴파일되지만 실행되지 않는다. 통과를 위해서는 올바른 금액을 갖는 새 Dollar 를 반환해야한다.

1
2
3
4
5
6
7
class Dollar {
...

Dollar times(int multiplier) {
return new Dollar(amount * multiplier);
}
}

최대한 빨리 초록색을 보기 위한 방법이 있다.

  1. 가짜로 구현하기
    상수를 반환하게 만들고 진짜 코드를 얻을 때 까지 단계적으로 상수를 변수로 바꾸어간다.

  2. 명백한 구현 사용하기
    실제 구현을 입력한다.

보통 실무에서는 두 방법을 번갈아 사용한다.

  1. 모든일이 잘 진행되고 뭘 입력할지 알 때는 병백한 구현을 더해나간다.
  2. 예상치 못한 빨간 막대를 만나면 가짜로 구현하는 방법을 사용하면서 올바른 코드르 리펙토링한다.
  3. 그리고 다시 자신감을 찾으면 명백한 구현을 사용한다.

테스트 주도 개발 <켄트 벡>

Comments