할일 목록
$5 + 10CHF = $10
$5 X 2 = $10
amount를 private으로 만들기
Dollar 부작용(side effect)?
Money 반올림?
equals() 🆕
hashCode() 🆕
객체의 값(정확히는 amount) 를 비교해야 하기 때문에 equals 구현
(swift 에서는 equals 대신 == 사용)
TDD 규칙에 따라 우선 테스트부터 작성한다.
컴파일러 오류 및 테스트 통과를 위해 단순히 true 를 return 한다.
$5 == $5 로 true 만 검사하는 것이 아니라
$5 != $6와 같이 false 도 검사할 필요가 있다.
그리고 Equality 를 구현한다.
할일 목록
$5 + 10CHF = $10
$5 X 2 = $10
amount를 private으로 만들기
Dollar 부작용(side effect)?
Money 반올림?
equals()
hashCode()
Equal null 🆕
Equal object 🆕
Equality 문제가 일시적으로 해결되긴 했지만,
널 값이나 다른 객체들과 비교하면 어떻게 될까?
일단 할일 목록에 적어두기만 하고 다음에 해결한다.
할일 목록
$5 + 10CHF = $10
$5 X 2 = $10
amount를 private으로 만들기
Dollar 부작용(side effect)?
Money 반올림?
equals()
hashCode()
Equal null
Equal object
Dollar 의 times() 연산은 객체를 반환한다.
하지만 테스트는 이를 정확하게 표현하고 있지 않다.
(객체를 비교하는게 아니라 변수 amount 를 비교하고 있음)
(앞 3장에서 Equality 를 구현했으므로 XCTAssertEqual 문은 문제 없이 통과된다)
이렇게 고치게 되면 이제 amount 를 사용하는 코드는 Dollar 자신밖에 없다.
따라서 이제 private 으로 고칠 수 있다.
여기서 주의할 점은, 만약 이전 3장의 testEquality() 테스트가 Equality에 대한 정확한 검증을 실패한다면,
이 testMultiplication() 테스트 또한 곱하기에 대한 정확한 검증하는 데 실패하게 된다.
TDD 를 하면서 적극적으로 관리해야 할 위험 요소 중 하나이다.
할일 목록
$5 + 10CHF = $10
$5 X 2 = $10
amount를 private으로 만들기
Dollar 부작용(side effect)?
Money 반올림?
equals()
hashCode()
Equal null
Equal object
5CHF x 2 = 10CHF 🆕
목록에 있는 테스트 중 가장 흥미로워 보이는 $5 + 10CHF = $10 에는 어떻게 접근하는게 좋을까?
작은 단계(5CHF x 2 = 10CHF)부터 시작한다.
우선 Dollar 객체와 비슷하게 작동하는 Franc 이라는 객체를 만든다면 좀 더 가까워질 수 있다.
Dollar 테스트를 단순 복사 후 수정해본다.
이전 4장에서 테스트를 단순화해 놓아서 지금하는 작업이 더 쉬워졌다.
코드를 단순 복사하여 불편할 수도 있겠지만 TDD의 단계를 다시 숙지한다.
- 테스트 작성
- 컴파일 되게 하기
- 실패하는지 확인하기 위해 실행
- 실행되게 만듦
- 중복 제거 (리팩토링)
처음 4단계는 빨리 진행하는게 포인트이다.
중복이 엄청나게 많기 때문에 다음 장에서는 이것들을 리팩토링하는 시간을 가진다.
할일 목록
$5 + 10CHF = $10
$5 X 2 = $10
amount를 private으로 만들기
Dollar 부작용(side effect)?
Money 반올림?
equals()
hashCode()
Equal null
Equal object
5CHF x 2 = 10CHF
Dollar/Franc 중복 🆕
공용 equals 🆕
공용 times 🆕
할일 목록
$5 + 10CHF = $10
$5 X 2 = $10
amount를 private으로 만들기
Dollar 부작용(side effect)?
Money 반올림?
equals()
hashCode()
Equal null
Equal object
5CHF x 2 = 10CHF
Dollar/Franc 중복
공용 equals
공용 times
이전 5장에서 단순 복사를 통해서 구현한 부분들을 리팩토링한다.
두 클래스(Dollar, Franc) 의 공통 상위 클래스를 찾아내어 리팩토링할 수 있다.
변수 amount 와 함수 == (equals) 를 상위 클래스인 Money 로 이동하고 일반화하여 중복을 줄였다.
(times 도 중복되긴 하지만, 이 장은 '공용 equals' 에 대한 단계이다)
근데 만약 Franc 와 Dollar 를 비교하면 어떻게 될까? 이건 다음 장에서 다룬다.
할일 목록
$5 + 10CHF = $10
$5 X 2 = $10
amount를 private으로 만들기
Dollar 부작용(side effect)?
Money 반올림?
equals()
hashCode()
Equal null
Equal object
5CHF x 2 = 10CHF
Dollar/Franc 중복
공용 equals
공용 times
Franc 와 Dollar 비교하기 🆕
각각 Dollar, Franc 타입을 가지던 equals (==) 를 Money 타입으로 일반화했다.
영어 속담 중,
사과와 오렌지를 비교할 수 없다, 즉 서로 다른걸 비교할 수 없다.
할일 목록
$5 + 10CHF = $10
$5 X 2 = $10
amount를 private으로 만들기
Dollar 부작용(side effect)?
Money 반올림?
equals()
hashCode()
Equal null
Equal object
5CHF x 2 = 10CHF
Dollar/Franc 중복
공용 equals
공용 times
Franc 와 Dollar 비교하기
현재 equals(==) 는 amount 만 비교하므로 Dollar 와 Franc 가 같다고 나온다.
따라서 위와 같이 객체의 타입까지 비교해주면 서로 다른 타입인지 구별해줄 수 있다.
다만, 프로그래밍 언어의 용어를 사용하기 보단 '통화 개념(USD, CHF 등)'과 같은 재정언어를 도입하여 비교하는게 더 좋을 수 있다.
이 부분은 이후에 진행할 예정이다. 잠시 동안 이대로 둔다.
초반에는 왜 저걸 한꺼번에 리팩토링을 안 하지? 라는 생각이 들면서 좀 답답하기도 했다.
하지만 이 책에선 조그마한 단계를 해결해 나가면서 큰 단계를 이루는 과정을 보여주기 위해서,
조금 답답하더라도 스텝 하나하나를 디테일하게 보여주는게 아닌가 싶다.