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

변주한·2022년 6월 5일
0

이전 장에서 우리는 엄청난 것들을 그냥 복붙해서 해결했다...

미안하지만 코딩에서 복붙은... 프로그래머를 포기하는 행위... 고쳐보자

요롷게 요롷게 바꿔보자

음... 왜 이렇게 바꿔보자라고 묻는다면... 이렇게 해야하는거다라고 하면 나는 욕을 쳐먹을테니
간단히 말하자면, 우리는 두개의 객체가 복붙으로 같은 형식을 가졌으니 그 형식을 하나 만들어주고 그 형식을 나눠갖는다고 생각하면 편하다.

이말이 이해가 안된다면... TDD를 포기하자 그게 편하다...

class Money {   
}
public class Dollar extends Money{ ...

이렇게 해도 테스트는 여전히 잘 돌아갈 것이다.

public class Money {
    protected int amount;
}

이렇게 하고 Dollar 클래스에는 private 변수 amount를 삭제하면? 여전히 테스트는 상속된 변수로 인해 통과가 될것이다.

//Dollar
	@Override
    public boolean equals(Object o) {
        Dollar money = (Dollar) o;
        return amount == money.amount;
    }
//->
	@Override
    public boolean equals(Object o) {
        Money money = (Money) o;
        return amount == money.amount;
    }
    
//Franc
	@Override
    public boolean equals(Object o) {
        Franc money = (Franc) o;
        return amount == money.amount;
    }
//->
	@Override
    public boolean equals(Object o) {
        Money money = (Money) o;
        return amount == money.amount;
    }
    
	@Override
    public boolean equals(Object o) {
        Money money = (Money) o;
        return amount == money.amount;
    }

테스트 케이스? Dollar 케이스를 복붙해서 넣어보자

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

        assertTrue(new Franc(5).equals(new Franc(5)));
        assertFalse(new Franc(5).equals(new Franc(6)));
    }

... 장난하나... 그렇게 반복 중복 하지 말랬는데 중복이다...
교회랑 마찬가지로 나중에 회개하고 일단 지나가보자

그리고 위의 Dollar 클래스와 마찬가지로 Franc도 같은 절차를 밟도록 하자

그렇게 하고 나면 의문이 든다. 만약에 Franc하고 Dollar를 비교하면 어떻게 되지?(7장으로 ㄱㄱ)

우리는

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

0개의 댓글