2015-05-29 43 views
2

我正在閱讀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); 
} 

據肯特,第二個美元對象「的產品,」爲了保持原來的「十二五」美元對象是必要的;但是,第二個斷言返回false,因爲product._amount等於30.我一直無法在此文本中找到任何勘誤。爲了讓第二個斷言等於true或15 == 15,Kent的代碼如何改變?這本書的例子有缺陷嗎?爲什麼第二個斷言中的product._amount不等於15?

+2

'_amount * = multiplier'是非常錯誤的。 – SLaks

+0

我的部分有一個打字錯誤:(_amount * = multiplier)應該是(_amount * multiplier)。謝謝SLaks –

+0

你確定你沒有做'product.Times(3)'?我看不到你如何得到30. –

回答

0

正如在評論中有人說,這樣的:

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

應該是:

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

在其原來的形式,在*=運營商修改Dollar類的實例的_amount變量Times被調用。刪除=將更改操作,以便它只讀取_amount變量的值並在計算中使用它。