Принципы объектно-ориентированного программирования

         

Оператор goto: (очень) краткая история



Оператор goto: (очень) краткая история

Оператор goto попал в опалу после публикации в 1968 г. работы Дейкст-ры (Edsger W. Dijkstra) "Go To Statement Considered Harmful" ("Обоснование пагубности оператора Go To"). В то время шли неистовые дебаты вокруг структурного программирования. К сожалению, общим проблемам структурного программирования уделялось меньше внимания, чем мелочам: должны ли быть представлены в современных языках программирования конкретные операторы, такие как go to (сейчас, как правило с ключевым словом goto). Как это часто случается, многие, по совету Дейкстры, ударились в крайность и пришли к убеждению, что любое применение goto — это зло и нужно избегать goto любой ценой.



Проблема с 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 — лучший способ структурирования алгоритма.



Содержание раздела