2015-05-29 2 views
2

Я читаю книгу Кента Бэка «Испытательное развитие: на пример». В своей книге, есть пример кодирования:Доллар Объект intricacies

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? Является ли пример книги ошибочным? Почему product._amount во втором утверждении не равен 15?

+2

'_amount * = множитель' очень не прав. – SLaks

+0

С моей стороны возникает ошибка ввода: (_amount * = множитель) должен быть (_mount * 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); 
} 

В своей первоначальной форме, оператор *= изменяет _amount переменную экземпляра Dollar класса что вызывается Times. Удаление = изменяет операцию так, чтобы она считывала только значение переменной _amount и использовала ее в расчете.

Смежные вопросы