Проклятие goto: антишаблоны процедурного программирования

Структурная, или процедурная, парадигма может праздновать полувековой юбилей. Процедурное программирование, иногда — как часть мультипарадигмальных проектов — по-прежнему торжествует при разработке системного и встроенного ПО. И если благодаря Эдсгеру Дейкстре (Edsger W. Dijkstra) всякому школьнику ведомо, когда и почему нельзя использовать оператор безусловного перехода к метке (goto), то с остальными «нельзя», а значит, и с качеством кода, проблемы возникают даже у студентов с хорошей базовой подготовкой.

Опыт обучения процедурному программированию на классическом C (de facto, язык разработки — C99 с элементами C11) показывает, что основную проблему представляют такие структурные антишаблоны, как:

  • «загадочный» код (англ. cryptic code) — выбор малоинформативных, часто однобуквенных идентификаторов, не сопровождаемых комментариями автора;
  • «жесткий» код (англ. hard code) — запись конфигурационных параметров как строковых, логических и числовых литералов, рассеянных по исходному коду и затрудняющих настройку и сопровождение программной системы;
  • спагетти-код (англ. spaghetti code) — несоблюдение правил выравнивания, расстановки пробельных символов и т.д., а также превышение порога сложности одной процедуры (функции); заметим, простым и удобным мерилом такого порога сложности является высота экрана (благо многие ведут разработку учебных проектов на легких субноутбуках с небольшой диагональю);
  • магические числа (англ. magic numbers) — программист, борющийся с этим антишаблоном, должен занимать радикальную позицию и определять как символические константы все числовые литералы за исключением, может быть, 0, 1 и -1 (о чем сказано даже в руководстве Oracle по разработке на языке Java!);
  • применение функций как процедур (англ. functions as procedures) — не все слушатели базовых вузовских курсов по программированию знают о том, что функция scanf языка C возвращает целочисленный результат, и не догадываются о том, как его следует интерпретировать в своем коде;
  • «божественные» функции (англ. God functions) — по аналогии с «божественными» классами в объектной архитектуре такие функции берут на себя — в разных сочетаниях — ввод данных, вычисления и вывод результатов на экран, диск, в поток и т.д. или иные задачи, каждая из который достойна оформления как самостоятельной функции.

Другими распространенными нарушениями являются:

  • неиспользование переносимых типов — прежде всего, ptrdiff_t;
  • «утечки» памяти (англ. memory leaks);
  • внезапное завершение процесса вместо аварийного выхода из функции с возвратом кода ошибки;
  • использование ветвлений с условиями, статистически смещенными не к истинному, а к ложному результату (способствуют образованию «пузырей» в конвейере микрокоманд и существенно снижают эффективность кэш-памяти инструкций микропроцессора);
  • недостижимый код (англ. unreachable code).

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google photo

Для комментария используется ваша учётная запись Google. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.