Стандарты программирования на С++. 101 правило и рекомендация | страница 123
В этом разделе документированы добытые трудом множества программистов знания и наилучшие практические подходы, некоторые из которых стоили многих лет работы. Следуйте приведенным правилам и рекомендациям. Когда мы пишем сложную, надежную и безопасную программу — нам требуется вся помощь, которую мы только в состоянии получить.
В этом разделе мы считаем наиболее значимой рекомендацию 69 — "Определите разумную стратегию обработки ошибок и строго ей следуйте".
68. Широко применяйте >assert
для документирования внутренних допущений и инвариантов
Используйте >assert
или его эквивалент для документирования внутренних допущений в модуле (т.е. там, где вызываемый и вызывающий код поддерживаются одним и тем же программистом или командой), которые должны всегда выполняться (в противном случае они являются следствием программной ошибки; например, нарушение постусловий функции, обнаруженное вызывающим кодом). (См. также рекомендацию 70.) Убедитесь, что использование >assert
не приводит к побочным действиям.
Очень трудно найти ошибку в своем коде, когда вы ищете ее; но во сто крат труднее найти ее, если вы считаете, что ее там нет.
— Стив Мак-Коннелл (Steve McConnell)
Трудно переоценить всю мощь assert. Этот макрос и его альтернативы, такие как шаблоны проверки времени компиляции (или, что несколько хуже, времени выполнения), представляют собой неоценимый инструментарий для обнаружения и отладки программных ошибок при работе над проектами. Среди прочих инструментов у них, пожалуй, наилучшее отношение сложность/эффективность.
Рассматриваемые проверки обычно генерируют код только в режиме отладки (когда не определен макрос >NDEBUG
), так что от них можно освободиться при сборке окончательной версии программы. Широко используйте проверки в своих программах, но никогда не пишите выражений в >assert
, которые могут иметь побочное действие. При построении окончательной версии, когда будет определен макрос >NDEBUG
, проверки не будут генерировать никакого кода:
>assert(++i < limit); // Плохо: i увеличивается только в
> // отладочном режиме
Согласно теории информации, количество информации, заключающееся в событии, обратно пропорционально вероятности данного события. То есть чем менее вероятно, что какая-то проверка сработает, тем больше информации вы получите, когда она сработает.
Избегайте применения >assert(false)
, лучше использовать >assert(!"информационное сообщение")