Dollar와 Franc 클래스를 제거하기 위한 명백한 방법이 없다.
times에서 팩토리 메서드를 호출했지만, 팩토리 메서드의 내용을 인라인 시킨다.
깔끔한 코드와 코드가 잘 동작할 거라는 믿음을 줄 수 있는 테스트 코드들이 있다.
고민을 하기 보다는 컴퓨터에게 물어보는 것도 좋다. (엔지니어 5~10분, 컴퓨터 10~15초)
상위 클래스를 추상클래스에서 콘크리트 클래스로 만든다.
org.opentest4j.AssertionFailedError:
Expected :chapter10.Franc@5158b42f
Actual :chapter10.Money@595b007d
컴파일러의 메시지가 도움이 크게 되는 것 같지는 않다. toString 메서드를 구현하자.
toString() 작성하면서 테스트 먼저 작성해야하나?
- 우린 지금 화면에 나타나는 결과를 보려던 참이다.
- toString()은 디버그 출력에만 쓰이기 때문에 이게 잘못 구현됨으로 얻게 될 리스크가 적다
- 이미 삘간 막대 상태인데 이 상태에서는 새로운 테스트를 작성하지 않는 게 좋을 것 같다.
Expected :10 CHF
Actual :10 CHF
답은 맞지만 클래스가 다르다. Franc 대신 Money가 왔다. equals에 문제가 있다.
equals에서 클래스가 아닌 통화단위를 비교해야 한다.
times 또한 Money로 변경할 수 있고 Dollar, Franc 코드가 동일해졌으므로 공통 클래스로 Push up 한다.
할일목록
- $5 + 10CHF = $10(환율이 2:1일 경우)
$5 X 2 = $10amount를 private로 만들기Dollar 부작용?- Money 반올림?
equals()- hashCode()
- Equal null
- Equal object
5CHF X 2 = 10CHF- Dollar / Franc 중복
공용 equals공용 timesFranc와 Dollar 비교하기통화?- testFrancMultiplication을 지워야 할까?
정리
- 두 times()를 일치시키기 위해 그 메서드들이 호출하는 다른 메서드들을 인라인시킨 후 상수를 변수로 바꿔주었다.
- 단지 디버깅을 위해 테스트 없이 toString() 작성
- Frnac 대신 Money를 반환하는 변경을 시도한 뒤 그것이 잘 동작할지를 테스트가 말하도록 했다.
- 실험해본 걸 뒤로 물리고 또 다른 테스트를 작성했다. 테스트를 작동했더니 실험도 제대로 작동했다.