TDD 1.0 Help

3장. 모두를 위한 평등

이전에 예제 Dollar 객체와 같이 객체를 값처럼 쓸 수 있는데 이것을 값 객체 패턴(value object pattern)이라고 한다. 값 객체에 대한 제약사항으로 객체의 인스턴스 변수가 생성자를 통해서 일단 설정된 후에는 결코 변하지 않는다는 것이다.

값 객체를 사용하면 별칭 문제에 대해 걱정할 필요가 없다는 장점이 있다.

별칭 문제를 예로 들어보자. 수표가 하나 있다. 여기에 $5를 설정하고 또다른 수표에도 아까 설정했던 $5를 설정했다고 치자. 두 번째 수표의 값을 변화시키는 바람에 첫 번째 수표의 값까지 변하게 될 수 있다. 이러한 문제가 별칭 문제이다.

값 객체가 암시하는 것 중 하나는 모든 연산은 새 객체를 반환해야 한다는 것이다. 또다른 암시는 값 객체는 equals()를 구현해야 한다.

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

  • $5 x 2 = $10

  • amount를 private으로 만들기

  • Dollar side effect?

  • Money 반올림?

  • equals()

Dollar를 해시 테이블의 키로 쓸 생각이라면 equals()를 구현할 때에 hashCode()를 같이 구현해야 한다. 일단 할일 목록에 적어두고 문제가 생기면 그 때 다뤄보자.

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

  • $5 x 2 = $10

  • amount를 private으로 만들기

  • Dollar side effect?

  • Money 반올림?

  • equals()

  • hashCode()

Dollar 객체를 비교하는 테스트를 해보자.

@kotlin.test.Test fun testEquality() { assertEquals(Dollar(5), Dollar(5)) }
equeal_test.png

이 결과를 초록 막대로 바꾸기 위해서는 단순히 true를 반환하게 equals를 구현하면 된다.

override fun equals(other: Any?): Boolean { return true }

사실 5 == 5가 true여야하고, amount == 5이며 amount == dollar.amount임을 간단히 알 수 있다. 하지만 삼각측량에 대해 알아봐야하니 삼각측량의 전략으로 코드를 완성시켜보자.

삼각층량을 이용하려면 예제가 두 개 이상 있어야만 코드를 일반화할 수 있다. $5 != $6를 추가해보자.

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

이제 동치성을 일반화 해보자.

override fun equals(other: Any?): Boolean { return amount == (other as Dollar).amount }
할일 목록
  • $5 + 10CHF = $10 (환율이 2:1로 가정)

  • $5 x 2 = $10

  • amount를 private으로 만들기

  • Dollar side effect?

  • Money 반올림?

  • equals()

  • hashCode()

동일성 문제가 일시적으로 해결됐다. 하지만 null 값이나 다른 객체들과 비교한다면 어떻게 될까? 일단 할일 목록에 적어 두고 넘어가자.

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

  • $5 x 2 = $10

  • amount를 private으로 만들기

  • Dollar side effect?

  • Money 반올림?

  • equals()

  • hashCode()

  • Equal null

  • Equal object

3장의 내용을 검토해보면,

  • 우리의 디자인 패턴(값 객체)이 하나의 또 다른 오퍼레이션을 암시한다는 것을 알아챘다.

  • 해당 오퍼레이션을 테스트하고 간단히 구현했다.

  • 곧장 리팩토링하는 대신 테스트를 조금 더 했다.

  • 두 경우를 모두 수용할 수 있도록 리팩토링했다.

Last modified: 31 January 2024