Глава 11. Функции___________________________________269

typedef void (*)(struct ffblks) Functor; // ОШИБКА: некорректное // применение typedef //к функтору

где псевдонимом является Functor. Общая схема остается прежней — спецификатор typedef, тип и псевдоним — но здесь за typedef должно следовать объявление функтора. Таким образом, правильное описание псевдонима Functor выглядит следующим образом:

typedef void (*Functor)(struct ffblks) ;

Теперь объявление функции TraverseDirectory станет гораздо симпатичнее:

typedef void (*Functor)(struct tfblks);

void TraverseDirectory( const char* path. Functor ftor)

Обращение к функтору будет происходить через переменную ftor. В результате внешний вид интерфейса функции стал проще и понятнее. Функторы являются мощным средством, но для их использования требуется некоторый навык. Однако они стоят усилий, затраченных на их изучение.

Отладка по ходу дела

Опыт показывает, что очень многие программисты совершают одну и ту же ошибку: вспоминают об отладочном коде только после того, как найдут ошибку. Но ведь болезнь легче предупредить, чем лечить, не так ли?

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

Итак, вашему вниманию предлагается метод испытательного стенда. Вот что он из себя представляет. Вы вставляете отладочный и тестовый код прямо во время программирования. Перед тем как добавить очередную процедуру, создайте для нее стенд — программу, специально предназначенную для проверки этого нового фрагмента — и протестируйте ее. Такой подход приносит массу выгод: во-первых, если свежеиспеченную процедуру не удается таким образом протестировать, то, скорее всего, либо она недостаточно проработана, либо у нее имеется слишком много внешних зависимостей. Во-вторых, уменьшается вероятность внесения новых ошибок в основную программу.

Впоследствии, когда уже можно будет подвергнуть тестированию всю программу целиком, она уже будет достаточно надежна и не потребует дополнительной работы по внесению отладочного кода,