TDD 1.0 Help

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

할일 목록
  • $5 + 10CHF = $10 (환율이 2:1로 가정)

  • $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장에서 테스트를 통과하기 위해 코드를 복사해서 붙이는 엄청난 죄를 저질렀다. 이제 청소할 시간이다.

두 클래스의 공통 상위 클래스를 찾아내보자.

common_class.png

Money 클래스가 공통의 equals 코드를 갖게 하면 어떨까? 간단한 것부터 구현해보자.

open class Money class Dollar(private var amount: Int) : Money() { ... }

테스트가 여전히 잘 도니 amount 인스턴스 변수를 Money로 옮겨보자.

open class Money(protected var amount: Int) class Dollar(amount: Int) : Money(amount) { override fun equals(other: Any?): Boolean { return amount == (other as Money).amount } }

equals 코드의 캐스팅 부분을 Money로 변경하면 equals 메서드를 Dollar에서 Money로 옮길 수 있게 된다.

open class Money(protected var amount: Int) { override fun equals(other: Any?): Boolean { return amount == (other as Money).amount } }

이제 Franc.equals()를 제거해야 한다. 하지만 동치성 테스트에서 Franc끼리의 비교는 다루지 않았다. 따라서 코드를 변경하기 전에 동치성 테스트를 작성할 것이다.

@kotlin.test.Test fun testEquality() { assertEquals(Dollar(5), Dollar(5)) assertNotEquals(Dollar(5), Dollar(6)) assertEquals(Franc(5), Franc(5)) assertNotEquals(Franc(5), Franc(6)) }

이제 Franc에 있는 equals를 제거할 수 있다.

class Franc(amount: Int) : Money(amount) { fun times(multiplier: Int): Franc { return Franc(amount * multiplier) } }
할일 목록
  • $5 + 10CHF = $10 (환율이 2:1로 가정)

  • $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장을 정리해보면

  • 공통된 코드를 첫 번째 클래스(Dollar)에서 상위 클래스(Money)로 단계적으로 옮겼다.

  • 두 번째 클래스(Franc)도 Money의 하위 클래스로 만들었다.

  • 불필요한 구현을 제거하기 전에 두 equals() 구현을 일치시켰다.

Last modified: 31 January 2024