π Chapter 13: μ§μ§λ‘ λ§λ€κΈ°
λͺ¨λ μ€λ³΅μ μ κ±°νκΈ° μ κΉμ§λ $5 + $5
ν
μ€νΈμ μλ£ νμλ₯Ό ν μ μλ€. μ½λ μ€λ³΅μ μμ§λ§ λ°μ΄ν° μ€λ³΅μ΄ μλ€. κ°μ§ ꡬνμ μλ $10
λ
// Bank
Money reduce(Expression source, String to) {
return Money.dollar(10);
}
μ¬μ€ ν
μ€νΈ μ½λμ μλ $5 + $5
μ κ°λ€.
public void testSimpleAddition() {
Money five = Money.dollar(5);
Expression sum = five.plus(five);
Bank bank = new Bank();
Money reduced = bank.reduce(sum, "USD");
assertEquals(Money.dollar(10), reduced);
}
μ°μ , Money.plus
λ κ·Έλ₯ Money
κ° μλ Expression(Sum)
μ λ°νν΄μΌ νλ€.
λ Money
μ ν©μ Sum
μ΄μ΄μΌ νλ€.
public void testPlusReturnsSum() {
Money five = Money.dollar(5);
Expression result = five.plus(five);
Sum sum = (Sum) result;
assertEquals(five, sum.augend);
assertEquals(five, sum.addend);
}
μ ν
μ€νΈλ 그리 μ€λκ°μ§ λͺ»ν κ²μ΄λ€. μ ν
μ€νΈλ μννκ³ μ νλ μ°μ°μ μΈλΆ νμκ° μλ λ΄λΆ ꡬνμ λν΄ λ무 κΉκ² κ΄μ¬νκ³ μλ€. κ·Έλ κΈ΄ ν΄λ μΌλ¨ μ΄ ν
μ€νΈλ₯Ό ν΅κ³Όνλ©΄ λͺ©νμ ν κ±Έμ λ λ€κ°κ°κ² λ κ²μ΄λ€. μ΄ μ½λλ₯Ό μ»΄νμΌνκΈ° μν΄μ augend
μ addend
νλλ₯Ό κ°μ§λ Sum
ν΄λμ€κ° νμνλ€.
// Sum
class Sum {
Money augend;
Money addend;
}
Money.plus()
λ Sum
μ΄ μλ Money
λ₯Ό λ°ννκ² λμ΄ μκΈ° λλ¬Έμ, μ΄ μ½λλ ClassCastException
μ λ°μμν¨λ€.
// Money
Expression plus(Money addend) {
return new Sum(this, addend);
}
Sum
μμ±μλ νμνλ€.
// Sum
Sum(Money augend, Money addend) {
this.augend = augend;
this.addend = addend
}
κ·Έλ¦¬κ³ Sum
μ Expression
μ μΌμ’
μ΄μ΄μΌ νλ€.
// Sum
class Sum implements Expression
μ΄μ Bank.reduce()
λ Sum
μ μ λ¬λ°λλ€. λ§μ½ Sum
μ΄ κ°μ§κ³ μλ Money
μ ν΅νκ° λͺ¨λ λμΌνκ³ , reduce
λ₯Ό ν΅ν΄ μ»μ΄λ΄κ³ μ νλ Money
μ ν΅ν μμ κ°λ€λ©΄, κ²°κ³Όλ Sum
λ΄μ μλ Money
λ€μ΄ amount
λ₯Ό ν©μΉ κ°μ κ°λ Money
κ°μ²΄μ¬μΌ νλ€.
public void testPlusReturnsSum() {
Expression sum = new Sum(Money.dollar(3), Money.dollar(4));
Bank bank = new Bank();
Money result = bank.reduce(sum, "USD");
assertEquals(Money.dollar(7), result);
}
νμ‘΄νλ ν
μ€νΈκ° κΉ¨μ§λλ‘ μΈμλ₯Ό μ ννλ€. μ°λ¦¬κ° Sum
μ κ³μ°νλ©΄ κ²°κ³Όλ Money
κ° λμ΄μΌ νλ©°, κ·Έ Money
μ μμ λ Money
μμ ν©μ΄κ³ , ν΅νλ μ°λ¦¬κ° μΆμ½νλ ν΅νμ¬μΌ νλ€.
// Bank
Money reduce(Expression source, String to) {
Sum sum = (Sum) source;
int amount = sum.augend.amount + sum.addend.amount;
return new Money(amount, to);
}
μ΄ μ½λλ λ€μ λ κ°μ§ μ΄μ λ‘ μ§μ λΆνλ€.
- μΊμ€ν
(νλ³ν), μ΄ μ½λλ λͺ¨λ
Expression
μ λν΄ μλν΄μΌ νλ€. - 곡μ©(public) νλμ κ·Έ νλλ€μ λν λ λ¨κ»λ₯Ό κ±ΈμΉ λ νΌλ°μ€.
κ°λ¨ν κ³ μΉ μ μλ λ¬Έμ λ€μ΄λ€.
// Bank - μΆν μμ
Money reduce(Expression source, String to) {
Sum sum = (Sum) source;
return sum.reduce(to);
}
// Sum
public Money reduce(String to) {
int amount = augend.amount + addend.amount;
return new Money(amount, to);
}
λ§λκ° μ΄λ‘μμ΄κ³ μμ μ½λμ λν΄ λ ν κ²μ΄ λͺ ννμ§ μμΌλκΉ μΌλ¨ κ·Έ ν μ€νΈλ₯Ό μμ±νλλ‘ νμ.
public void testReduceMoney() {
Bank bank = new Bank();
Money result = bank.reduce(Money.dollar(1), "USD");
assertEquals(Money.dollar(1), result);
}
// Bank
Money reduce(Expression source, String to) {
if (source instanceof Money) return (Money) source;
Sum sum = (Sum) source;
return sum.reduce(to);
}
μ§μ λΆνλ€, μ§μ λΆν΄. κ·Έλλ μ΄λ‘ λ§λ μνμ΄λ―λ‘ λ¦¬ν©ν λ§μ ν μ μλ€. ν΄λμ€λ₯Ό λͺ
μμ μΌλ‘ κ²μ¬νλ μ½λκ° μμ λμλ νμ λ€νμ±μ μ¬μ©νλλ‘ λ°κΎΈλ κ²μ΄ μ’λ€. Sum
μ reduce(String)
λ₯Ό ꡬννλ―λ‘, Money
λ κ·Έκ²μ ꡬννλλ‘ λ§λ λ€λ©΄ reduce()
λ₯Ό Expression
μΈν°νμ΄μ€μλ μΆκ°ν μ μκ² λλ€.
// Bank
Money reduce(Expression source, String to) {
if (source instanceof Money)
return (Money) source.reduce(to);
Sum sum = (Sum) source;
return sum.reduce(to);
}
// Money
public Money reduce(String to) {
return this;
}
Expression
μΈν°νμ΄μ€μ reduce(String)
λ₯Ό μΆκ°νλ©΄,
// Expression
Money reduce(String to);
μ§μ λΆν μΊμ€ν κ³Ό ν΄λμ€ κ²μ¬ λꡬλ₯Ό μ κ±°ν μ μλ€.
// Bank
Money reduce(Expression source, String to) {
return source.reduce(to);
}