Konstrukcje przepływów sterowania wyższego poziomu zwykle odpowiadają pojęciom w dziedzinie problemów. If / else jest decyzją opartą na pewnych warunkach. Pętla mówi, aby powtarzać pewne działania. Nawet stwierdzenie przerwania mówi: „robiliśmy to wielokrotnie, ale teraz musimy przestać”.
Z drugiej strony instrukcja goto zwykle odpowiada koncepcji w uruchomionym programie, a nie w dziedzinie problemów. Mówi, aby kontynuować wykonywanie w określonym punkcie programu . Ktoś czytający kod musi wywnioskować, co to oznacza w odniesieniu do domeny problemu.
Oczywiście wszystkie konstrukcje wyższego poziomu można zdefiniować w kategoriach gotos i prostych gałęzi warunkowych. To nie znaczy, że są tylko głupcami w przebraniu. Pomyśl o nich jako o ograniczonych gotosach - i to dzięki ograniczeniom są one przydatne. Instrukcja break jest implementowana jako przeskok na koniec otaczającej pętli, ale lepiej jest myśleć o niej jako o działaniu na całej pętli.
Wszystkie pozostałe elementy są jednakowe, kod, którego struktura odzwierciedla strukturę problematycznej domeny, jest zwykle łatwiejszy do odczytania i utrzymania.
Nie ma przypadków, w których instrukcja goto jest absolutnie wymagana (istnieje takie twierdzenie ), ale są przypadki, w których może to być najmniej złe rozwiązanie. Przypadki te różnią się w zależności od języka, w zależności od tego, jakie konstrukcje wyższego poziomu obsługują język.
Na przykład w C uważam, że istnieją trzy podstawowe scenariusze, w których goto jest odpowiednie.
- Wyłamywanie się z zagnieżdżonej pętli. Byłoby to niepotrzebne, gdyby język zawierał instrukcję break z etykietą.
- Usunięcie części kodu (zwykle treści funkcji) w przypadku błędu lub innego nieoczekiwanego zdarzenia. Byłoby to niepotrzebne, gdyby język miał wyjątki.
- Implementowanie jawnej skończonej maszyny stanów. W tym przypadku (i myślę, że tylko w tym przypadku) goto odpowiada bezpośrednio pojęciu w dziedzinie problemów, przechodząc z jednego stanu do określonego innego stanu, w którym obecny stan jest reprezentowany przez który blok kodu jest aktualnie wykonywany .
Z drugiej strony, jawną maszynę skończoną można również zaimplementować za pomocą instrukcji switch wewnątrz pętli. Ma to tę zaletę, że każdy stan zaczyna się w tym samym miejscu w kodzie, co może być przydatne na przykład przy debugowaniu.
Głównym zastosowaniem goto w dość nowoczesnym języku (takim, który obsługuje if / else i pętle) jest symulacja konstrukcji przepływu sterowania, której brakuje w tym języku.