-
> Kerk © (25.05.16 02:01) [37] > > > > Юрий Зотов © (25.05.16 01:58) [35] > > > > > Возле метки пишем краткий коммент - и проблема исчезла. > > > > > Еще лучше - дать метке осмысленное имя. > > Ну это еще куда ни шло :) > > Но все равно я против goto
А мы тебе его и не навязываем. :)
-
> Goto и метки - это не прикладной функционал. Еще какой прикладной, если с умом комментировать! Вот пример - описание алгоритма склейки диапазонов дат на псевдокоде:
1. Отсортировать список диапазонов
2. result = false
3. i = -1
4. i++ 5. Если i >= (size - 1), то выход
6. Цикл по j от (i + 1) до (size - 1) включительно
goto 4 }
И вызывать этот код в цикле, пока не вернет false.
-
полностью согласен с [29].
> Юрий Зотов © (25.05.16 02:09) [39]
> Дело привычки, всего лишь.
так и есть. лично я последний раз использовал метки году эдак в 2000-ом на паскале, будучи школьником. в Делфи уже не использовал, видимо мода на них начала проходить. программеры более старшего поколения наверняка использовали метки в enterprise и массово, тогда это не считалось зазорным и проблем не вызывало, поэтому и выработался автоматизм.
для меня лично, на данный момент, код построенный на анонимных методах и замыканиях будет выглядеть куда понятнее, чем код на метках, хотя, работать будет очевидно медленнее.
-
> лично я последний раз использовал метки году эдак в 2000- > ом на паскале
Вот-вот. Я не помню, когда последний раз использовал goto, при том что нет у меня установки его избегать любой ценой, совершенно. Просто не нужен. Что как бы намекает нам...
-
> Внук © (25.05.16 09:33) [43] > Что как бы намекает нам...
... на то, что можно обойтись и без этого оператора. Это давно известно.
Однако же, можно обойтись и одним циклом while. Но почему-то никто не говорит, что циклы for и repeat - лишние.
Операции OR и XOR - тоже лишние. Достаточно иметь NOT и AND, все остальное можно построить на них. Правда, код будет чудовищным, но работать он будет верно.
Без дженериков, замыканий и анонимных функций тоже можно обойтись. Тип String - тоже лишний, поскольку есть PChar. Кстати, и типизированные указатели - тоже в топку, оставить один Pointer. Открытые и динамические массивы - тоже лишние, без них вполне жить можно. Да и комментарии - тоже не нужны, они вообще на код не влияют.
Оказывается, много чего лишнего понакручено. А зачем?
Для удобства. Для читабельности. Для снижения вероятности ошибок.
И с goto - та же история. Вот напиши такой кусок без goto - и сравним удобство и читабельность.
start: <что-то делаем 1> while <условие 1> do begin while <условие 2> do begin <что-то делаем 2> if <условие 3> then goto start; <что-то делаем 3> end; <что-то делаем 4> end; <что-то делаем 5>
-
> Юрий Зотов © (25.05.16 10:25) [44]
Нет, намекает это нам на то, что потребность в этом операторе очень низка, и это точно не случай топикстартера.
Операторы break и continue ведь тоже частные случаи goto, я не призываю от них отказываться, ровно наоборот. А с появлением в некоторых языках операторов break и continue с меткой потребность в операторе goto вообще устремилась к нулю, потому что если его использование в циклах еще можно оправдать, то вне циклов - нет.
-
repeat
<что-то делаем 1>
while <условие 1> do
begin
while <условие 2> do
begin
<что-то делаем 2>
ПовторитьСначала := <условие 3>
if ПовторитьСначала then
Break;
<что-то делаем 3>
end;
if ПовторитьСначала then
Break;
<что-то делаем 4>
end;
until not ПовторитьСначала;
<что-то делаем 5>
-
Упс...
repeat <что-то делаем 1> while <условие 1> do begin while <условие 2> do begin <что-то делаем 2> ПовторитьСначала := <условие 3> if ПовторитьСначала then Break; <что-то делаем 3> end; if ПовторитьСначала then Break; <что-то делаем 4> end; until not ПовторитьСначала; <что-то делаем 5>
-
Получается, что единственный аргумент - читабельность хуже.
Однако, конечным результатом программирования является программа (или результат работы программы), а не чтиво исходников.
-
крылья...хвосты... лишь бы код читаемый был и комментов побольше, что-бы через год вспомнить о чем речь
даже если считаете что исходники вам больше не понадобятся
-
> Владислав © (25.05.16 11:09) [47]
А теперь сравним.
1. Читабельность - примерно одинаковая (хотя на мой взгляд вариант с goto для понимания проще, но пусть будет одинаково).
2. Длина кода - 14 и 18 строк.
3. Лишняя переменная ПовторитьСначала.
4. Лишние 2 проверки этой переменной.
То есть, преимуществ никаких, а недостатки есть. И ради чего? Только чтобы не писать goto?
-
> Юрий Зотов © (25.05.16 12:00) [50]
А почему пункты 2-4 отнесены к недостаткам и почему там употреблено слово "лишний"? Не потому ли, что OR и XOR, goto, String и т.д. тоже лишние? :)
-
> Юрий Зотов © (25.05.16 12:00) [50]
Все это субъективное.
1. Без goto читабельность лучше, хотя бы потому, что с goto нужно держать в уме, что тело внешнего цикла может не выполниться полностью, а явного указания этого в коде внешнего цикла нет. Кроме этого, в варианте с goto есть неявный цикл, который с ходу таковым не воспринимается. В варианте без goto этот цикл явный.
2. Длина на 4 строки больше. Если это будет 31 и 35, разница уже не кажется такой большой, а вот для варианта с goto длина уже может быть довольно большая.
3. Эта переменная как раз самодокументирует внешний цикл.
4. Их процессор выполняет, а он быстрый.
В итоге сплошные преимущества без goto. А ради чего? Только для того, чтобы уменьшить длину на 4 строки? 8-О
На мой взгляд - это все не аргументы. Вот если бы было сказано, что процедура с goto выполняется быстрее на столько-то, что увеличивает скорость работы на столько-то, а это критично, поэтому используется вариант с goto, вот это объективный аргумент, который я бы принял, и слова бы не сказал, потому что фобий по этому поводу у меня нет.
-
> Владислав © (25.05.16 12:55) [52] > > Без goto читабельность лучше, хотя бы потому, что с goto > нужно держать в уме, что тело внешнего цикла может не выполниться > полностью, а явного указания этого в коде внешнего цикла > нет. Кроме этого, в варианте с goto есть неявный цикл, который > с ходу таковым не воспринимается. В варианте без goto этот > цикл явный.
Вот это главный аргумент. Само наличие goto мгновенно усложняет код.
-
> Владислав © (25.05.16 11:09) [47]
GOTO убрали, BREAK два раза вставили. BREAK или EXIT те же GOTO по сути. Будем уж последовательны, прервем цикл без BREAK.
-
> DVM © (25.05.16 13:45) [54]
Попробуйте обойтись в программе без инструкций семейства JMP, тогда эта претензия будет понятна. Речь же о структуре кода. Операторы Break, Continue и функция Exit предсказуемы. Оператор Goto мало того, что способен выкинуть в произвольное место, еще и заставляет анализировать возможные побочные эффекты. Мне это не нравится.
-
> DVM © (25.05.16 13:45) [54]
"BREAK или EXIT те же GOTO по сути."
Те же, да не те же. Возьмем некий абстрактный цикл с break, и такой же с goto. Можно не смотря на код ответить, какой код начнет выполняться после break? Да. А какой код начнет выполняться после goto? Нет. Сначала надо на код посмотреть. И еще один момент. Break нам говорит о том, что цикл завершается. Exit говорит о том, что процедура завершается. Goto не говорит ни о чем, нужно разбираться в коде.
-
-
> Внук © (25.05.16 13:57) [55]
> Владислав © (25.05.16 14:00) [56]
Вы оба правы, BREAK, разумеется, выкинет нас из цикла в предсказуемое место за циклом, но, с другой стороны, GOTO тоже нас перекидывает не в рандомное. Конечно, конец цикла найти проще, чем метку в объемной процедуре, но, с другой стороны, огромные процедуры сами по себе признак плохого кода и без меток.
На мой взгляд, если GOTO перекидывает в место, расположенное "рядом", то код от такого подхода ничуть не страдает. Мне вариант с GOTO кажется даже более понятным, т.к. чем меньше циклов тем легче воспринимать код.
-
Все еще хуже. Насколько я помню, сейчас Юрий программирует в Java, в которой нет goto вообще (я ничего не путаю?). Так что это просто зависть к нам, оставшимся верным Delphi :)
|