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

Триангуляция (Triangulate)

Триангуляция (Triangulate)

Какой самый консервативный способ позволяет формировать абстракцию при помощи тестов? Делайте код абстрактным только в случае, если у вас есть два или более примера.

Рассмотрим пример. Предположим, мы хотим написать функцию, которая возвращает сумму двух целых чисел. Мы пишем:

public void testSum() {

assertEquals(4, plus(3, 1));

}

private int plus(int augend, int addend) {

return 4;

}

Чтобы получить представление о правильном дизайне, мы добавляем еще один пример:

public void testSum() {

assertEquals(4, plus(3, 1));

assertEquals(7, plus(3, 4));

}

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

private int plus(int augend, int addend) {

return augend + addend;

}

Триангуляция выглядит привлекательно, так как правила ее выполнения вполне понятны. Правила для шаблона «Подделка» (Fake It) основаны на ощущении дублирования кода между тестом и поддельным кодом. Это ощущение может быть субъективным, поэтому правила выглядят несколько туманными. Несмотря на то, что они кажутся простыми, правила триангуляции создают замкнутый цикл. После того как мы написали два выражения assert и сформировали абстрактную корректную реализацию метода plus(), мы можем уничтожить одно из выражений assert, так как теперь оно является избыточным. А сделав это, мы сможем упростить реализацию plus(), чтобы этот метод возвращал константу. После этого нам надо будет снова добавить выражение assert.

Я использую триангуляцию только в случае, если я действительно не уверен, какая абстракция является корректной. В других ситуациях я предпочитаю использовать шаблон «Подделка» (Fake It) или «Очевидная реализация» (Obvious Implementation).

Оглавление книги


Генерация: 0.721. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз