Шрифт:
5.10.1. Постусловия
Формулировка предусловий позволяет улучшить структуру программы и перехватить неправильное использование функций на ранних этапах программирования. Можно ли использовать эту идею где-нибудь еще? Да, на ум сразу приходит оператор
Вернемся к нашей функции, вычисляющей площадь прямоугольника (см. раздел 5.6.1).
Эта функция проверяет предусловия, но они не сформулированы в виде комментариев (для такой короткой функции это вполне допустимо), и считается, что все вычисления проводятся корректно (для таких простых вычислений это также вполне приемлемо). И тем не менее эту функцию можно было написать намного яснее.
Мы не можем проверить выполнение всех постусловий, но можем проверить их часть, убедившись, что возвращаемое число является положительным.
ПОПРОБУЙТЕ
Найдите пару значений, при которых предусловие выполняется, а постусловие — нет.
Пред- и постусловия обеспечивают проверку логичности кода. Они тесно связаны с понятиями инвариантов (раздел 9.4.3), корректности (разделы 4.2 и 5.2), а также с тестированием (глава 26).
5.11. Тестирование
Как определить, когда следует остановить отладку? Ясно, что отладка должна идти до тех пор, пока не будут выявлены все ошибки, — или нам так покажется. А как узнать, что мы нашли последнюю ошибку? Мы не знаем. Последняя ошибка — это шутка программистов. Такой ошибки не существует. В большой программе никогда невозможно найти последнюю ошибку.
Точка зрения 1. Я умнее любой программы! Я могу взломать код @#$%^!
Точка зрения 2. Я вылизывал эту программу две недели. Она идеальна!
Как вы думаете, кто из этих двух программистов найдет больше ошибок? Разумеется, наилучшим вариантом является опытный программист, придерживающийся первой точки зрения и спокойно, хладнокровно, терпеливо и систематически работающий над ошибками. Хорошие тестировщики на вес золота!
Мы стараемся систематически выбирать тестовые варианты и всегда проверять правильные и неправильные входные данные. Первый пример будет приведен в разделе 7.3.
Задание
Ниже приведены двадцать пять фрагментов кода. Каждый из них должен быть впоследствии вставлен в определенное место программы.