π Chapter 16: λλμ΄, μΆμν
λ€μμ Sum.plus()
μ λν ν
μ€νΈλ€.
public void testSumPlusMoney() {
Expression fiveBucks = Money.dollar(5);
Expression tenFrancs = Money.franc(10);
Bank bank = new Bank();
bank.addRate("CHF", "USD", 2);
Expression sum = new Sum(fiveBucks, tenFrancs).plus(fiveBucks);
Money result = bank.reduce(sum, "USD");
assertEquals(Money.dollar(15), result);
}
fiveBucks
μ tenFrancs
λ₯Ό λν΄μ Sum
μ μμ±ν μλ μμ§λ§ μμ μ½λμμλ λͺ
μμ μΌλ‘ Sum
μ μμ±νλλ°, μ΄κ² λ μ§μ μ μΌλ‘ μ°λ¦¬ μλλ₯Ό λλ¬λΈλ€. μ°λ¦¬κ° μ΄ ν
μ€νΈλ€μ μμ±νλ κ²μ λ¨μ§ μμ μ νλ‘κ·Έλλ° κ²½νμ λ μ¬λ―Έμκ³ λ³΄λμ°¨κ² νλ €κ³ νλ κ²λ§μ΄ μλκ³ , νλκ° μ°λ¦¬μ μ²μ¬μ±μ κ°μν μ μλ λ‘μ νμμ΄ λλλ‘ νκΈ° μν¨μ΄κΈ°λ νλ€.
ν
μ€νΈκ° μ½λλ³΄λ€ λ κΈΈλ€. κ·Έλ¦¬κ³ μ½λλ Money
μ μ½λμ λκ°λ€.
// Sum
public Expression plus(Expression addend) {
return new Sum(this, addend);
}
TDDλ‘ κ΅¬νν λ ν μ€νΈ μ½λμ μ€ μμ λͺ¨λΈ μ½λμ μ€ μκ° κ±°μ λΉμ·ν μνλ‘ λλλ€. TDDκ° κ²½μ μ μ΄κΈ° μν΄μλ λ§€μΌ λ§λ€μ΄ λ΄λ μ½λμ μ€ μκ° λ λ°°κ° λκ±°λ λμΌν κΈ°λ₯μ ꡬννλ μ λ°μ μ€ μλ‘ ν΄λ΄μΌ ν κ²μ΄λ€. TDDκ° μμ μ λ°©λ²μ λΉν΄ μ΄λ»κ² λ€λ₯Έμ§ μ§μ μΈ‘μ ν΄ λ³΄μμΌ ν κ²μ΄λ€. μ΄λ λλ²κΉ , ν΅ν© μμ , λ€λ₯Έ μ¬λμκ² μ€λͺ νλ λ° κ±Έλ¦¬λ μκ° λ±μ μμλ₯Ό λ°λμ ν¬ν¨ν΄μΌ νλ€λ κ²μ κΈ°μ΅νκΈ° λ°λλ€.
μΌλ¨ Sum.times()
κ° μλνκ² λ§λ€ μλ§ μλ€λ©΄ Expression.times()
λ₯Ό μ μΈνλ μΌμ΄μΌ μ΄λ ΅μ§ μμ κ²μ΄λ€. ν
μ€νΈλ λ€μκ³Ό κ°λ€.
public void testSumTimes() {
Expression fiveBucks = Money.dollar(5);
Expression tenFrancs = Money.franc(10);
Bank bank = new Bank();
bank.addRate("CHF", "USD", 2);
Expression sum = new Sum(fiveBucks, tenFrancs).plus(2);
Money result = bank.reduce(sum, "USD");
assertEquals(Money.dollar(20), result);
}
μ΄λ²μλ ν μ€νΈκ° μ½λλ³΄λ€ κΈΈλ€.
// Sum
Expression times(int multiplier) {
return new Sum(augend.times(multiplier), addend.times(multiplier));
}
μ§λ μ₯μμ νΌκ°μ°μ(augend
)μ κΈ°μ(addend
)λ₯Ό Expression
μΌλ‘ μΆμννκΈ° λλ¬Έμ μ½λκ° μ»΄νμΌλκ² λ§λ€λ €λ©΄ Expression
μ times()
λ₯Ό μ μΈν΄μΌ νλ€.
// Expression
Expression times(int multiplier);
μ΄ μμ
λλ¬Έμ Money.times()
μ Sum.times()
μ κ°μμ±μ λμ¬μ€μΌ νλ€.
// Sum
public Expression times(int multiplier) {
return new Sum(augend.times(multiplier), addend.times(multiplier));
}
// Money
public Expression times(int multiplier) {
return new Money(amount * multiplier, currency);
}
ν
μ€νΈκ° ν΅κ³Όνλ€.
λκ° κΉλν μ 리ν΄μΌ ν κ²μ΄ μλ€λ©΄, $5 + $5
λ₯Ό ν λμ Money
λ₯Ό λ°ννλ κ±Έ μ€νν΄ λ³΄λ κ²μ΄λ€. ν
μ€νΈλ λ€μκ³Ό κ°μ κ²μ΄λ€.
public void testPlusSameCurrencyReturnMoney() {
Expression sum = Money.dollar(1).plus(Money.dollar(1));
assertTrue(sum instanceof Money);
}
μ΄ ν μ€νΈλ μΈλΆμ λλ¬λλ κ°μ²΄μ νμμ λν κ²μ΄ μλλΌ κ΅¬ν μ€μ¬μ΄κΈ° λλ¬Έμ μ’ μ§μ λΆνλ€. κ·Έλ κΈ°λ νμ§λ§ μ΄ ν μ€νΈλ μ°λ¦¬κ° μνλ λ³νλ₯Ό κ°ν μ μκ² ν΄μ€λ€. κ²λ€κ° μ΄ ν μ€νΈλ λ¨μ§ μ€νμΌ λΏμ΄λ€. μ΄ ν μ€νΈλ₯Ό ν΅κ³Όμν€κΈ° μν΄ λ€μκ³Ό κ°μ΄ μΈ μ μλ€.
// Money
public Expression plus(Expression addend) {
return new Sum(this, addend);
}
μΈμκ° Money
μΌ κ²½μ°μ, κ·Έλ¦¬κ³ μ€λ‘μ§ κ·Έ κ²½μ°μλ§ μΈμμ ν΅νλ₯Ό νμΈνλ λΆλͺ
νκ³ λ κΉλν λ°©λ²μ΄ μλ€. μ€νμ μ€ν¨νκ³ , μ°λ¦° ν
μ€νΈλ₯Ό μμ νκ³ (μ΄μ°¨νΌ λ³λ‘ μ μ’κ² μκ°νλ ν
μ€νΈμλ€) λ λλ€.