Pull to refresh
0
Инфопульс Украина
Creating Value, Delivering Excellence

В чём смысл?

Reading time 2 min
Views 13K
	SomeFunction()
	{
	    ...
	    if (false)
	    {
	        ...
	    }
	    ...
	}
	

Зачем может быть нужен блок if (false)?

Предположим, что:
  1. Это не ошибка и не забывчивость.
  2. if и false — это именно оператор условия и логическая ложь, а не какие-то хитрости с макросами\строками и т.д.

Пару вариантов ответа под катом. Желающие высказать свои идеи приглашаются мимо отгадки сразу в комментарии.

Два неадекватных варианта

  1. Программисту нужно было создать видимость работы \ платили за количество строк.
    Глупо, не интересно, но бывает. Проехали.
  2. Где-то в этой функции есть goto внуть блока if (false)
    Я вообще не являюсь идейным противником goto — иногда его использование оправдано. Но переход внуть недостижимого условия — тут или совсем каша в коде, или какой-то такой глубокий сакральный смысл, что мне его понять не дано. Проехали.

Два адекватных варианта


1. Использования блока if (false) для временного комментирования кода.
Да, конечно же, у нас есть \\, /**/ (ну или что там в Вашем языке обозначает комментарий). Но с этими вещами имеются следующие беды:
  • \\ нужно ставить на каждой строке (да, некоторые IDE имеют для этого хоткеи — но не все, да и помнить эти хоткеи нужно).
  • /**/ не могут быть вложенными. При необходимости закомментить код, в котором уже есть такие комментарии сразу добавляются лишние действия, между которыми еще и нужно выбирать (закомментить все, изменить тип комментариев, удалить внутренний блок комментов)!
  • Закомментированный код легко может быть удален другим программистом по логике «закомментировано — значит не нужно». А ведь может быть нужно, а закомментировано было временно. К блоку незакомментированого кода будет, скорее всего, проявлено больше уважения.
  • Закомментированный код не компилируется. Если он может понадобиться в будущем — велика вероятность того, что он не заработает в силу изменения в его окружении.
  • Закомментированный код непонятно-как поддерживается средствами рефакторинга. Какие-то его меняют, какие-то спрашивают что с ним делать, а какие-то просто игнорируют.

При комментировании блоком if (false) мы в избавлены от части этих трудностей.

2. Выполнение иногда нужных операций в режиме отладки
В процессе пошаговой отладки (например в Visual Studio) мы можем перемещать текущую точку выполнения программы, в том числе мы можем переместить её внутрь никогда не выполняющегося блока if.



Зачем это может понадобиться? Ну вот пару вариантов:
  1. В этот блок можно вынести какое-нибудь экстра-тяжелое логирования (ну, например, дамп всей памяти). В обычном режиме (и даже в дебаг-конфигурации) нам это не нужно, но вот иногда, по ходу отладки какого-то тяжелого места может понадобиться. Обворачиваем этот дамп в if (false) и в нужный момент прыгаем внутрь него, потом — обратно.
  2. По ходу той же отладки нам нужно для теста перевести объект в некоторое эталонное состояние. При чём нам это не нужно ни в релизе, ни в дебаге — только вот в данный момент для отладки. Плюс, возможно, в будущем — если возникнут проблемы. Заворачиваем инициализацию объекта в if (false) — это гарантирует нам наличия кода в программе и в нужный момент перебрасываем выполнение внутрь.
Таким образом, мы получаем код, который никогда не будет вызван самой программой, но на который мы всегда при желании сможем «прыгнуть» по ходу отладки.
Tags:
Hubs:
+26
Comments 107
Comments Comments 107

Articles

Information

Website
www.infopulse.com
Registered
Founded
1992
Employees
1,001–5,000 employees
Location
Украина