д руг от д руга, смогут измерить азимут некоторого источника
рад ио сигнала (взять пеленг), этого вполне д о статочно, чтобы
вычислить местоположение источника рад ио сигнала (как вы помните из
курса тригонометрии, в отличие от меня). Это вычисление и называется
триангуляцией.
По
аналогии, используя метод триангуляции, мы обобщаем код
только в том случае, когд а у нас д ва примера или больше. При этом мы
ненад олго игнорируем д ублирование межд у тестом и самим код ом
(приложения). Когд а второй пример
потребует более общего решения,
тогд а и только тогд а мы выполним обобщение.
Итак, д ля триангуляции нам понад обится второй пример. Как насчет
того, чтобы проверить $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 закрытой, какой и д олжна быть д обропоряд очная
переменная экземпляра. Резюмируем все вышесказанное:
• поняли, что д ля использования шаблона проектирования «Объект-
значение» необход имо реализовать операцию проверки равенства;
• созд али тест д ля этой операции;
• реализовали ее про стейшим спо собом;
• прод олжили тестирование (вместо того, чтобы сразу приступить к
рефакторингу);
• выполнили рефакторинг так, чтобы охватить оба теста сразу.