[테스트 주도 개발] 3장_모두를 위한 평등

Dollar 객체같이 객체를 값처럼 쓸 수 있는 것을 객체 Value Object Pattern 이라고 한다. 값 객체에 대한 제약사항 중 하나는 객체의 인스턴스 변수가 생성자를 통해서 일단 설정된 후에는 변하지 않는다는 것이다.
값 객체가 암시하는 것은,

  1. 모든 연산은 새 객체를 반환해야한다.
  2. 값 객체는 equals() 를 구현해야한다.
1
2
3
void testEquality(){
assertTrue(new Dollar(5).equals(new Dollar(5)));
}

빨간 막대다. 가짜로 구현하는 방법은 단순히 true 를 반환하도록 하는 것이다.

1
2
3
public boolean equals(Object object){
return true;
}

(삼각측량) 예제가 두 개 이상 있으면 코드를 일반화 할 수 있다. 다음과 같이 5!=6 을 해보자.

1
2
3
4
void testEquality(){
assertTrue(new Dollar(5).equals(new Dollar(5)));
assertFalse(new Dollar(5).equals(new Dollar(6)));
}

이제 equlity 를 일반화하자.

1
2
3
4
public boolean equals(Object object){
Dollar dollar = (Dollar) object;
return amount == dollar.amount;
}

이렇게 어떻게 리팩토링해야하는지 감이 안오면 삼각측량을 사용하자. 코드와 테스트 사이의 중복을 제거하고 일반적인 해법을 구할 방법이 보이면 그냥 그 방법대로 구현하면 된다.
자, 동일성 문제는 일시적으로 해결했다. 널 값이나 다른 객체들과 비교하는 상황은 일반적이진 않지만 당장은 필요하지 않다. 할일 목록에 적어 두기만 하자.


테스트 주도 개발 <켄트 벡>

Comments