0

私はテスト駆動開発を読んでいます:例によって。私は第13章にいます。第12章と第13章では、オブジェクトPlusに操作を導入しました。オブジェクトは他のオブジェクトによってプラスすることができMoneyます。MoneyMoney

著者は、ソリューションに2つのクラス(BankSum)と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);
    }
}

Bank1つの方法があります- Reduce。着信IExpression引数のReduceメソッドを呼び出すだけです。

public class Bank
{
    public Money Reduce(IExpression source, string to)
    {
        return source.Reduce(to);
    }
}

IExpressionMoneyとによって実装されたインターフェースですSum

public interface IExpression
{
    Money Reduce(string to);
}

これらは私の質問です。

  1. Bankこの段階では、ソリューションには何の役にも立ちません。なぜ必要なのですか?
  2. クラスSum内でMoneyオブジェクトを作成して返すことができるので、なぜ必要なのですか(作成者が行ったように)?PlusMoneyTimes
  3. Bank and Sumの目的は何ですか?(今のところ、それは私には意味がありません)
  4. Reduceメソッド名としては奇妙に聞こえると思います。いい名前だと思いますか?(提案してください)
4

1 に答える 1

2

読み続けます。ケント・ベックはとても賢い男です。彼がそのように例を作成した理由が非常によくあり、後で明らかになるか、それとも不十分な解決策であるかのどちらかです。

map-reduceが最終的な目標である場合、「Reduce」は非常に良い名前です。

于 2012-05-01T09:40:51.140 に答える