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

Читать онлайн книгу Экстремальное программирование. Разработка через тестирование - Кент Бек страница 6

СКАЧАТЬ выглядеть операция снаружи. Конечно, наши представления не всегда будут находить воплощение, но в любом случае стоит начать с наилучшего возможного программного интерфейса (API) и при необходимости вернуться назад, чем сразу делать вещи сложными, уродливыми и «реалистичными».

      Простой пример умножения[4]:

      public void testMultiplication() {

      Dollar five = new Dollar(5);

      five.times(2);

      assertEquals(10, five.amount);

      }

      (Знаю, знаю: публичные поля, побочные эффекты, целые числа для денежных величин и все такое. Маленькие шаги – помните? Мы отметим, что где-то есть душок[5], и продолжим дальше. У нас есть тест, который не выполняется, и мы хотим как можно скорее увидеть зеленую полоску[6].)

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

      $5 * 2 = $10

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

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

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

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

      • нет класса Dollar;

      • нет конструктора;

      • нет метода times(int);

      • нет поля (переменной) amount.

      Устраним их одну за другой. (Я всегда ищу некоторую численную меру прогресса.) От одной ошибки мы избавимся, определив класс Dollar:

      Dollar

      class Dollar

      Одной ошибкой меньше, осталось еще три. Теперь нам понадобится конструктор, причем совершенно необязательно, чтобы он что-то делал – лишь бы компилировался.

      Dollar

      Dollar(int amount) {

      }

      Осталось две ошибки. Необходимо создать заготовку метода times(). Снова мы выполним минимум работы, только чтобы заставить тест компилироваться:

      Dollar

      void times(int multiplier) {

      }

      Теперь осталась только одна ошибка. Чтобы от нее избавиться, нужно создать поле (переменную) amount:

      Dollar

      int amount;

      Отлично! Теперь можно запустить тест и убедиться, что он не выполняется: ситуация продемонстрирована на рис. 1.1.

      Загорается зловещий красный индикатор. Фреймворк тестирования (JUnit в нашем случае) выполнил небольшой фрагмент кода, с которого мы начали, и выяснил, что вместо ожидаемого результата «10» получился «0». Ужасно…

      Рис. 1.1. Прогресс! Тест терпит неудачу

      Вовсе нет! Неудача – это тоже прогресс. Теперь у нас есть конкретная мера неудачи. Это лучше, чем просто догадываться, что у нас что-то не так. Наша задача «реализовать мультивалютность» превратилась в «заставить СКАЧАТЬ



<p>4</p>

Название метода times() можно перевести на русский как «умножить на». – Примеч. пер.

<p>5</p>

Код с душком (code that smells) – распространенная в XP метафора, означающая плохой код (содержащий дублирование). – Примеч. пер.

<p>6</p>

Имеется в виду индикатор успешного выполнения тестов в среде JUnit, имеющий форму полосы. Если все тесты выполнились успешно, полоса становится зеленой. Если хотя бы один тест потерпел неудачу, полоса становится красной. – Примеч. пер.