< 현재 구현해야할 목록 >
Dollar 와 Franc의 times code가 거의 같다.
양쪽 모두 Money를 반환하게 만들면 더 비슷하게 만들 수 있다.
// Dollar
public class Dollar extends Money {
public Dollar(int amount) {
this.amount = amount;
}
Money times(int multiplier) {
return new Dollar( amount * multiplier);
}
public boolean equals(Object object) {
Money money = (Money) object;
return amount == money.amount;
}
}
// Franc
public class Franc extends Money{
public Franc(int amount) {
this.amount = amount;
}
Money times(int multiplier) {
return new Franc( amount * multiplier);
}
public boolean equals(Object object) {
Money money = (Money) object;
return amount == money.amount;
}
}
하위 class에 대한 참조가 적어진다면 발전을 이뤘다고 할 수 있다.
public class Money {
protected int amount;
public boolean equals(Object object) {
Money money = (Money) object;
return amount == money.amount && getClass().equals(money.getClass());
}
static Dollar dollar(int amount) {
return new Dollar(amount);
}
}
@Test
public void testMultiplication() {
Money five = Money.dollar(5);
assertEquals(new Dollar(10), five.times(2));
assertEquals(new Dollar(15), five.times(3));
}
abstract class Money {
protected int amount;
abstract Money times(int multiplier);
public boolean equals(Object object) {
Money money = (Money) object;
return amount == money.amount && getClass().equals(money.getClass());
}
static Money dollar(int amount) {
return new Dollar(amount);
}
}
abstract class Money {
protected int amount;
abstract Money times(int multiplier);
public boolean equals(Object object) {
Money money = (Money) object;
return amount == money.amount && getClass().equals(money.getClass());
}
static Money dollar(int amount) {
return new Dollar(amount);
}
static Money franc(int amount) {
return new Franc(amount);
}
}
< 현재 구현해야할 목록 >
다음 장에서 times() 중복을 걷어낼 것이다.
지금까지 우리는