7장 사과와 오렌지
You can't compare apples and oranges.
영어권 속담, 다른 것을 비교할 수 는 없다.
<할일 목록>
$5 + 10CHF = $10(환율이 2:1 인 경우)
// 해결 // $5 x 2 = $10
// 해결 // amount를 private로 만들기
// 해결 // Dollor 부작용?
Money 반올림
// 해결 // equals()
hashCode()
Equal null
Equal object
//해결// 5CHF x 2 = 10CHF
Dollor,Franc 중복
//해결// 공용 equal
공용 times
//추가// Franc와 Dollor비교하기
최근에 추가한 Franc와 Dollor를 비교하기 위해 testEquality()에 새로운 테스트코드를 작성한다.
실패한다.
두 화폐가 다르지만 지금은 amount로만 비교하기 때문에 true가 나온것이다.
Money의 equal메소드를 클래스도 같아야 같음을 반환하게 바꿔보자.
현재는 통화의 개념 없이 getClass()로 클래스의 이름이 같은가를 검사했다.
통화의 개념이 들어가야 깔끔할 듯 하다.
하지만 일단 이대로 두자.
<할일 목록>
$5 + 10CHF = $10(환율이 2:1 인 경우)
// 해결 // $5 x 2 = $10
// 해결 // amount를 private로 만들기
// 해결 // Dollor 부작용?
Money 반올림
// 해결 // equals()
hashCode()
Equal null
Equal object
//해결// 5CHF x 2 = 10CHF
Dollor,Franc 중복
//해결// 공용 equal
공용 times
//해결// Franc와 Dollor비교하기
//추가// 통화
8장 객체 만들기
이번 장에서는 두 화폐 Dollor,Franc 중복을 해결해보고자 한다.
먼저 지금 두 클래스의 times함수가 비슷하다. 두 클래스가 모두 Money를 상속받는 하위클래스이므로 Money로 반환하게 바꾸어 준다.
다음 단계로 뭘 할지 확실치가 않다.
Money의 하위 클래스들이 많은 역할을 하지 않으므로 없애버리고 싶다.
그 첫번째로, 하위 객체에 대한 직접적인 참조가 적어진다면 없앰의 한단계를 나아갔다고 할 수 있다.
직접적인 참조를 피하기 위해 [팩토리 메소드 패턴]을 도입한다.
five라는 인스턴스를 생성할 때, 이젠 팩토리 메서드로 Money객체를 만든다.
하지만 아직 Money 상위클래스에서는 times메소드가 없다.
Money를 추상클래스로 만들고, 추상메소드 times를 선언하여 하위에서 구현하는 구조로 만들어 보자.
이젠 아래와 같이 정상적으로 팩토리 메서드를 이용하여 Money(dollor)객체를 생성하고 times메서드를 사용하도록 바꿀 수 있다.
이젠 테스트 코드를 보고 어느 누구도 Money클래스의 하위에 Dollor클래스가 있다는 것을 알 수 없다.
--> Dollor클래스를 직접적으로 호출하지 않고있다. 분리 시켰다.
같은 과정으로 Franc클래스에 대해서도 진행한다.
하지만 여기서 testMultiplication 테스트를 진행하면서 Dollor를 Money로 바꿨다.
testMultiplication2 테스트도 바꾸고 보니 위의 테스트와 다를바가 없어 보인다.
그럼 삭제해야할까?
하위 클래스를 분리하고 상위 클래스로 해결하면서 생긴 이 문제, 어떻게 해야할지 할일에 추가하고 보류해보자.
<할일 목록>
$5 + 10CHF = $10(환율이 2:1 인 경우)
// 해결 // $5 x 2 = $10
// 해결 // amount를 private로 만들기
// 해결 // Dollor 부작용?
Money 반올림
// 해결 // equals()
hashCode()
Equal null
Equal object
//해결// 5CHF x 2 = 10CHF
Dollor,Franc 중복
//해결// 공용 equal
공용 times
//해결// Franc와 Dollor비교하기
통화
//추가// testMultiplication2 삭제?
9장 우리가 사는 시간
7장에서 getClass를 통해 해결했지만 찝찝했던 통화 문제를 해결하면 하위 클래스를 제거하는데 도움이 될 것 같다.
통화를 나타내는 currency를 추가하고 적용해보자.
일단은 문자열로 처리할 것이다.
처음으로, 통화를 비교하는 새로운 테스트를 작성하자.
컴파일이 안된다. 이를 해결하기 위해 Money에 currency메소드를 추가해야 할 것이다.
그럼 하위 클래스에서 이 추상메서드를 구현해보자.
빠른 구현을 통해 초록막대를 보는데 성공하였다!
그럼 이제 공통부분을 만들어 하위 클래스의 currency메소드를 push up하기 위해,
currency라는 변수를 이용하여 두 클래스의 currency메소드의 형태를 같게 만들자.
이렇게 되면, 상위 Money클래스에 currency메소드를 push up 할 수 있다!
이렇게 하고 나니 생성자도 둘을 서로 비슷하게 만들 수 있을 것 같다.
이제 두 클래스의 생성자가 모양이 같다. 그러면 두 생성자를 상위 클래스의 생성자를 super로 상속받아 쓰고,
Money클래스에서 생성자를 구현하자.
테스트가 성공한다!
통화문제를 해결했다.
정리하자면, times() 메소드를 통합하기 위해 펙토리 메소드로 다른 부분들을 옮겨서, 두 생성자를 일치시켰다.
이후 리펙토링을 통해 동일한 생성자를 상위 클래스로 옮겼다.
<할일 목록>
$5 + 10CHF = $10(환율이 2:1 인 경우)
// 해결 // $5 x 2 = $10
// 해결 // amount를 private로 만들기
// 해결 // Dollor 부작용?
Money 반올림
// 해결 // equals()
hashCode()
Equal null
Equal object
//해결// 5CHF x 2 = 10CHF
Dollor,Franc 중복
//해결// 공용 equal
공용 times
//해결// Franc와 Dollor비교하기
//해결// 통화
testMultiplication2 삭제?
'책읽기 > TDD:ByExample' 카테고리의 다른 글
TDD_7 (0) | 2020.11.17 |
---|---|
TDD_6 (0) | 2020.11.11 |
TDD_4(값 객체 패턴) (0) | 2020.11.08 |
TDD_3 (0) | 2020.11.06 |
TDD_2 (0) | 2020.11.02 |