Экстремальное программирование. Разработка через тестирование | страница 30




Money

static Money dollar(int amount) {

return new Dollar(amount,«USD»);

}


Dollar

Dollar(int amount, String currency) {

this.amount = amount;

this.currency = currency;

}

Money times(int multiplier) {

return Money.dollar(amount * multiplier);

}


И это сработало с первого раза. Классно!

Подобная настройка скорости весьма характерна для TDD. Вам кажется, что слишком маленькие шажки ограничивают вас? Попробуйте двигаться быстрее. Почувствовали неуверенность? Переходите на короткий шаг. TDD – это процесс плавного управления – немного в одну сторону, немного в другую сторону. Не существует одного-единственного наиболее правильного размера шага, ни сейчас, ни в будущем.

Теперь два конструктора выглядят абсолютно одинаково, и мы можем переместить реализацию в базовый класс:


Money

Money(int amount, String currency) {

this.amount = amount;

this.currency = currency;

}


Franc

Franc(int amount, String currency) {

super(amount, currency);

}


Dollar

Dollar(int amount, String currency) {

super(amount, currency);

}

$5 + 1 °CHF = $10, если курс обмена 2:1

$5 * 2 = $10

Сделать переменную amount закрытым (private) членом

Побочные эффекты в классе Dollar?

Округление денежных величин?

equals()

hashCode()

Равенство значению null

Равенство объектов

5 CHF * 2 = 1 °CHF

Дублирование Dollar/Franc

Общие операции equals()

Общие операции times()

Сравнение франков (Franc) и долларов (Dollar)

Валюта?

Нужен ли тест testFrancMultiplication()?


Мы уже почти готовы переместить реализацию times() в базовый класс, но прежде вспомним, что в данной главе мы

• на некоторое время заблудились в крупномасштабных идеях дизайна и, чтобы разобраться в проблеме, решили начать с решения небольшой задачи, на которую мы уже обратили внимание ранее;

• сделали одинаковыми два конструктора, переместив отличающийся код в вызывающий (фабричный) метод;

• на короткое время отвлеклись от рефакторинга, чтобы добавить в метод times() вызов фабричного метода;

• выполнили аналогичный рефакторинг в отношении класса Dollar за один большой шаг;

• получили два абсолютно идентичных конструктора и переместили код в базовый класс.

10. Избавление от двух разных версий times()

$5 + 1 °CHF = $10, если курс обмена 2:1

$5 * 2 = $10

Сделать переменную amount закрытым (private) членом

Побочные эффекты в классе Dollar?

Округление денежных величин?

equals()

hashCode()

Равенство значению null

Равенство объектов

5 CHF * 2 = 1 °CHF

Дублирование Dollar/Franc

Общие операции equals()

Общие операции times()

Сравнение франков (Franc) и долларов (Dollar)