Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Бек К. -> "Экстремальное программирование: разработка через тестирование " -> 16

Экстремальное программирование: разработка через тестирование - Бек К.

Бек К. Экстремальное программирование: разработка через тестирование — СПб.: Питер, 2003. — 224 c.
ISBN 5-8046-0051-6
Скачать (прямая ссылка): bek-k..pdf
Предыдущая << 1 .. 10 11 12 13 14 15 < 16 > 17 18 19 20 21 22 .. 81 >> Следующая


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

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

equols()

hashCodeO

Равенство значению null Равенство объектов 5 СНГ * 2 - 10 CHF Дублирование Dollar/Franc Общие операция cquals() Общие операции times()

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

В конце главы 6 перед налги встал интересный вопрос: что будет, если мы сравним франки и доллары? Мы немедленно добавили соответствующий пункт в список предстоящих задач. Нам никак не избавиться от этой мысли. И в самом деле, что произойдет?

public void testEqualityO {

assertTrue(new Dollar(5).equals(new Dollar(5))): assertFa1se(new DoIlar(5).equals(new Dollar(6))): assertTrue(new Franc(5).equals(new Franc(5))); assertFa1se(new Franc(5).equals(new Franc(6))): assertFalse(new Franc(5).equals(new Dollar(5))):

}

Тест не срабатывает. C точки зрения написанного нами кода доллары — это франки. Прежде чем у наших швейцарских клиентов глаза на лоб полезут, давайте попробуем исправить код. Код сравнения двух денежных значений должен убедиться в том, что он не сравнивает доллары с франками. Чтобы убедиться в этом, мы должны проанализировать классы двух сравниваемых объектов, — два объекта класса Money считаются равными только в том случае, если у них равны значения amount и классы.

Money

public boolean equals(0bject object) { Money money= (Money) object; return amount money.amount

&& getClass().equals(money.getClass()):

}

Использование классов подобным образом в разрабатываемом нами коде, по правде сказать, отдает неприятным запашком. Было бы лучше, если бы мы воспользовались критерием, который обладает смыслом в области финансов, а не в области объектов языка Java. Однако на текущий момент в нашей программе еще нет ничего, что соответствовало бы финансовому понятию «валюта», и пока я не вижу достаточно весомой причины для того, чтобы вводить в программу подобное понятие. Таким образом, пока что мы оставим код таким, какой он есть.

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

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

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

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

equals()

hashCode()

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

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

5 CHF * 2 = 10 CHF

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

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

Общие операции timesO 1

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

Валюта?

Теперь пришла пора избавиться от дублирующегося кода методов times(), после этого мы могли бы перейти к реализации смешанной валютной арифметики. Однако прежде чем продвинуться дальше, подведем итоги данной главы:

• мы превратили мучающее нас сомнение в тест;

• добились срабатывания теста приемлемым, но не идеальным способом, — getClass();

• решили не добавлять в программу какой-либо дополнительный дизайн до тех пор, пока у нас не появится более весомая мотивация.

Создание объектов

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

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

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

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

equalsQ

hashCodeO

Равенство значению null Равенство объектов 5CHF*2- 10 СНГ Дублирование Dollar/Franc

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

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

Єрові id їмо франков (Franc) и долларов (Dollar)

Валюта?

Две разные реализации метода times() выглядят на удивление похоже: Franc

Franc timesdnt multiplier) {

return new Franc(amount * multiplier) } < Dollar

Dollar timesdnt multiplier) {

return new Dollar(amount * multiplier)

}

Мы можем сделать их еще более похожими, для этого изменим тип возвращаемого значения на Money:

Franc

Money timesdnt multiplier) {

return new Franc(amount * multiplier)

Dollar

Money timesdnt multiplier) {

return new Dollar(amount * multiplier)

}

Следующий шаг вперед неочевиден. Два подкласса, являющихся производными по отношению к классу Money, мало чем отличаются друг от друга. Возникает желание избавиться от них. Однако мы не можем сделать это за один большой шаг, так как это нельзя будет назвать наглядной демонстрацией методики TDD.

Но что же делать? Полагаю, мы сможем приблизиться к решению задачи об уничтожении подклассов, если избавимся от прямых ссылок на подклассы. Для этого мы можем добавить в класс Money фабричный метод (Factory Method), который возвращал бы объект класса Dollar. Этот метод можно было бы использовать следующим образом:

public void testMultiplicationO { Dollar five= Money.dollаг(5): assertEquals(new Dollar(lO), five.timesO)); assertEquals(new Dollar(15), five.timesO)):

}

Реализация этого метода создает объект класса Dollar и возвращает его: Money

static Dollar dollar(int amount) { return new Dollar(amount):

}

Однако мы хотим избавиться от ссылок на Dollar, поэтому в коде теста мы должны изменить объявление объектной переменной:

public void testMultiplicationO { Money five= Money.dollar(5): assertEquals(new Dollar(lO). five.timesO)): assertEquals(new DoIlar(15). five.timesO));
Предыдущая << 1 .. 10 11 12 13 14 15 < 16 > 17 18 19 20 21 22 .. 81 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100