Оператор
goto
попал в опалу после публикации в 1968 г. работы Дейкст-ры (Edsger W. Dijkstra) "Go To Statement Considered Harmful" ("Обоснование пагубности оператора Go To"). В то время шли неистовые дебаты вокруг структурного программирования. К сожалению, общим проблемам структурного программирования уделялось меньше внимания, чем мелочам: должны ли быть представлены в современных языках программирования конкретные операторы, такие как
go to
(сейчас, как правило с ключевым словом
goto).
Как это часто случается, многие, по совету Дейкстры, ударились в крайность и пришли к убеждению, что любое применение
goto —
это зло и нужно избегать
goto
любой ценой.
loop
read in a value
if value == sentinel then exit
process the value end loop
Выход из этого цикла производится только при выполнении оператора
exit
в середине цикла. Однако такой цикл
loop/exit/end loop
вызовет беспокойство у сторонников программирования без
goto,
и они перепишут этот код так:
read in a value
while value != sentinel
process the value read in a value end while
Роберте (Eric S. Roberts) из Стэнфордского университета указал у второго подхода два основных недостатка. Во-первых, необходимо дублировать оператор(ы), требующиеся для чтения значения. При любом дублировании кода возникает очевидная проблема с его сопровождением: изменив один оператор, нужно обязательно изменить второй. Вторая проблема не столь явная и, вероятно, не столь значима. Главное, что требуется при написании надежного кода, который легко понимать и, следовательно, сопровождать, — писать код, осуществляющий чтение естественным способом. Пытаясь объяснить словами, что делает этот код, кто-то может сказать: "Сначала мне нужно прочитать некоторое значение. Если это метка конца блока информации (sentinel), я заканчиваю. Если нет, я обрабатываю это значение и продолжаю со следующим значением". Следовательно, код без оператора
exit —
противоестествен, так как переворачивает с ног на голову естественный способ представления проблемы. А теперь рассмотрим ситуации, в которых применение оператора
goto —
лучший способ структурирования алгоритма.