> GOTO удобен для описания конечных автоматов.Проблема в том что он удобен еще и для прострела пяток не сильно очевидными способами, когда вы просто потеряли flow и сделали что-то не то, даже и не заметив это. Иногда и при вон том самом - отслеживать и тем более автоматически анализировать корректность этих действ и намерений кодера при этом малореально. Данная конструкция крайне опасна в аспекте провоцирования багов и сильно усложняет анализ (и въезд других кодеров в код). Именно поэтому ее и не рекомендуют.
> Синглтоны - это норма: большинство классов нужно только в одном экземпляре.
Я все понимаю, но зачем тогда вообще заводить классы? :)
> В глобальной переменной удобно хранить логгер.
А также какие-то ну вот реально глобальные вещи. Типа, скажем, общей конфигурации программы, которая доступается буквально отовсюду. Просто этого должен быть необходимый минимум и ни битом более. Потому что скрытые параметры вне формальных деклараций что вон та штука использует в общем случае не рулят, а попытка поменять что-то вон в этом глобальном там может оказаться довольно мучительна когда половина кода внезапно развалится.
> называть переменные a1, a2, a3,
В этом месте вас проклянет следующий майнтайнер этого кода...
> и мешать snake_case с CamelCase и lowerCamelCase.
А в этом месте вас линчуют коллеги/коммитеры/майнтайнеры и все кто будет иметь дело с этим кодом. Потому что вы сломали их ожидания - и обрекли на множество дурных багов на ровном месте. Такой код может быть проще списать в утиль и переписать заново, он может оказаться непригоден к майнтенансу.
> И таких примеров - миллионы. Всегда нужно думать своей головой.
Особенно в упомянутых случаях. Потому что их маркировали как проблемные по вполне конкретным причинам.