Вход/Регистрация
Программирование. Принципы и практика использования C++ Исправленное издание
вернуться

Страуструп Бьерн

Шрифт:

Перечислим причины, по которым функция

binary_search
не содержала таких проверок.

• Условие

last<first
нельзя проверить для однонаправленного итератора; например, итератор контейнера
std::list
не имеет оператора
<
(раздел Б.3.2). В общем, на самом деле хорошего способа проверки того, что пара итераторов определяет последовательность, не существует (начинать перемещение с итератора
first
, надеясь достигнуть итератора
last
, — не самая хорошая идея).

• Просмотр последовательности для проверки того, что ее значения упорядочены, является более затратным, чем выполнение самой функции

binary_search
(действительная цель выполнения функции
binary_search
заключается не в слепом блуждании по последовательности в поисках значения, как это делает функция
std::find
).

Что же мы могли бы сделать? Мы могли бы при тестировании заменить функцию

binary_search
функцией
b2
(впрочем, только для вызовов функции
binary_search
с помощью итераторов произвольного доступа). В качестве альтернативы мы могли бы взять у разработчика функции
binary_search
ее код, чтобы вставить в нее свой фрагмент.

template<class Iter, class T> // предупреждение:

// содержит псевдокод

bool binary_search (Iter first, Iter last, const T& value)

{

if ( тест включен ) {

if (Iter является итератором произвольного доступа) {

// проверяем, является ли [first:last)

// последовательностью :

if (last<first) throw Bad_sequence;

}

// проверяем является ли последовательность

// упорядоченной:

if (first!=last) {

Iter prev = first;

for (Iter p = ++first; p!=last; ++p, ++ prev)

if (*p<*prev) throw Not_ordered;

}

}

// теперь выполняем функцию binary_search

}

Поскольку смысл условия тест включен зависит от способа организации тестирования (для конкретной системы в конкретной организации), можем оставить его в виде псевдокода: при тестировании своего собственного кода можете просто использовать переменную

test_enabled
. Мы также оставили условие Iter является итератором произвольного доступа в виде псевдокода, поскольку не хотели объяснять свойства итератора. Если вам действительно необходим такой тест, посмотрите тему свойства итераторов (iterator traits) в более подробном учебнике по языку С++.

26.4. Проектирование с учетом тестирования

Приступая к написанию программы, мы знаем, что в итоге она должна быть полной и правильной. Мы также знаем, что для этого ее необходимо тестировать. Следовательно, разрабатывая программу, мы должны учитывать возможности ее тестирования с первого дня. Многие хорошие программисты руководствуются девизом “Тестируй заблаговременно и часто” и не пишут программу, если не представляют себе, как ее тестировать. Размышление о тестировании на ранних этапах разработки программы позволяет избежать ошибок (и помогает найти их позднее). Мы разделяем эту точку зрения. Некоторые программисты даже пишут тесты для модулей еще до реализации самих модулей.

Примеры из разделов 26.3.2.1 и 26.3.3 иллюстрируют эти важные положения.

• Пишите точно определенные интерфейсы так, чтобы вы могли написать для них тесты.

• Придумайте способ описать операции в виде текста, чтобы их можно было хранить, анализировать и воспроизводить. Это относится также к операциям вывода.

• Встраивайте тесты для непроверяемых предположений (assertions) в вызывающем коде, чтобы перехватить неправильные аргументы до системного тестирования.

• Минимизируйте зависимости и делайте их явными.

• Придерживайтесь ясной стратегии управления ресурсами.

С философской точки зрения это можно рассматривать как применение методов модульного тестирования для проверки подсистем и полных систем.

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

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

  • Читать дальше
  • 1
  • ...
  • 434
  • 435
  • 436
  • 437
  • 438
  • 439
  • 440
  • 441
  • 442
  • 443
  • 444
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: