|
Программирование >> Проектирование интерфейса пользователя
рассмотренные выше. Часто ошибку можно устранить с помощью программного обработчика. Иногда достаточно просто зафиксировать ее, а затем попытаться обойти . Возможность установить закономерность возникновения ошибки - это уже немало. В программах, предполагающих диалог с пользователем, нередко бывает достаточно вывесить на экран окно с подробным объяснением случившегося. Представьте себе программу, которая должна подключаться к сетевым ресурсам. Если соединения нет, программа работать не будет. Сообщите об этом пользователю и предложите способы выхода из создавшейся ситуации. В тестовых процедурах могут применяться специальные конструкции и приемы, позволяющие выявить потенциальные ошибки. Об этом будет рассказано далее. Использование ловушек Стратегии, о которых пойдет речь в этом и двух следующих разделах, разработаны давно. Заслуга принадлежит Дэйву Тилену (Dave Thielen). Достаточно сказать, что этот человек отвечал за разработку MS DOS 5. Если в то время вы уже занимались компьютерами, то, вероятно, помните, какой ужасной была предыдущая, четвертая, версия операционной системы DOS. Она просто пестрила ошибками. Всемогущий Билл Гейтс, возможно, сказал тогда: Друзья мои! Либо в пятой версии вы исправите недочеты, либо всех уволю без выходного пособия . Так вот, DOS 5 завоевала успех и признание миллионов пользователей. Позже Дэйв Тилен написал книгу No Bugs!: Delivering Error-Free Code in С and С++ (издательство Addison-Wesley, 1992). Это пособие - одно из моих любимых, и тому есть две причины. Первая - небольшой объем, всего около 180 страниц (сравните со многими современными фолиантами, для которых 1000 страниц становится порочной нормой). А вторая - пожалуй, главная - заключается в том, что в книге излагаются полезные советы и ценные рекомендации. С момента выхода указанного пособия в свет и по сей день я с успехом применяю в процессе программирования на любом языке описанные в ней подходы. Поставщики инструментальных средств программирования сочли необходимым включить некоторые предложенные Дэйвом Тиленом технологии в состав своих продуктов. Скажем, VBA содержит штатные средства верификации условий. Под верификатором условий понимается дополнительный код, который осуществляет контроль выполнения заранее заданных условий и приостанавливает работу программы, если последние не удовлетворяются. В процессе трассировки программа с помощью вспомогательных конструкций создает отчет - во внешнем файле или в окне (в таком, например, как Watches) - о том, что она делает. Скажем, Microsoft Visual C++ предлагает инструменты верификации условий и трассировки, а язык Object Pascal среды Delphi имеет собственные возможности верификации. Языки VB и VBA также снабжены средствами верификации условий и аналогом трассировки - функциями, реализованными в составе класса Debug. В текущем и двух следующих разделах эти мощные и эффективные технологии рассмотрены более подробно. Что такое ловушка Слово ловушка (trap) достаточно понятно: вы попадаете в нее, и она захлопывается. В программировании ловушка представляет собой строку кода, позволяющую удостовериться в том, что некий блок выполнился. Ее цель - уведомить, что в процессе своего выполнения программа прошла через определенное место кода. Использование ловушек - удобное средство, гарантирующее, что процессом тестирования будут охвачены все ветви сложного кода. Предположим, что при тестировании управляющей структуры If ... Then . . . Else . . . End I f блок кода, следующий за Else, никогда не выполнялся. Вправе ли вы надеяться, что в один не очень прекрасный момент он вас не подведет? Ответ однозначен - нет. С другой стороны, может оказаться и так, что раз этот код никогда не работает, он вовсе не нужен. Ка шенять ловушки В VBA технология применения ловушек реализуется очень легко. Изучите текст листинга 17.1. Листинг .1. Пример использования ловушек 2 3 4 5: 6 7 8 9 10: 11: 12 Sub Trap(ByVal Debug.Print Stop End Sub FileName Ловушка: As String, ByVal TrapNumber As Long) & FileName & ( & TrapNumber & ) Sub SomeCodeToTrap Dim Condition As Boolean If (Condition = True) Then Call Trap( Modulel , Else Call Trap ( Modulel , End If 1 ) 2 ) 13:End Sub Строки содержат текст процедуры-ловушки, а строки заня- I ты процедурой, подвергаемой тестированию. Процедура Trap достаточно проста. Ее можно создать один раз, а затем при необходимости импортировать в нужные модули. В нашем случае Trap вызывается с двумя аргументами - именем модуля (FileName) и номером строки- ловушки (TrapNumber), который должен быть уникальным в пределах текущего модуля. Когда ловушка захлопывается , вызывается процедура Trap, которая выводит информацию об имени модуля и номере блока кода в окно отладки. Во время выполнения программы следите за содержимым окна Immediate и помечайте все пройденные строки-ловушки символом комментария. Не советуем полностью удалять эти строки из текста программы - их наличие в виде комментариев говорит о том, что соответствующие блоки кода бьши протестированы. Строки 6- 13 представляют собой пример кода, который должен пройти тестирование с помощью ловушек. Применяйте строки-ловушки в особо ответственных случаях - скажем, в важных условных конструкциях. Конечно, весь код проверять таким образом неразумно, но и полностью отказываться от подобной возможности тестирования, разумеется, не следует. Если ранее проверенный код подвергся изменениям, желательно убрать символ комментария и повторить тест вновь. Если при просмотре текста программы вы нашли строку-ловушку, не помеченную символом комментария, сразу же протестируйте эту часть кода. Если не удается подобрать соответствующие условия теста, подумайте - может быть, такой блок кода вовсе и не нужен. Его удаление обеспечит полную гарантию избавления от потенциальных неприятностей (кто из классиков мрачно пощутил: Наилучшее средство от головной боли - гильотина ?). Трассировка кода Значение глагола trace (следить), от которого происходит название необходимого в работе режима, рассмотренного в этом разделе, также достаточно понятно. (Поверьте, сидеть в засаде или подглядывать в замочную скважину вам не придется.) Назначение функций трассировки состоит в документировании порядка вьшолнения кода и различных характеристик его состояния. Одна из типичных задач трассировки связана с подсчетом количества обращений к определенным фрагментам кода. Подобная информация может оказаться полезной в процессе выявления блоков кода, нуждающихся в оптимизации. Приемы реализации процедур трассировки схожи с методами использования ловушек, рассмотренными в предыдущем разделе. Процедуре трассировки передается несколько аргументов - имя тестируемого модуля (скажем, FileName), номер блока кода, уникальный в пределах модуля (TraceNumber), и подробное сообщение, характеризующее состояние параметров программы (TraceMessage). Но значению аргумента Тга-ceNumber блок кода легко отыскать в тексте модуля с помощью команды меню Edit=>Find окна редактора VBA. В качестве параметра TraceMessage можно передавать имя выполняемой в данный момент процедуры или функции, значение переменной или любой другой элемент данных, за состоянием которого необходимо проследить. Одним словом, трассировка помогает понять, что именно и в какой момент делает программа. Только на протяжении последних пяти лет в составе инструментальных сред программирования появились мощные интегрированные отладчики, позволяющие указывать объекты наблюдения (watches), следить за содержимым стека вызовов (call stack) и задавать точки останова (breakpoints). Средства наблюдения и просмотра стека вызовов можно, по существу, приравнять к функциям трассировки, а механизмы обработки точек останова близки по смыслу процедурам использования ловушек и верификации условий. Впрочем, одно вовсе не исключает другого - рассматриваемые технологии тестирования остаются весьма полезными в условиях, когда приложение отлаживается за пределами среды программирования. Средства задания точек останова (или контрольных точек) и другие названные инструменты, конечно, весьма удобны, но точка останова, скажем, - это объект окна среды, а не приложения как такового. Нужно умело и рационально использовать и штатные средства, предлагаемые интегрированным отладчиком, и те приемы, которые мы сейчас рассматриваем. В борьбе с ошибками все средства хороши - лишь бы они помогли добиться полного успеха. Одним из преимуществ процедуры трассировки служит то, что она способна сохранять информацию в виде файлового отчета, а не только отображать ее в окне Immediate редактора VBA. Сопоставление полученного отчета с тем, что, по ващему мнению, должна бьша выполнить программа, - весьма поучительный способ достижения хороших резу;[ьтатов. Листинг 17.2 демонстрирует пример реализации процедуры трассировки. Листинг 17.2. Пример процедуры трассировки 4: 5: Su м (ByVa, FileName As String, ByVal TraceMessage As String, ByVal Dim Output As String Output овка: & FileName & ( TraceNumber & ) в & Now & vbCrLf TraceNumber As Long) & &
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |