김동형수 개발기

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

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

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

김동형수 2022. 8. 30. 22:51

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

할일목록

  • $5 + 10CHF = $10(환율이 2:1일 경우)
  • $5 X 2 = $10
  • amount를 private로 만들기
  • Dollar 부작용?
  • Money 반올림?
  • equals()
  • hashCode()
  • Equal null
  • Equal object
  • 5CHF X 2 = 10CHF
  • Dollar / Franc 중복
  • 공용 equals
  • 공용 times

5장에서 복사 붙여넣기 후 수정을 통해서 중복코드를 생성했기 때문에 중복을 제거해야한다.

 

복사 붙여넣기 후 공통 상위 클래스를 찾아 추상화를 한다.

상위 클래스인 Money가 equals를 갖게 한다면 어떨까?

간단한 것부터 시작해보자.

 

Money 클래스 생성한다고 해도 테스트는 여전히 통과한다.

Dollar가 Money 클래스를 상속받는다고 해도 여전히 깨지지 않는다.

 

여전히 깨지지 않는다.

amount 인스턴스 변수를 Money로 옮길 수 있다.

 

equals() 도 Money 클래스로 옮길 수 있다.

 

모든 테스트가 여전히 잘 돈다.

 

equals()에서 casting 부분을 변경했다 Dollar -> Money

이후 Money 클래스로 메서드를 옮겼다.

 

이제 Franc에도 적용해보자. 그에 앞서 우리는 코드를 변경하기 전에 애초에 그곳에 있어야 했던 테스트를 작성할 것이다.

 

충분한 테스트가 없다면 지원 테스트가 갖춰지지 않은 리펙토링을 만나게 될 수 밖에 없다.

리펙토링하면서 실수했는데도 여전히 통과할 수도 있는 것이다.

있으면 좋을 것 같은 테스트를 작성하라. 그렇지 않으면 리펙토링하다 뭔가 깨트리고 리펙토링을 덜 하게 된다.

리펙토링을 적게하면 설계의 질이 저하된다.

 

Franc도 Money를 상속받게 변경한다.

 

  • $5 + 10CHF = $10(환율이 2:1일 경우)
  • $5 X 2 = $10
  • amount를 private로 만들기
  • Dollar 부작용?
  • Money 반올림?
  • equals()
  • hashCode()
  • Equal null
  • Equal object
  • 5CHF X 2 = 10CHF
  • Dollar / Franc 중복
  • 공용 equals
  • 공용 times
  • Franc와 Dollar 비교하기

이번장 정리

  • 공통된 코드를 첫 번째 클래스(Dollar)에서 상위 클래스(Money)로 단계적으로 옮겼다.
  • 두 번째 클래스(Franc)도 Money의 하위 클래스로 만들었다.
  • 불필요한 구현을 제거하기 위해 전에 두 equals() 구현을 일치시켰다.

 

 

 

Comments