TDD (3~7장)

Young Min Sim ·2021년 6월 8일
0

TDD

목록 보기
2/6
post-custom-banner

3장 모두를 위한 평등

할일 목록

$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 문제가 일시적으로 해결되긴 했지만,
널 값이나 다른 객체들과 비교하면 어떻게 될까?
일단 할일 목록에 적어두기만 하고 다음에 해결한다.

이 장에서 한 작업들 검토

  • 오퍼레이션을 테스트로 작성했다.
  • 오퍼레이션을 간단히 구현했다. (항상 true를 반환하는 스텁)
  • 곧장 리팩토링 하는 대신 테스트를 좀 더 보완했다.
  • 두 경우를 모두 수용할 수 있도록 리팩토링했다.

4장 프라이버시

할일 목록

$5 + 10CHF = $10
$5 X 2 = $10
amount를 private으로 만들기
Dollar 부작용(side effect)?
Money 반올림?
equals()
hashCode()
Equal null
Equal object

기존 testMultiplication()

Dollar 의 times() 연산은 객체를 반환한다.
하지만 테스트는 이를 정확하게 표현하고 있지 않다.
(객체를 비교하는게 아니라 변수 amount 를 비교하고 있음)

(앞 3장에서 Equality 를 구현했으므로 XCTAssertEqual 문은 문제 없이 통과된다)
이렇게 고치게 되면 이제 amount 를 사용하는 코드는 Dollar 자신밖에 없다.
따라서 이제 private 으로 고칠 수 있다.

여기서 주의할 점은, 만약 이전 3장의 testEquality() 테스트가 Equality에 대한 정확한 검증을 실패한다면,
testMultiplication() 테스트 또한 곱하기에 대한 정확한 검증하는 데 실패하게 된다.
TDD 를 하면서 적극적으로 관리해야 할 위험 요소 중 하나이다.

이 장에서 한 작업들 검토

  • 오직 테스트를 향상시키기 위해서만 개발된 기능을 사용했다. // ?
  • 두 테스트가 동시에 실패하면 망한다는 점을 인식했다.
  • 위험 요소가 있음에도 계속 진행했다.
  • 테스트와 코드 사이의 결합도를 낮추기 위해 테스트하는 객체의 새 기능을 사용했다.

5장 솔직히 말하자면

할일 목록

$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의 단계를 다시 숙지한다.

  1. 테스트 작성
  2. 컴파일 되게 하기
  3. 실패하는지 확인하기 위해 실행
  4. 실행되게 만듦
  5. 중복 제거 (리팩토링)

처음 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 🆕

이 장에서 한 작업들 검토

  • 큰 테스트를 (한 번에) 공략할 수 없다. 그래서 자그마한 테스트를 먼저 만들었다.
  • 뻔뻔스럽게도 중복을 만들고 조금 고쳐서 테스트를 작성했다.
  • 중복이 사라지기 전에는 집에 가지 않겠다고 약속했다.

6장 돌아온 '모두를 위한 평등'

할일 목록

$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 클래스의 중복된 코드를 상위 클래스(Money)로 옮겼다.
  • 불필요한 구현을 제거하기 전에 두 equals() 구현을 일치시켰다.

    각각 Dollar, Franc 타입을 가지던 equals (==) 를 Money 타입으로 일반화했다.


7장 사과와 오렌지

영어 속담 중,
사과와 오렌지를 비교할 수 없다, 즉 서로 다른걸 비교할 수 없다.

할일 목록

$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 등)'과 같은 재정언어를 도입하여 비교하는게 더 좋을 수 있다.
이 부분은 이후에 진행할 예정이다. 잠시 동안 이대로 둔다.

이 장에서 한 작업들 검토

  • 결함을 끄집어내서 테스트에 담아냈다.
  • 완벽하진 않지만 그럭저럭 봐줄 만한 방법(타입 비교)으로 테스트를 통과하게 만들었다.
  • 더 많은 동기가 있기 전에는 더 많은 설계(통화 개념 도입)를 도입하지 않기로 했다.

7장까지 읽어보고..

초반에는 왜 저걸 한꺼번에 리팩토링을 안 하지? 라는 생각이 들면서 좀 답답하기도 했다.
하지만 이 책에선 조그마한 단계를 해결해 나가면서 큰 단계를 이루는 과정을 보여주기 위해서,
조금 답답하더라도 스텝 하나하나를 디테일하게 보여주는게 아닌가 싶다.

post-custom-banner

0개의 댓글