김동형수 개발기

테스트 주도 개발 - 1부 12장 본문

책 스터디/[완료] 테스트 주도 개발

테스트 주도 개발 - 1부 12장

김동형수 2022. 9. 14. 01:43

12장 드디어 더하기

할일목록

  • $5 + 10CHF = $10(환율이 2:1일 경우)
  • Money 반올림?
  • hashCode()
  • Equal null
  • Equal object

할일 목록이 조금 지저분해서 정리되지 않은 항목들만 새 목록으로 옮긴다.

작가는 손으로 적는걸 좋아하고, 할일 목록이 많으면 옮기기 보다는 그냥 처리하는 경향이 있고, 게으르기 때문에 누적될 만한 자잘한 일들을 처리한다고 한다. 자신의 강점을 살리는 방향으로

 

할일목록

  • $5 + 10CHF = $10(환율이 2:1일 경우)
  • $5 + $5 = $10
  • Money 반올림?
  • hashCode()
  • Equal null
  • Equal object

 

테스트를 통과시키기 위해서 가짜구현 ( Money.dollar(10)을 반환할 수 있지만, 어떻게 구현해야 할지 명확하므로 plus 메서드를 구현한다.

 

드디어 단계를 줄이는 방식을 적용해봤다.

 

저자가 속도를 높힌다고 갑자기 낮춘다고 했는데 이는 테스트를 통과시키는 속도가 아닌 테스트를 작성하는 속도를 말한다.

다중 통화 연산의 문제의 경우가 해당한다.

 

설계상 가장 어려운 제약은 다중 통화 사용에 대한 내용을 시스템의 나머지 코드에게 숨기고 싶다는 점이다.

한가지 가능한 전략은 모든 값을 참조통화로 전환하는 것인데, 이 방식은 여러 환율을 쓰기 쉽지 않다.

 

편하게 여러 환율을 표현할 수 있으면서 산술 연산 비슷한 표현들을 산술 연산처럼 다룰 수 있는 해법이 있으면 좋을 것 같다.

 

가지고 있는 객체가 원하는 방식으로 동작하지 않을 경우엔 그 객체와 외부 프로토콜이 같으면서 내부 구현은 다른 새로운 객체를 만들 수 있다.

 

TDD는 적절한 때에 번뜩이는 통찰을 보장하지 못한다. 그렇지만 확신을 주는 테스트와 조심스럽게 정리된 코드를 통해 통찰에 대한 준비와 함께 통찰이 번뜩일 때 그걸 적용할 준비를 할 수 있다.

 

해법은 Money와 비슷하게 동작하지만 사실은 두 Money의 합을 나타내는 객체를 만드는 것이다.

  • Money의 합을 마치 지갑처럼 취급하는 것 ( 한 인스턴스에서 계속 합산하는 듯 ? )
  • 수식 [( $2 + 3CHF ) X 5] Money가 가장 작은 단위, 수식의 결과로 expression이 나오는데 연산이 완료되면 환율을 이용해서 결과 expression을 단일 통화로 축약할 수 있다.

 

sum.reduce("USD", bank)라고 쓸 수 있었다.

어떻게 bank에서 reduce의 책임을 진다는 생각이 떠올랐을까?

  • Expression은 우리가 하려고 하는 일의 핵심에 해당한다. 객체가 다른 부분에 대해서 될 수 있는 한 모르도록 노력해야한다.
  • Expression과 관련이 있는 오퍼레이션이 많을 거라고 상상할 수 있다.
  • ?????

 

정리

  • 큰 테스트를 작은 테스트로 줄여서 발전을 나타낼 수 있도록 했다.
  • 우리에게 필요한 계산(computation)에 대한 가능한 메타포들을 신중히 생각해봤다.
  • 새 메타포에 기반하여 기존 테스트를 재작성했다.
  • 테스트를 빠르게 컴파일 했다.
  • 그리고 테스트를 실행했다.
  • 진짜 구현을 만들기 위해 필요한 리팩토링을 약간의 전율과 함께 기대했다.

 

 

 

Comments