할일 목록
$5 + 10 CHF = $10 (환율이 2:1인 경우)
$5 + $5 = $10
$5 + $5에서 Money 반환하기
Bank.reduce(Money)
Money에 대한 통화 변환을 수행하는 Reduce
Reduce(Bank, String)
저번에 완벽하게 구현하지 않은 reduce() 구현을 마무리할 차례다.
저번 시간에는 환율 개념을 도입하지 않았으므로 이번 시간에는 이를 구현한다.
즉, 은행(Bank)에 환율(rate)을 입력하고(addRate()), 돈을 넣어서 원하는 통화로 변환(reduce())한다.
이 문장을 그대로 위와 같이 테스트코드로 작성한다.
이 때 문제는 2가 여전히 테스트코드와 클라이언트 코드 두 곳에서 반복된다는 것.
또한 이렇게 되면 기존 rate(환율) 수정이 어려울 뿐만 아니라 다른 통화 간의 환율을 추가하기 위해 분기문을 추가해야 한다는 단점도 존재합니다.
때문에 이러한 문제들을 해결하고자 Bank 에서 환율표를 가지고 있다가 필요할 때 찾아볼 수 있게 하기 위해 해시테이블 활용
Bank 에서 사용할 해시테이블, 즉 딕셔너리 생성. Key는 Pair
환율을 저장할 딕셔너리를 만들었으므로 환율을 설정할 수 있는 메서드도 만들어야 한다.
근데 앞에서 만들어준 테스트 케이스는 '다른 통화'에 대한 것이고, 통화가 같은 경우에 대해서는 고려하지 않았다.
따라서 통화가 같은 경우에 대한 테스트 코드를 추가해주고, 구현해준다.
이렇게 리팩토링을 하다가 문득 떠오르는 테스트 케이스가 있으면 테스트를 추가해주고 - 구현
할일 목록
$5 + 10 CHF = $10 (환율이 2:1인 경우)
$5 + $5 = $10
$5 + $5에서 Money 반환하기
Bank.reduce(Money)
Money에 대한 통화 변환을 수행하는 Reduce
Reduce(Bank, String)
환율에 대한 구현을 마침으로써 reduce 에 관한 모든 할일이 마무리 됐다.
할일 목록
$5 + 10 CHF = $10 (환율이 2:1인 경우)
$5 + $5 = $10
$5 + $5에서 Money 반환하기
Bank.reduce(Money)
Money에 대한 통화 변환을 수행하는 Reduce
Reduce(Bank, String)
드디어 최종 과제인 다른 통화를 가진 화폐 더하기 작업을 할 차례이다.
앞 장에서 했던 작업은 통화 '하나'에 환율을 적용하여 축약(reduce)한 작업이고,
이번 장에서 할 일은 서로 다른 '두 통화'에 환율을 적용하여 축약(reduce)하는 것
테스트코드부터 작성하고 돌려보면 당연히 실패한다. result 는 15달러가 된다.
plus 의 구현을 따라가보면 Sum을 통함을 알 수 있다.
Sum 에 대한 리팩토링을 진행할 차례다.
(리팩토링 전)
(리팩토링 후)
위와 같이 이전에 작업했던 reduce 를 통해 환율(rate) 를 적용한 amount 값을 얻으면 아래와 같이 테스트 코드를 정상적으로 통과시킬 수 있다.
책을 작성하면서 1부 통화 예제를 서너 번 정도 짰는데 그 때마다 생각해낸 메타포에 따라 설계가 완전히 다른 방향으로 흘렀다.
돈가방, 지갑 등 여러 메타포를 생각해봤었고 책에 나온 예제에서는 Expression(수식) 메타포를 사용했다. 이에 따라 설계가 완전히 다른 방향으로 진행됐다.
전체를 다 구현하게 아니라 절대적으로 평가할 순 없지만,
코드와 테스트 사이에는 대략 비슷한 양의 함수와 줄이 나타나게 된다.
작은 테스트를 추가한다.
모든 테스트를 실행하고, 실패하는 것을 확인한다.
코드에 변화를 준다. (컴파일, 테스트 성공하도록)
모든 테스트를 실행하고, 성공하는 것을 확인한다.
중복을 제거하기 위해 리팩토링한다.
TDD 과정동안 자연히 생기는 테스트들은 시스템의 수명이 다할 때까지 함께 유지돼야 할 만큼 확실히 유용하다.
하지만 이 테스트들이 다음과 같은 종류의 테스트들을 대체할 수 있을거라 예상해서는 안된다.
테스트에 대한 평가지표
전체 커버리지 수치에 대해