$5 + 10CHF = $10(환율이 2:1일 경우)
$5 X 2 = $10(해결)
amount를 private으로 만들기
Dollar 부작용(진행)
Money 반올림?
Dollar 부작용 해결하기
테스트 코드를 추가해보자.
func testMultiplication() {
let five = Dollar(5)
five.times(2)
XCTAssertEqual(10, five.amount)
five.times(3)
XCTAssertEqual(15, five.amount) -> 테스트 실패
}
times()
를 처음 호출한 이후에 five는 더 이상 5가 아니다.
times()
에서 새로운 객체를 반환하는 방식으로 문제를 해결해보자.
- Dollar 인터페이스를 수정해야 하고, 테스트도 수정해야 한다.
- 그러나 문제될 것은 없다. 어떤 구현이 올바른가에 대한 우리 추측이 완벽하지 못한 것과 마찬가지로 올바른 인터페이스에 대한 추측 역시 절대 완벽하지 못하다.
func testMultiplication() {
let five = Dollar(5)
var product = five.times(2)
XCTAssertEqual(10, product.amount)
product = five.times(3)
XCTAssertEqual(15, product.amount)
}
Dollar의 times()
타입이 Dollar가 아니므로 컴파일이 되지 않는다.
class Dollar {
var amount: Int!
init(_ amount: Int) {
self.amount = amount
}
func times(_ multiplier: Int) -> Dollar? {
amount *= multiplier
return nil
}
}
컴파일 되지 않는 문제를 해결하기 위해 Dollar 인터페이스를 수정했다.
하지만 실행되지 않는다. 그래도 한 걸음 나아간 것이다!
테스트를 통과하기 위해서는 올바른 금액을 갖는 새 Dollar를 반환해야 한다.
class Dollar {
var amount: Int!
init(_ amount: Int) {
self.amount = amount
}
func times(_ multiplier: Int) -> Dollar {
return Dollar(amount * multiplier)
}
}
할일 목록 삭제하기
$5 + 10CHF = $10(환율이 2:1일 경우)
$5 X 2 = $10(완료)
amount를 private으로 만들기
Dollar 부작용(완료)
Money 반올림?