Money Class
종목 | 주 | 가격 | 합계 |
---|---|---|---|
IBM | 1000 | 25 | 25000 |
GE | 400 | 100 | 40000 |
합계 | 65000 |
다중 통화를 지원하는 Money Class
종목 | 주 | 가격 | 합계 |
---|---|---|---|
IBM | 1000 | 25USD | 25000USD |
GE | 400 | 150CHF | 60000CHF |
합계 | 65000USD |
환율 Class
기준 | 변환 | 환율 |
---|---|---|
CHF | USD | 1.5 |
할 일
$5 + 10CHF = $10 (환율이 2:1일 경우)
$5 x 2 = $10
amount를 private으로 만들기
Dollar 부작용?
Money 반올림?
할 일
$5 + 10CHF = $10 (환율이 2:1일 경우)
~~$5 x 2 = $10~~
amount를 private으로 만들기
Dollar 부작용?
Money 반올림?
할 일
$5 + 10CHF = $10 (환율이 2:1일 경우)
~~$5 x 2 = $10~~
amount를 private으로 만들기
~~Dollar 부작용?~~
Money 반올림?
**equals()**
hashCode()
Equal null
Equal object
초록막대를 보기 위한 전략 세번째:
임시 변수인 product를 없애면, 일련의 오퍼레이션이 아니라 참인 명제에 대한 단언들이므로 우리의 의도를 더 명확하게 이야기해준다.
Dollar의 amount 인스턴스 변수를 사용하는 코드는 Dollar 자신밖에 없게 됐다. 따라서 변수를 private으로 변경할 수 있다.
할 일
$5 + 10CHF = $10 (환율이 2:1일 경우)
$5 x 2 = $10
amount를 private으로 만들기
Dollar 부작용?
Money 반올림?
equals()
hashCode()
Equal null
Equal object
할 일
$5 + 10CHF = $10 (환율이 2:1일 경우)
$5 x 2 = $10
amount를 private으로 만들기
Dollar 부작용?
Money 반올림?
equals()
hashCode()
Equal null
Equal object
5CHF x 2 = 10CHF
$5 + 10CHF = $10 (환율이 2:1일 경우)에 접근하기 위해서 우선 Franc 클래스를 생성한다. Dollar 클래스를 복사해서 Franc 클래스를 만들면 해결.
공용 equals
Dollar 와 Franc은 공통 기능을 갖는다. equals 기능을 상위클래스를 이용해 refactoring 하자.
Franc과 Dollar 비교하기
문제점: assertFalse(new Franc(5).equals(new Dollar(5)));
가 실패한다.
Dollar과 Franc의 차이점을 만들어야 한다.
&& getClass().equals(money.getClass());
equals에 클래스도 비교하는 조건을 추가한다.
Dollar/Franc 중복
두 times() 구현이 똑같다
class Money{
static Dollar dollar(int amount){
return new Dollar(amount);
}
static Franc franc(int amount){
return new Franc(amount);
}
}
통화?
테스트 단위가 커서 오류가 생겼을 경우 줄일 수 있어야 한다.
class Money{
static Money dollar(int amount){
return new Dollar(amount, "USD");
}
}
class Dollar{
private String currency;
Dollar(int amount, String currency) {
this.amount = amount;
this.currency = currency;
}
Money times(int multiplier) {
return Money.dollar(amount * multiplier);
}
}
공용 times
Franc 과 Dollar에 구현되어있던 times() 메서드를 상위클래스로 옮기기 위해 생성자를 Money로 변경
eqauls에서 Class를 비교하지 않고 이제 currency를 비교하도록 설정.
이제 Dollar, Franc 클래스는 생성자만 가지므로 삭제가능하다.
Money 클래스만 남기고 나머지를 삭제한다.
간단한 덧셈을 먼저 구현하기에 앞서, 계산에 필요한 비유를 신중히 고민.
테스트를 구현하기 위해 클래스를 생성하여 복잡하지만 직관적으로 해결
Expression.plus를 마치려면 Sum.plus를 구현해야하고 Expression.times()를 구현하면 완성된다.