๐ Chapter 14: ๋ฐ๊พธ๊ธฐ
2ํ๋์ด ์๋๋ฐ ์ด๊ฑธ ๋ฌ๋ฌ๋ก ๋ฐ๊พธ๊ณ ์ถ๋ค.
public void testReduceMoneyDifferentCurrency() {
Bank bank = new Bank();
bank.addRate("CHF", "USD", 2);
Money result = bank.reduce(Money.franc(2), "USD");
assertEquals(Money.dollar(1), result);
}
๋๋ ํ๋์ ๋ฌ๋ฌ๋ก ๋ณํํ ๋ ๋๋๊ธฐ 2๋ฅผ ํ๋ค. ๋ค์ ํ ์ค์ ์ง์ ๋ถํ ์ฝ๋๋ฉด ์ด์ด ๋ง๋๋ฅผ ๋ณผ ์ ์๋ค.
// Money
public Money reduce(String to) {
int rate = (currency.equals("CHF") && to.equals("USD")) ? 2 : 1;
return new Money(amount / rate, to);
}
ํ์จ์ ๋ํ ์ผ์ ๋ชจ๋ Bank
๊ฐ ์ฒ๋ฆฌํด์ผ ํ๋ค. Expression.reduce()
์ ์ธ์๋ก Bank
๋ฅผ ๋๊ฒจ์ผ ํ ๊ฒ์ด๋ค. ์ฐ์ ํธ์ถํ๋ ๋ถ๋ถ์ ์์ฑํ์.
// Bank
Money reduce(Expression source, String to) {
return source.reduce(this, to);
}
๊ทธ๋ฆฌ๊ณ ๊ตฌํ ๋ถ๋ถ.
// Expression
Money reduce(Bank bank, String to);
// Sum
public Money reduce(Bank bank, String to) {
int amount = augend.amount + addend.amount;
return new Money(amount, to);
}
// Money
public Money reduce(Bank bank, String to) {
int rate = (currency.equals("CHF") && to.equals("USD")) ? 2 : 1;
return new Money(amount / rate, to);
}
์ธํฐํ์ด์ค์ ์ ์ธ๋ ๋ฉ์๋๋ ๊ณต์ฉ์ด์ด์ผ ํ๋ฏ๋ก Money
์ reduce()
๋ ๊ณต์ฉ์ด์ด์ผ ํ๋ค. ์ด์ ํ์จ์ Bank
์์ ๊ณ์ฐํ ์ ์๊ฒ ๋๋ค.
// Bank
int rate(String from, String to) {
return (from.equals("CHF") && to.equals("USD")) ? 2 : 1;
}
๊ทธ๋ฆฌ๊ณ ์ฌ๋ฐ๋ฅธ ํ์จ์ bank
์๊ฒ ๋ฌผ์ด๋ณด์.
// Money
public Money reduce(Bank bank, String to) {
int rate = bank.rate(currency, to);
return new Money(amount / rate, to);
}
๊ท์ฐฎ์ 2๊ฐ ์์ง๋ ํ
์คํธ์ ์ฝ๋ ๋ ๋ถ๋ถ์ ๋ชจ๋ ๋์จ๋ค. ์ด๊ฑธ ์์ ๋ฒ๋ฆฌ๋ ค๋ฉด Bank
์์ ํ์จํ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ฐ ํ์ํ ๋ ์ฐพ์๋ณผ ์ ์๊ฒ ํด์ผํ๋ค. ํค๋ฅผ ์ํ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด์ผ๊ฒ ๋ค.
// Pair
private class Pair {
private String from;
private String to;
Pair(String from, String to) {
this.from = from;
this.to = to;
}
public boolean equals(Object object) {
Pair pair = (Pair) object;
return from.equals(pair.from) && to.equals(pair.to);
}
public int hashCode() {
return 0;
}
}
0์ ์ต์ ์ ํด์ ์ฝ๋๋ค. ํ์ง๋ง ๊ตฌํํ๊ธฐ ์ฝ๊ณ ์ฐ๋ฆฌ๊ฐ ๋นจ๋ฆฌ ๋ฌ๋ฆด ์ ์๋๋ก ๋์์ค๋ค๋ ์ฅ์ ์ด ์๋ค. ํด์ ์ฝ๋๋ฅผ ์ด๋๋ก ๋๋ค๋ฉด ํด์ ํ ์ด๋ธ์์์ ๊ฒ์์ด ๋ง์น ์ ํ ๊ฒ์๊ณผ ๋น์ทํ๊ฒ ์ํ๋ ๊ฒ์ด๋ค. ๋์ค์ ๋ง์ ํตํ๋ฅผ ๋ค๋ค์ผ ํ ์ผ์ด ์๊ธฐ๋ฉด ๊ทธ๋ ์ค์ ์ธก์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ๊ฐ์ ํ๊ฒ ๋ ๊ฒ์ด๋ค. ์ผ๋จ, ํ์จ์ ์ ์ฅํ ๋ญ๊ฐ๊ฐ ํ์ํ๋ค.
// Bank
private Hashtable rates = new Hashtable();
ํ์จ์ ์ฑ์ ํ ์๋ ์์ด์ผ ํ๋ค.
// Bank
void addRate(String from, String to, int rate) {
rates.put(new Pair(from, to), new Integer(rate));
}
๊ทธ๋ฆฌ๊ณ ํ์ํ ๋ ํ์จ์ ์ป์ด๋ผ ์๋ ์์ด์ผ ํ๋ค.
// Bank
int rate(String from, String to) {
Integer rate = (Integer) rates.get(new Pair(from, to));
return rate.intValue();
}
์ ๊น! ๋นจ๊ฐ ๋ง๋๋ค. ๋ฌด์จ ์ผ์ผ๊น? ์ฌ๊ธฐ์ ๊ธฐ ์กฐ๊ธ ๊ธฐ์๊ฑฐ๋ ค ๋ณด๋ฉด, USD์์ USD๋ก์ ํ์จ์ ์์ฒญํ๋ฉด ๊ทธ ๊ฐ์ด 1์ด ๋์ด์ผ ํ๋ค๊ณ ๊ธฐ๋ํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ๋ป๋ฐ์ ์ผ์ด๋ฏ๋ก, ์ข ์ ์ ์ฐ๋ฆฌ๊ฐ ๋ฐ๊ฒฌํ ๋ด์ฉ์ ๋์ค์ ์ฝ๋๋ฅผ ์ฝ์ด๋ณผ ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ๋ ์๋ ค ์ฃผ๊ธฐ ์ํด ํ ์คํธ๋ก ๋ง๋ค์ด ๋์.
public void testIdentityRate() {
assertEquals(1, new Bank().rate("USD", "USD"));
}
์ด์ ์๋ฌ๊ฐ ์ด ๋ ๊ฐ๋ค. ํ์ง๋ง ํ ๊ณณ๋ง ๋ฐ๊ฟ ์ฃผ๋ฉด ๋ ๊ฐ๊ฐ ๋ชจ๋ ์์ด์ง ๊ฒ์์ ์ ์ ์๋ค.
// Bank
int rate(String from, String to) {
if (from.equals(to)) return 1;
Integer rate = (Integer) rates.get(new Pair(from, to));
return rate.intValue();
}
์ด๋ก ๋ง๋!