- •4.9.1. Изменяемость
- •4.9.2. Классы операций
- •98 Глава 4
- •4.9.3. Полнота
- •100 Глава 4
- •4.9.5. Операции egual, similar и copy
- •102 Глава 4
- •104 Глава 4
- •5. Исключительные ситуации
- •108 Глава 5
- •110 Глава 5
- •6.2.1. Сигнализация об исключительных ситуациях
- •5.2.2. Обработка исключительных ситуаций
- •112 Глава 5
- •5.2.3. Предложение resignal
- •6.2.4. Необрабатываемые исключительные ситуации
- •114 Глава 5
- •6.2.3. Предложение resignal
- •5.2.4. Необрабатываемые исключительные ситуации
- •116 Глава 5
- •118 Глава 5
- •118 Глава 5
- •120 Глава 5
- •122 Глава 5
- •124 Глава 5
- •128 Глава 6
- •130 Глава 6
- •6.2.1. Реализация итераторов
- •6.2.2. Использование итераторов
- •132 Глава 6
- •134 Глава 6
- •136 Глава 6
- •138 Глава 6
- •140 Глава 7
- •142 Глава 7
- •7.2. Абстракция данных
- •144 Глава 7
- •146 Глава 7
- •148 Глава 7
- •150 Глава 7
- •7.4. Генераторы
- •162 Глава 7
- •154 Глава 7
- •156 Глава 7
- •162 Глава 8
- •164 Глава 8
- •166 Глава 8
- •168 Глава 8
- •170 Глава 9
- •172 Глава 9
- •174 Глава 9
- •176 Глава 9
- •9.1.3. Пример
- •178 Глава 9
- •180 Глава 9
- •182 Глава 9
- •184 Глава 9
- •186 Глава 9
- •188 Глава 9
- •190 Глава 9
- •192 Глава. 9
- •194 Глава 9
194 Глава 9
Когда нам кажется, что причина ошибки установлена, мы изучаем соответствующий участок программы и исправляем ошибку.
Отладка может быть значительно облегчена, если использовать защитное программирование. Оно предполагает использование в программе различных проверок, позволяющих обнаружить вероятную ошибку. В частности, мы должны убедиться в том, что требования в предложении requires удовлетворяются. Также полезно проверить инвариант представления. Эти проверки желательно по возможности сохранить в рабочей версии программы.
Методичность при тестировании, отладке и защитном программировании значительно облегчает работу программиста. Эта работа окупает себя также и при последующей модификации программы.
Дополнительная литература
Beiser, В., 1983. Software Testing Techniques. New York: Van Nostrand Rein-hold.
Goodenough, John., and Susan L. Gerhart, 1975. Toward a theory of test data selection. IEEE Transactions on Software Engineering SE-I (2): 156—173.
Howden, William E., 1981. A survey of dynamic analysis methods. In Tutorial-. Software Testing and Validation Techniques (New York: IEEE Computer Society Press), pp. 209—231.
Weinberg, Gerald, M., 1971. The Psychology of Computer Programming. New York: Van Nostrand Reinhold.
Упражнения
9.1. Разработайте набор тестов для процедуры merge, используя спецификацию, приведенную на рис, 3.5, и реализацию, приведенную на рис. 3.6. Проделайте то же самое для процедур merge.sort и sort. Напишите драйвер для процедуры merge.
9.2. Разработайте набор тестов для процедуры poly (рис. 4.3 и 4.7). Напишите для этой задачи драйвер.
9.3. Разработайте набор тестов и драйвер для процедуры permutations (рис. 6.9).
9.4. В упражнении 5 гл. 4 наборы intset были реализованы при помощи упорядоченных списков olist. Подумайте, заглушки какого типа вы использовали бы для списков olist при проверке реализации intset.
9.5. Структурированная по блокам таблица символов в упр. 6 гл. 6 может быть реализована с помощью блоков и карт. Сделайте набросок такой реализации. Затем рассмотрите, как при тестировании syrntab вы могли бы использовать заглушки для этих двух абстракций.
9.6. Напишите итератор, выдающий числа Фибоначчи. (Число Фибоначчи представляет собой сумму двух предыдущих чисел Фибоначчи, а первое число Фибоначчи есть 0. Например, первые семь чисел Фибоначчи есть 0, 1, 2, 3, 5 и 8.) Перед отладкой определите тестовые наборы. Затем отладьте вашу программу и сообщите, насколько успешными оказались тесты.
9.7. Разработайте для себя профильный файл ошибок. Заведите журнал, в который записывайте ошибки в ваших программах. Для каждой ошибки записывайте ее причину и ищите закономерности.
Написание формальных Спецификаций
Большинство спецификаций в данной книге написаны квази-зрмально, без использования строгих правил. Фактически они Представляют собой сильно стилизованные комментарии. Мы 1выбрали неформальные спецификации, исходя из следующих воображений.
^ 1. Хотя формальные спецификации и принадлежат к много-^обещающим областям в исследованиях методов программирования, ^выгода от их применения при разработке различного программного обеспечения еще должна быть продемонстрирована.
2. Овладение техникой написания формальных спецификаций требует времени. Мы не думаем, что в течение односеместро-вого курса студенты могут освоить формальные спецификации вместе с другими материалами из этой книги.
3. Написание формальных спецификаций затруднено также и тем, что для этого требуется некоторая машинная поддержка. По крайней мере необходимы средства проверки синтаксиса и типа. Большинство читателей данной книги такими средствами не обладают.
В данной главе мы рассмотрим язык, используемый для написания формальных спецификаций. Мы убеждены, что студенты должны быть знакомы с формальными спецификациями хотя бы на уровне книги и что это знание окажет большую помощь при написании неформальных спецификаций.
Вспомните, что наши неформальные спецификации абстракций данных включают раздел, в котором дается интуитивное описание определяемого типа. Обычно это описание ссылается на некоторую область, с которой пользователи предположительно знакомы. Например, мы определяем набор intset в терминах математических наборов и poly в терминах полиномов над полем целых чисел. Проблема, связанная с использованием неформальных спецификаций, заключается в том, что такие дополнительные области никогда не определяются четко. Если читатели имеют интуитивное понимание материала из затронутой области и это их представление соответствует рассматриваемому, то они будут в состоянии понять спецификации, в противном случае — нет. Что еще хуже, и это говорилось вгл,8,—- нет способа узнать, интерпретирует ли 7*
