Неужели использование goto здесь действительно так плохо?
В марте 1968 года Дейкстра отправил письмо Сообщения ACM , которое былоопубликовано под заголовком Перейти к заявлению, которое считается вредным .Это интересное чтение и часть знаний программиста.
Аргумент против GOTO, представленный в этом письме, связан с тем, как программисты строят ментальную модель для отслеживания прогресса выполнения кода.Дейкстра утверждает, что такая ментальная модель важна, потому что значение переменных имеет смысл только по отношению к прогрессу выполнения.Например, когда наша программа считает количество раз, когда произошло событие, всегда есть промежуточный момент, когда произошло N событий, но отслеживание переменной еще не было увеличено и все еще находится в N-1.
Он проходит через эти шаги в своих рассуждениях против GOTO:
Сначала рассмотрим очень простой язык без процедур, циклов или GOTO.На таком языке программист может мысленно отслеживать выполнение, воображая указатель выполнения, продвигающийся от начала файла до конца.Для выполнения выполнения модели достаточно одного индекса (т.е. номера строки).
Теперь мы добавим процедуры к языку.Ход выполнения больше не может отслеживаться одним индексом, так как он может находиться внутри процедуры.Мы также должны отслеживать, с какой строки была вызвана процедура.Кроме того, процедуры могут быть вызваны из других процедур.Поэтому мы моделируем прогресс выполнения как последовательность показателей.(В реальной жизни программисты называют такую последовательность «трассировкой стека».)
Теперь мы добавим циклы в язык.Для каждой строки в нашей трассировке стека, которая находится внутри тела цикла, нам нужно добавить другой тип индекса для прогресса выполнения модели: количество повторений.
Теперь мы добавим GOTO.Дейкстра утверждает, что при необузданном использовании GOTO наша способность отслеживать ход выполнения теперь не работает.Мы по-прежнему можем отслеживать ход выполнения с помощью «часов выполнения», говоря «сейчас мы выполняем 152-й оператор».Однако это не очень полезно для установления контекста, необходимого для интерпретации значений переменных.
Пока мы используем только операторы GOTO для построения простых циклов, вы можете утверждать, чтоситуация эквивалентна точке (3), и нет никаких проблем.Но в этом случае вы можете просто использовать конструкции цикла.Лучше просто не указывать GOTO в своем коде, чтобы не попасть в ситуацию, описанную в пункте (4).