0

我正在阅读测试驱动开发:示例。我在第 13 章。第 12 章和第 13 章介绍了PlusMoney对象的操作。一个Money对象可以被其他Money对象加。

作者在解决方案中添加了两个类(BankSum)和一个接口(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存储两个来自构造函数参数的 Money 对象。它有一种Reduce返回新Money对象的方法(通过添加两个对象的数量创建新对象)

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有一种方法 - 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 和 Sum 的目的是什么?(现在,这对我来说没有任何意义)
  4. 我认为Reduce方法名称对我来说听起来很奇怪。你觉得这是个好名字吗?(请建议)
4

1 回答 1

2

继续阅读。肯特贝克是一个非常聪明的人。他要么有一个很好的理由以这种方式创建示例,稍后会很清楚,要么这是一个糟糕的解决方案。

如果map-reduce是最终目标,“Reduce”是一个非常好的名称。

于 2012-05-01T09:40:51.140 回答