美元对象的复杂性

Dollar Object intricacies

我正在读 Kent Beck 的书"Test Driven Development: By Example."在他的书中,有一个编码示例:

public class Dollar
{
    public int _amount;
    public Dollar(int amount)
    {
        _amount = amount;
    }
    public Dollar Times(int multiplier)
    {
        return new Dollar(_amount *= multiplier);
    }
}

[TestMethod]
public void TestMethod2()
{                        
    Dollar five = new Dollar(5);
    Dollar product = five.Times(2);
    Assert.AreEqual(10, product._amount);
    product = five.Times(3);
    Assert.AreEqual(15, product._amount);
}

根据 Kent 的说法,第二个 Dollar 对象:"product," 是必要的,以保留原始的 "five" dollar 对象;但是,第二个断言 returns 为假,因为 product._amount 等于 30。我一直无法在本文中找到任何勘误表。为了使第二个断言等于 true 或 15 == 15,Kent 上面的代码需要如何更改?这本书的例子有缺陷吗?为什么第二个断言中的 product._amount 不等于 15?

正如评论中所说,这:

public Dollar Times(int multiplier) {
    return new Dollar(_amount *= multiplier);
}

应该是:

public Dollar Times(int multiplier) {
    return new Dollar(_amount * multiplier);
}

在其原始形式中,*= 运算符修改调用 TimesDollar class 实例的 _amount 变量。删除 = 会更改操作,以便它仅读取 _amount 变量的值并在计算中使用它。