|
Программирование >> Решение нетривиальных задач
только является пустой тратой времени, но и не может быть использовано для тщательного тестирования. Люди, сидящие за клавиатурами и пробующие все, что им приходит в голову, недостаточно методичны. Поэтому для систематического выполнения функций, подлежащих проверке, лучше использовать неинтерактивную тестовую функцию. И, кстати, не удаляйте эту тестовую процедуру; просто используйте предложение #ifdef TEST для включения или выключения этой подпрограммы из компиляции. Если вы похожи на меня, то вы утром удалите эту тестовую функцию, а уже к обеду она вам понадобиться снова, даже если вы не пользовались ей последние два года. 76. Сообщение об ошибке должно подсказывать пользователю, как ее исправить Когда-то, во времена CP/M, отладчик DDT имел единственное сообщение об ошибке. Не имело значения, что вы натворили, он всегда говорил: Несмотря на то, что подобная обработка ошибок, к счастью, больше не является нормой, я все еще вижу ее, хотя и с более прихотливыми украшениями. Несколько программ для Windows, мне принадлежащие, просто издают звуковой сигнал, когда я ввожу неверное значение в диалоговом окне, заставляя меня гадать, какое же значение верное. Я часто видел сообщения об ошибках, которые давали мне обильное количество информации о том, что я сделал неправильно, не давая подсказки, как это делается правильно. В самой печальной ситуации диалоговое меню предлагает вам ввести число, но когда вы вводите неверное число, оно выводит такое сообщение: Неверное значение. без намека на то, какое значение будет верным. Иногда диалоговое окно отказывается закрыться до тех пор, пока вы не введете верное значение. Иногда программа захватывает управление компьютером, и вы не можете переключиться в другое приложение, завершив то, в котором с вами случилась беда. (В Windows это свойство называется системно-модальным диалоговым окном. Пожалуйста, не пользуйтесь им). И вот вы перед выбором: завершить программу, нажав Ctrl-C или ее эквивалент (если можете), отключить питание или наобум набирать числа на клавиатуре до тех пор, пока вам не удастся наткнуться на то, которое удовлетворит программу ввода данных. Вопрос состоит в том, что займет у вас больше времени: повторить последние три часа работы, которую вы не подумали сохранить перед вызовом диалогового окна, или потратить еще три часа, играя в холодно-горячо с диалоговым окном. Это как раз та ситуация, из-за которой у компьютеров дурная слава. Сообщение об ошибке должно подсказывать вам, как исправить эту ситуацию, что-нибудь типа: Числа должны быть в диапазоне от 17 до 63 включительно. или: Даты должны иметь формат дд-мм-гггг. Должен быть какой-то способ (типа клавиши help/справка ) для получения дополнительной информации, если она вам нужна. Наконец, у вас должен быть способ безопасного прекращения процесса ввода данных (типа клавиши Выход ). 77. Не выводите сообщения об ошибке, если она исправима Библиотечные подпрограммы (и большинство подпрограмм на языках низкого уровня) не должны выводить сообщений об ошибках. Они должны возвращать код ошибки, который может быть проверен вызывающей подпрограммой. Таким способом эта подпрограмма может предпринять какие-то корректирующие действия. Например, если рекурсивная функция-сортировщик сообщила об ошибке, выйдя за пределы стека, то вызвавшая ее подпрограмма не сможет попытаться заново выполнить сортировку с использованием другого, нерекурсивного алгоритма. Пользователь должен увидеть сообщение об ошибке, даже если вторая попытка сортировки будет удачной. 78. Не используйте системно-зависимых функций для сообщений об ошибках Многие среды с оконным интерфейсом не поддерживают понятия стандартного устройства для вывода или для сообщений об ошибках. (В этих средах вызовы printf() или fprintf(stderr, ...) обычно игнорируются). Если вы будете основываться на догадках о своей среде, то обнаружите, что вам необходимы значительные доработки просто для того, чтобы перекомпилировать код для новой среды). Минимум вашей защиты может быть таким: #define error printf #define terminate(x) ExitProcess(x) после чего используйте: if ( some error ) error( Тут что-то не так ); terminate( -1 ); Вот более гибкое решение: #include <stdio.h> #include <stdarg.h> #ifdef WINDOWS void error( const char* format, ... ) char buf[255]; надеемся, что такой размер будет достаточен va list args; va start( args, format ); if( vsprintf( buf, format, args ) < sizeof(buf) ) ::MessageBox(NULL,buf, *** ОШИБКА *** , MB OK MB ICONEXCLAMATION ); else ::MessageBox(NULL, Переполнение буфера при печати сообщения об ошибке. , Фатальная ошибка , MB OK MB ICONEXCLAMATION ); ExitProcess( -1 ); va end( args ); #elif MOTIF Здесь следует функция обработки ошибки, используемая ОС Motif #else void error( const char* format, ... ) va list args; va start( args, format ); vfprintf(stderr, format, args ); va end ( args ); #endif
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |