Конструкти потоків управління вищого рівня, як правило, відповідають поняттям в проблемній області. Рішення if / else - рішення, засноване на певній умові. Петля каже виконувати якусь дію повторно. Навіть заява про перерву говорить, що "ми це робили неодноразово, але зараз нам потрібно зупинитися".
З іншого боку, оператор goto, як правило, відповідає концепції в запущеній програмі, а не в проблемній області. Він говорить про продовження виконання у визначений момент програми . Хтось, хто читає код, повинен зробити висновок, що це означає щодо проблемної області.
Звичайно, всі конструкції вищого рівня можна визначити через готос та прості умовні гілки. Це не означає, що вони просто маскуються в готи. Подумайте про них як про обмежені готи - і саме обмеження роблять їх корисними. Заява перерви реалізується як перехід до кінця циклу, що вкладається, але краще думати про те, що він працює на циклі в цілому.
За інших рівних кодів, структура яких відображає структуру доменної області, як правило, легше читати та підтримувати.
Немає випадків, коли заява goto абсолютно необхідна (для цього є теорема ), але є випадки, коли це може бути найменш поганим рішенням. Ці випадки відрізняються від мови до мови, залежно від того, які конструкції вищого рівня підтримує мова.
Наприклад, у С я вважаю, що існує три основні сценарії, коли гото доречний.
- Виривання з вкладеної петлі. Це було б непотрібно, якби мова мала мітку про перерву.
- Виправлення розтягування коду (як правило, функціонального органу) у разі помилки чи іншої несподіваної події. Це було б зайвим, якби мова мала винятки.
- Реалізація явної машини з кінцевим станом. У цьому випадку (і, я думаю, лише в цьому випадку) goto відповідає безпосередньо поняттю в проблемній області, переходячи з одного стану у вказаний інший стан, де поточний стан представлений тим, який блок коду виконується в даний час .
З іншого боку, явна машина кінцевого стану також може бути реалізована з оператором перемикання всередині циклу. Це має перевагу в тому, що кожен стан починається з одного і того ж місця в коді, що може бути корисним, наприклад, для налагодження.
Основне використання goto в досить сучасній мові (та, яка підтримує if / else та циклі) - це імітувати конструкцію керуючого потоку, якої немає у мові.