3장. 모두를 위한 평등

변주한·2022년 6월 4일
0

어떤 정수에 1을 더했을 때 우리는 원래 정수가 변할 거라고 예상하기보다는 원래 정수에 1이 더해진 새로운 값을 갖게 될 것을 예상한다. 하지만 일반적으로 객체는 우리 예상대로 작동하지 않는다.

값 객체 패턴(value object pattern)

객체를 값처럼 쓰는 패턴

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

별칭문제?
예를 들어, 두번째 수표의 객체 값을 변화시키는 바람에 첫번째 수표의 객체 값까지 변하게 되는 문제

값 객체가 암시하는 것 중 하나는 모든 연산은 새 객체를 반환해야 한다는 것이다. 또다른 암시는 값 객체는 equals()를 구현해야 한다는 것인데, 이것이 값객체의 별칭문제를 해결할 수 있기 때문이다.

$5 + 10 CHF = $10(환율이 2:1일 경우)
$5 X 2 = $10
amount를 private으로 만들기
Dollar 부작용(side effect)?
Money 반올림
equals()
hashcode()

만약 Dollar를 해시 테이블의 키로 쓸 생각이라면 equals()를 구현할 때에 hashCode()를 같이 구현해야 한다. 이것을 할일 목록에 적어 놓고 이것 때문에 문제가 생기면 그 때 다루도록 하자.

	@Test
    public void testEquality(){
        assertTrue(new Dollar(5).equals(new Dollar(5)));
    }

흠... 두개의 주소값을 비교하기 때문에 당연히 빨간 막대다...

일단 빠르게 통과 시켜보자

	@Override
    public boolean equals(Object o) {
        return true;
    }

이미 테스트 케이스에서 다룬 5와 5가 같다는 것을 알기 때문에 단순히 true를 반환시켜 테스트를 통과 시켰다.

삼각측량

개인적으로 책을 읽다가 이해가 안되서 개인적인 멘토에게 물어봤다...
왼쪽에서 봤을때
오른쪽에서 봤을때
를 확인하고 그걸 통해서 더 정확한 측정이 가능하다는 것을 표현한다.

	@Test
    public void testEquality(){
        assertTrue(new Dollar(5).equals(new Dollar(5)));
        assertFalse(new Dollar(5).equals(new Dollar(6)));
    }

이제 동치성을 일반화해야 한다.

	@Override
    public boolean equals(Object o) {
        Dollar dollar = (Dollar) o;
        return amount == dollar.amount;
    }

$5 + 10 CHF = $10(환율이 2:1일 경우)
$5 X 2 = $10
amount를 private으로 만들기
Dollar 부작용(side effect)?
Money 반올림
equals()
hashcode()

위의 내용들을 검토해보자

  • 우리의 디자인 패턴이 하나의 또 다른 오퍼레이션을 암시한다는 걸 알아챘다.
  • 해당 오퍼레이션을 테스트했다.
  • 해당 오퍼레이션을 간단히 구현했다.
  • 곧장 리팩토링하는 대신 테스트를 조금 더 했다.
  • 두 경우를 모두 수용할 수 있도록 리팩토링했다.
profile
늦었지만 꾸준히

0개의 댓글