equals()
hashCode()
Кроме того, если использовать Dollar в качестве ключа хеш-
таблицы, вместе с equals() прид ется реализовать и hashCode(). Добавим
этот пункт в список зад ач и вернемся к нему, когд а это буд ет
необход имо.
Вы вед ь не собираетесь немед ленно приступать к реализации
метод а equals()? Отлично, я тоже об этом не д умаю. Уд арив себя
линейкой по руке, я стал размышлять над тем, как протестировать
равенство. Для начала $5 д олжны быть равны $5:
public void testEquality() {
assertTrue(new Dollar(5). equals(new Dollar(5)));
}
Поло ска окрасилась красным. Под д ельная реализация могла бы
про сто вернуть значение true:
Dollar
public boolean equals(Object object) {
return true;
}
Конечно, мы с вами знаем, что на самом д еле true – это «5 == 5»,
что, в свою очеред ь, означает «amount == 5», что соответствует «amount
== dollar.amount». Но если бы я сразу про след ил все эти шаги, я не смог
бы прод емонстрировать третью и наиболее консервативную метод ику
реализации – триангуляцию.
Если д ве станции слежения, наход ящиеся на известном расстоянии
д руг от д руга, смогут измерить азимут некоторого источника
рад ио сигнала (взять пеленг), этого вполне д о статочно, чтобы
вычислить местоположение источника рад ио сигнала (как вы помните из
курса тригонометрии, в отличие от меня). Это вычисление и называется
триангуляцией.
По аналогии, используя метод триангуляции, мы обобщаем код
только в том случае, когд а у нас д ва примера или больше. При этом мы
ненад олго игнорируем д ублирование межд у тестом и самим код ом
(приложения). Когд а второй пример потребует более общего решения,
тогд а и только тогд а мы выполним обобщение.
Итак, д ля триангуляции нам понад обится второй пример. Как насчет
того, чтобы проверить $5!= $6?
public void testEquality() {
assertTrue(new Dollar(5). equals(new Dollar(5)));
assertFalse(new Dollar(5). equals(new Dollar(6)));
}
Теперь необход имо обобщить равенство (equality):
Dollar
public boolean equals(Object object) {
Dollar dollar = (Dollar)object;
return amount == dollar.amount;
}
$5 + 1 °CHF = $10, если курс обмена 2:1
$5 * 2 = $10
Сд елать переменную amount закрытым членом класса
Побочные эффекты в классе Dollar?
Округление д енежных величин?
equals()
hashCode()
Мы могли бы использовать триангуляцию и д ля управления
обобщением метод а times(). Если бы у нас были примеры $5 * 2 = $10 и
$5 * 3 = $15, нам не смогли бы про сто возвращать константу.
Думаю, триангуляция – д овольно интересная вещь. Я использую ее
в случае, если не знаю, как выполнять рефакторинг. Если же я
пред ставляю, как устранить д ублирование межд у код ом и тестами и
созд ать более общее решение, я про сто созд аю его. С какой стати я
д олжен созд авать еще од ин тест, если сразу могу выполнить
обобщение?
Од нако когд а когд а в голову не приход ит ничего умного,
триангуляция д ает шанс по смотреть на проблему с д ругой стороны.
Сколько степеней свобод ы вы хотите под д ерживать в вашем
приложении (какую степень универсально сти, д ругими словами)?
Про сто попробуйте ввести некоторые из них, и, возможно, ответ станет
очевид нее.
$5 + 1 °CHF = $10, если курс обмена 2:1
$5 * 2 = $10
Сд елать переменную amount закрытым членом класса
Побочные эффекты в классе Dollar?
Округление д енежных величин?
equals()
hashCode()
Равенство значению null
Равенство объектов
Итак, сейчас операция проверки равенства реализована полно стью.
Но как учесть сравнение со значением null и сравнение c д ругими
объектами? Это часто используемые операции, пока они нам еще не
нужны, поэтому мы про сто д обавим их в список зад ач.
Теперь, когд а у нас есть операция проверки равенства, можно
напрямую сравнивать объекты Dollar. Это позволит нам сд елать
переменную amount закрытой, какой и д олжна быть д обропоряд очная
переменная экземпляра. Резюмируем все вышесказанное:
• поняли, что д ля использования шаблона проектирования «Объект-
значение» необход имо реализовать операцию проверки равенства;
• созд али тест д ля этой операции;
• реализовали ее про стейшим спо собом;
• прод олжили тестирование (вместо того, чтобы сразу приступить к
рефакторингу);
• выполнили рефакторинг так, чтобы охватить оба теста сразу.
Do'stlaringiz bilan baham: |