본문 바로가기

책읽기/TDD:ByExample

TDD_9

14장 바꾸기.

<할일>

$5 + 10CHF = $10 (1:2의 환율일 경우)
$5 + $5 = $10
$5 + $5에서 Money반환하기
//해결//Bank.reduce(Money)
//수행예정//Money에 대한 통화 변환을 수행하는 Reduce
Reduce(Bank, String)

이젠 달러 뿐만아니라 프랑을 달러로 바꾸는 과정을 진행한다.

 

 

은행에 환율을 지정하고, 프랑을 달러로 변환하고 알맞게 환전되었는지 확인하면 되겠다.

우리는 2프랑을 1달러로 바꿀 수 있는 2:1비율로 환율을 설정할 것이다.

 

컴파일 에러를 잡기위해 Bank에 addRate() 추가하고

테스트를 완료시키기 위해현재 bank의 reduce가 Money를 부르고 있으므로 Money의 reduce를 수정해본다.

 

음.. 테스트는 초록막대를 보인다.

하지만 Money보단 Bank에서 환율을 알고 있는게 맞다.

 

 

 

 

 

Bank의 reduce에서 Bank객체를 같이 매개변수로 넘겨준다.

그러면 뒤의 Expression인터페이스와 그를 상속한 클래스들의 reduce메소드에도 같은 부분을 수정해주어야 한다.

 

그렇게 되면 환율을 Bank에서 계산할 수 있고, Money에서는 올바른 환율을 Bank에게 물을 수 있다.

 

이제 환율로 환전하는 테스트를 리펙토링하였다.

하지만 아직 테스트와 코드 두 부분에서 2라는 환율을 명시적으로 표현하고 있다.

Bank에서 환율표를 가지고 있다가 필요한 때 찾아볼 수 있으면 좋을 것 같다.

 

두개의 통화와 환율을 연결시키기 위해서는 해시 테이블을 사용할 수 있을 것 같다.

 

 

통화쌍을 해시테이블의 키로 이용하기 위해 배열을 사용할 수 있을까?

답은 아니다.

equals()메소드는 배열의 주소값을 비교한다. 배열은 new로 만들 때 마다 새로운 주소로 할당되어서 만들어지므로 값은 같아도 다른 주소로 인식되어 동치성을 검사할 수 없다.

 

Pair라는 클래스이름으로 새로운 객체를 만들어 보자.

(책에서 private클래스로 선언한 것으로 봐서 Bank안의 inner class인 것으로 유추했다 .. )

hashCode()가 0을 리턴하는 것은 최악의 해시코드이다. 하지만 빠르게 테스트 할 수 있는 장점이 있다.

(hashCode()는 각 객체의 고유 해시값을 리턴하는 함수이다. 아래 블로그 참고)

m.blog.naver.com/PostView.nhn?blogId=travelmaps&logNo=220930144030&proxyReferer=https:%2F%2Fwww.google.com%2F

 

[기초부터자바] hashcode란? hashcode와 equals의 관계(1)

약 4개월전에 비교연산자 ==와 equals 메소드의 차이를 포스팅 하였습니다. 자바 처음 공부할 때, 많이 헷...

blog.naver.com

 

 

 

환율을 저장할 무언가가 필요하다.

Bank에 테이블을 만들자.

그리고 rate를 저장하는 addRate()도 만들어 보자.

 

환율을 얻어내는 rate()도 해시테이블을 이용해 값을 가져와야 한다.

그런데 테스트가 갑자기 빨간막대를 그린다.

여기서 둘이 같을 때, NullPointer예외를 일으킨다.

생각밖의 일이므로 테스트로 기록을 남겨두고 고쳐본다.

 

Bank의 rate에서 화폐가 같으면 1을 리턴하도록 수정한다.

초록막대 클리어.

 

 

<할일>

$5 + 10CHF = $10 (1:2의 환율일 경우)
//해결//$5 + $5 = $10
$5 + $5에서 Money반환하기
//해결//Bank.reduce(Money)
//해결//Money에 대한 통화 변환을 수행하는 Reduce
//해결//Reduce(Bank, String)

 

 

 

 

 

 

 

15장 서로 다른 통화 더하기

 

환율에 대한 처리도 완료했으니 이제 다른 통화를 더할 준비가 되었다.

테스트를 추가한다.

Money에서 Expression으로 일반화할 때 두고 온 것들이 에러를 일으킨다.

plus()는 Money의 메소드이고 Expression에 선언되지 않았다.

 

10USD가 나와야하는데 15USD가 나왔다.

reduce()가 축약을 재대로 안한다.

 

reduce에서 환율을 적용한 값을 더하게 했더니 테스트가 통과했다.

 

 

 

이제는 원래의 Expression형으로 plus하기 위해 일반화를 한다.

 

augend, addend를 Expression형으로 바꾼다.
Money의 times(), plus()도 Expression을 반환하도록 바꿀 수 있다.

 

테스트의 두 화폐를 Expression으로 바꿔본다. 에러를 확인하니 인터페이스에 plus()를 등록해야 한다.
plus()를 Expression에 등록. Sum에도 Override해야 한다고 컴파일러가 알려준다.
스텁구현으로 plus를 구현했고 테스트를 통과했다.

 

<할일>

//해결//$5 + 10CHF = $10 (1:2의 환율일 경우)
//해결//$5 + $5 = $10
$5 + $5에서 Money반환하기
//해결//Bank.reduce(Money)
//해결//Money에 대한 통화 변환을 수행하는 Reduce
//해결//Reduce(Bank, String)
//추가//Sum.plus
//추가//Expression.times

 

 

 

 

 

 

 

 

'책읽기 > TDD:ByExample' 카테고리의 다른 글

점진적인 개선  (0) 2021.01.22
TDD_8  (0) 2020.11.22
TDD_7  (0) 2020.11.17
TDD_6  (0) 2020.11.11
TDD_5  (0) 2020.11.10