私はテスト駆動開発を読んでいます:例によって。私は第13章にいます。第12章と第13章では、オブジェクトPlus
に操作を導入しました。オブジェクトは他のオブジェクトによってプラスすることができMoney
ます。Money
Money
著者は、ソリューションに2つのクラス(Bank
とSum
)と1つのインターフェイス(IExpression
)を追加しました。これが最終的な解決策のクラス図です。
Money
店舗の金額と通貨(例:10米ドル、5バーツ、20スイスフラン)。Plus
メソッドはオブジェクトを返しますSum
。
public class Money : IExpression
{
private const string USD = "USD";
private const string CHF = "CHF";
public int Amount { get; protected set; }
public string Currency { get; private set; }
public Money(int value, string currency)
{
this.Amount = value;
this.Currency = currency;
}
public static Money Dollar(int amount)
{
return new Money(amount, USD);
}
public static Money Franc(int amount)
{
return new Money(amount, CHF);
}
public Money Times(int times)
{
return new Money(this.Amount * times, this.Currency);
}
public IExpression Plus(Money money)
{
return new Sum(this, money);
}
public Money Reduce(string to)
{
return this;
}
public override bool Equals(object obj)
{
var money = obj as Money;
if (money == null)
{
throw new ArgumentNullException("obj");
}
return this.Amount == money.Amount &&
this.Currency == money.Currency;
}
public override string ToString()
{
return string.Format("Amount: {0} {1}", this.Amount, this.Currency);
}
}
Sum
コンストラクター引数からの2つのMoneyオブジェクトを格納します。Reduce
新しいオブジェクトを返すメソッドが1つありMoney
ます(2つのオブジェクトを追加して新しいオブジェクトを作成します)
public class Sum : IExpression
{
public Money Augend { get; set; }
public Money Addend { get; set; }
public Sum(Money augend, Money addend)
{
this.Augend = augend;
this.Addend = addend;
}
public Money Reduce(string to)
{
var amount = this.Augend.Amount + this.Addend.Amount;
return new Money(amount, to);
}
}
Bank
1つの方法があります- Reduce
。着信IExpression
引数のReduceメソッドを呼び出すだけです。
public class Bank
{
public Money Reduce(IExpression source, string to)
{
return source.Reduce(to);
}
}
IExpression
Money
とによって実装されたインターフェースですSum
。
public interface IExpression
{
Money Reduce(string to);
}
これらは私の質問です。
Bank
この段階では、ソリューションには何の役にも立ちません。なぜ必要なのですか?- クラス
Sum
内でMoneyオブジェクトを作成して返すことができるので、なぜ必要なのですか(作成者が行ったように)?Plus
Money
Times
- Bank and Sumの目的は何ですか?(今のところ、それは私には意味がありません)
Reduce
メソッド名としては奇妙に聞こえると思います。いい名前だと思いますか?(提案してください)