Przykłady były już podawane wielokrotnie —
goto
może zastąpić jednorazowe funkcje, może zastąpić pętle, wykluczyć konieczność mnożenia zmiennych loklanych, zmniejszyć ilość kodu do pisania i trzymać daną logikę w jednym miejscu, co zdecydowanie ułatwia nie tylko analizę, ale i debugowanie (w końcu wszystko jest w jednym miejscu, w obrębie wzroku).
No może zastąpić to wszystko, prawda. Ale w takim wypadku po co Ci w ogóle te wszystkie konstrukcje? Możesz przecież je zastąpić goto
i mieć "wszystko w jednym miejscu". To czemu używać Pascala czy C, skoro z paroma makrami masz to samo w asemblerze? I "zdecydowanie ułatwia nie tylko analizę, ale i debugowanie" to raczej mocno subiektywna opinia, a do tego na moje niezbyt zauważalna empirycznie. W mikro skali może i ma to jakiś sens, ale wtedy i tak łatwiej IMHO to zapisać używając po prostu pętli czy funkcji. Bo jeśli mamy kod w stylu:
int a = 1;
if (foo) goto step1;
a += 2;
step1:
if (bar) goto step2;
a += 3;
step2:
a += 4;
To jakoś lepiej dla mnie wygląda mimo wszystko:
int a = 1 + maybe(foo, 2) + maybe(bar, 3) + 4;
Podobnie z pętlami jak masz:
loop:
// …
if (cond) goto loop;
To nie widzę zalety nad:
do {
// …
} while (cond);
Masz na myśli ten przykład?
Nie znam Pascala zbytnio, ale przecież nie musisz robić z tego metody klasy. Dodatkowo dzieje się tam na moje strasznie dużo i ciężko jest mi wywnioskować skąd się bierze część zmiennych, więc mam nawet problem by to przetłumaczyć na coś co znam. Dodatkowo początkowo myślałem, że rozwiązanie, które dawał @Riddle jest błędne, bo po wcięciach i zachowaniu goto
miałem wrażenie, że będzie tam pętla testująca do oporu. I dalej jakoś mam wrażenie, że przenosząc to do osobnej funkcji byłoby to zdecydowanie łatwiej testować, bo nie musisz znać zachowania FontsEditor.Dialogs.Message.Execute
by móc przetestować samą walidację, dzięki czemu możesz zdecydowanie łatwiej testować mniejszą część kodu bez potrzeby symulacji GUI. A jeśli nie chcesz by ta procedura była publiczna, to można to ogarnąć poprzez zagnieżdżoną funkcję skoro Pascal to obsługuje. Więc jak najbardziej nie widzę sensu na goto
.
Co do tego przykładu to mam pomysł, ale niestety nie mam teraz czasu by go zawodzić. Idea jest taka, że zamiast robić wszystko w jednej funkcji to rozbijasz na osobne, które budują Ci dialog i zwracają jaka akcja ma się wykonać, następnie sama akcja się wykonuje już niezależnie od samych dialogów. W ten sposób można to sobie zrobić nawet bardziej elastyczne, bo możesz dodawać nowe akcje bez rozbudowywania drabinki if
ów coraz bardziej.