Страница 1 из 15
(решено) GoTo или repeat until?
Добавлено: 31.08.2015 19:45:23
vitaly_l
Всем привет и хорошего настроения!
Правила:
1) Если Ваш ответ, примерно: "это просто плохо и неграмотно, и все тут!", то Ваш ответ априори не интересен.
2) Если Ваш ответ, примерно: "это просто неудобно читаемый код и неграмотно, и все тут!", то Ваш ответ априори не интересен.
3) Если Вы можете доказать, что при общении с железом оператор GoTo <== может вызвать реальные сбои, Ваш ответ востребован!
4) Если Вы можете доказать, что при переводе в машинный код оператор GoTo <== может вызвать реальные сбои, Ваш ответ востребован!
5) В общем нужно реальное доказательство, того почему GoTo <= так невзлюбили программисты и почему оно считается плохим тоном?
Пример №1 с Goto
Код: Выделить всё
labelGoTo1:
а := 'Задаётся заново только для labelGoTo1';
b := 'Задаётся заново только для labelGoTo1';
c := 'Задаётся заново только для labelGoTo1';
d := 'Задаётся заново только для labelGoTo1';
e := 'Задаётся заново только для labelGoTo1';
labelGoTo2:
f := 'Одинаковое для labelGoTo1 и labelGoTo2';
g := 'Одинаковое для labelGoTo1 и labelGoTo2';
k := 'Одинаковое для labelGoTo1 и labelGoTo2';
repeat
...
test := functionTest(a,b,c,d,e,f,g,k);
if buttonExit = true then exit;
ProcessMessages;
until someGlobalBoolean = true;
if test = 1
then GoTo labelGoTo1
else GoTo labelGoTo2;
Теперь пример №2 без GoTo:
Код: Выделить всё
repeat
if test = 1 then
begin
а := 'Задаётся заново только для labelGoTo1';
b := 'Задаётся заново только для labelGoTo1';
c := 'Задаётся заново только для labelGoTo1';
d := 'Задаётся заново только для labelGoTo1';
e := 'Задаётся заново только для labelGoTo1';
end;
f := 'Одинаковое для labelGoTo1 и labelGoTo2';
g := 'Одинаковое для labelGoTo1 и labelGoTo2';
k := 'Одинаковое для labelGoTo1 и labelGoTo2';
repeat
...
test := functionTest(a,b,c,d,e,f,g,k);
if buttonExit = true then exit;
ProcessMessages;
until someGlobalBoolean = true;
until buttonExit = true;
На мой взгляд разницы нет, разве что в первом варианте Goto, а во втором вложенный цикл (на скорость я это не тестировал).
Вопрос:
Использование GoTo действительно очень плохо для программы?.
Re: GoTo или repeat until?
Добавлено: 31.08.2015 20:25:49
скалогрыз
Goto это очень полезный инструмент в наборе разработчика.
Но только до тех пор, пока мне не нужно отлаживать этот самый код, использующий Goto.
а repeat..until придумали трусы и академики. Это выдуманная и ненужная конструкция, кой не существует на аппаратном уровне.
рекомендую использовать Goto для:
* краткости и наглядности записи кода
* аппаратной эффективности
Re: GoTo или repeat until?
Добавлено: 01.09.2015 06:16:25
sign
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
procedure Goto1;
begin
а := 'Задаётся заново только для labelGoTo1';
b := 'Задаётся заново только для labelGoTo1';
c := 'Задаётся заново только для labelGoTo1';
d := 'Задаётся заново только для labelGoTo1';
e := 'Задаётся заново только для labelGoTo1';
end;
procedure Goto2;
begin
f := 'Одинаковое для labelGoTo1 и labelGoTo2';
g := 'Одинаковое для labelGoTo1 и labelGoTo2';
k := 'Одинаковое для labelGoTo1 и labelGoTo2';
end;
begin
GoTo1;
GoTo2;
repeat
...
test := functionTest(a,b,c,d,e,f,g,k);
if buttonExit = true then exit;
ProcessMessages;
until someGlobalBoolean = true;
if test = 1 then GoTo1
else GoTo2;
end;
Re: GoTo или repeat until?
Добавлено: 01.09.2015 07:33:04
Снег Север
Когда-то (очень-очень давно) я перешел с Фортрана на Турбо-паскаль и некоторое время использовал, по привычке, goto. Потом, освоившись в языке, полностью от переходов по метке отказался в пользу циклов и подпрограмм/функций. Единственная причина - более удобный, компактный и читаемый код.
Вопросы скорости меня (именно в этом отношении) никогда не волновали - всегда оказывалось, что быстродействие лимитируется чем-то другим. Правда, приложений под системы реального времени я не разрабатывал, допускаю что там может быть иначе.
Re: GoTo или repeat until?
Добавлено: 01.09.2015 08:55:50
xterro
Сложности с GoTo начинаются, когда их становится много, это доставляет реальный батхёрт при отладке приложения(постоянные прыгания туда-сюда, иногда сложно отследить последовательность выполнения, логику действий приложения). Да и просо, это считается дурным тоном в программировании. Как показывает практика, практически всегда можно обойтись без goto(мне ещё не попадалось случаев, когда нельзя было бы обойтись без goto). Если без него обойтись нельзя, то надо переделывать логику программы.

приведенный пример, какой-то он куцый, но по факту, блоки "labelGoTo1:" и "labelGoTo12:" можно оформить процедурами и вызывать уже их... без всяких прыжков по goto )
Re: GoTo или repeat until?
Добавлено: 01.09.2015 10:16:25
vitaly_l
xterro писал(а): блоки "labelGoTo1:" и "labelGoTo12:" можно оформить процедурами и вызывать уже их... без всяких прыжков по goto
sign писал(а):sign
спасибо - решение, по избавлению от GoTo внесено в мой рюкзачёк, но оно бездоказательно относительно изначального вопроса
Снег Север писал(а):... отказался в пользу циклов и подпрограмм/функций. Единственная причина - более удобный, компактный и читаемый код. Правда, приложений под системы реального времени я не разрабатывал, допускаю что там может быть иначе. ... блоки "labelGoTo1:" и "labelGoTo12:" можно оформить процедурами
Именно "оформить процедурами" и предложил уважаемый sign в примере. Но это во-первых: ЯВНО больше занимает процессор, нежели в GoTo, а во-вторых, на мой взгляд, код с GoTo - без использования процедур был на порядок более читаем, нежели с использованием процедур или циклов. Возможно в каких-то других случаях, да, GoTo усложняет, но в изначальных-то, примерах: наоборот, код упростил и ускорил решение.
xterro писал(а):Как показывает практика, практически всегда можно обойтись без goto
С тем же успехом я могу сказать что, абсолютно всегда можно обойтись без циклов, используя GoTo. И что? Мы оба правы.
Например в примере sign - мне непонятно, чем появление под-процедур - упростило отладку? ( отладка в моём понимании может сильно отличаться от вашей отладки, поймите правильно я программист "инопланетянин",
мне нужно реальное неоспоримое доказательство )
Добавлено спустя 8 минут 88 секунд:И кстати в примере sign - не хватает бесконечного цикла и которого можно выйти только при buttonExit = true; Как видно из ответов, уже три программиста - этого сразу не заметили. Получается наоборот... Взаимопонимание - усложнилось, т.. например уважаемый
скалогрыз говорит: Goto это очень полезный инструмент в наборе разработчика. И я с ним вынужден согласиться, т.к. нет реального доказательства обратного (относительно приведённых примеров):
скалогрыз писал(а):а repeat..until придумали трусы и академики. Это выдуманная и ненужная конструкция, кой не существует на аппаратном уровне.
Re: GoTo или repeat until?
Добавлено: 01.09.2015 10:45:28
xterro
По сути, с точки зрения компьютера, любой вызов функции/процедуры это есть "GoTo", только условный, с возвратом в точку вызова. GoTo же - это безусловный переход, т.е перейдя по нему, программа продолжит выполнение с места перехода, не возвращаясь в точку вызова(воткнул goto не туда и привет при отладке, внезапно программа работает не так как ожидалось, но на малых объёмах кода, когда глаз ещё не замылился, это не проблема), какой-то прям assembler-style на языке высокого уровня(от чего собственно и старались уйти, разрабатывая такие языки). А вообще это дело вкуса, можно носить штаны, а поверх одевать шорты, но вы же так не делаете, хотя никто этого не запрещает... не носите и всё тут, дурной вкус, на улице засмеют... да и не удобно, если что, две ширинки расстегивать, то же самое и тут. Каких-то технических ограничений в использовании конечно же нет, но код программы получается как масло-мАсляное. Да и просто удобнее использовать функции или процедуры, т.к они имеют имя и уже по нему можно понять что делает та или иная ветка/условие кода, без перепрыгиваний и перематываний листинга. В общем, со временем сами {label1: всё поймёте}, а не поймёте, старшие дадут по рукам и goto label1;

Re: GoTo или repeat until?
Добавлено: 01.09.2015 10:57:30
vitaly_l
xterro писал(а):а поверх одевать шорты, но вы же так не делаете, хотя никто этого не запрещает... не носите и всё тут, дурной вкус, на улице засмеют... да и не удобно
Расскажите это мастерам спорта по футболу и посмотрим кто кого засмеёт: Вы болельщиков или болельщики Вас?... Но опять таки Ваш пример не более чем словоблудие, а я просил реальный пример и доказательства.
xterro писал(а):Да и просто удобнее использовать функции или процедуры, т.к они имеют имя и уже по нему можно понять что делает та или иная ветка/условие кода
А по названию GoTo нельзя понять что она делает? Ну назовите лейбл более понятно (при работе в команде - Вы безусловно правы, лейбл нужно было назвать более понятно). И что? Вы всё равно не решили поставленный в топике вопрос - сплошное словоблудие и пустое вихляние. "Старшие какие-то..." - бандиты, рабовладельцы, поставят на место, засмеют и т.д.,
а конкретного доказательства в Вашем ответе нет.
Re: GoTo или repeat until?
Добавлено: 01.09.2015 11:23:09
Mikhail
vitaly_l писал(а): Использование GoTo действительно очень плохо для программы?
Не всегда, иногда его использование упрощает код, например выход из нескольких вложенных циклов, работа с ресурсами (если не использовать исключения). Но, в целом, использование goto - зло.
Re: GoTo или repeat until?
Добавлено: 01.09.2015 11:28:55
xterro
И что? Вы не решили поставленный в топике вопрос
Я его и не решал.
а конкретного доказательства в Вашем ответе нет.
Потому что по данному вопросу, нет никаких доказательств и быть не может в принципе. Причина не использования goto одна - отсутствие необходимости, нет таких задач, где его применение было бы оправдано или целесообразно. Хотите использовать - используйте, флаг вам в руки...
Re: GoTo или repeat until?
Добавлено: 01.09.2015 11:48:59
vitaly_l
Mikhail писал(а):выход из нескольких вложенных циклов
Да согласен, вот пожалуйста уже трое, говорят об исключительной полезности GoTo. А альтернатива - пока что только в сложности отладки, но конкретного примера никто не привёл и не объяснил.
.
Re: GoTo или repeat until?
Добавлено: 01.09.2015 15:27:07
скалогрыз
vitaly_l писал(а):например уважаемый скалогрыз говорит: Goto это очень полезный инструмент в наборе разработчика. И я с ним вынужден согласиться, т.к. нет реального доказательства обратного (относительно приведённых примеров)
Линус Торвальдс срывает покровы!.
Но хочу заметить, vitaly_l, что твой первый пример написан отвратительно! Правильно его писать вот так:
Код: Выделить всё
labelGoTo1:
а := 'Задаётся заново только для labelGoTo1';
b := 'Задаётся заново только для labelGoTo1';
c := 'Задаётся заново только для labelGoTo1';
d := 'Задаётся заново только для labelGoTo1';
e := 'Задаётся заново только для labelGoTo1';
labelGoTo2:
f := 'Одинаковое для labelGoTo1 и labelGoTo2';
g := 'Одинаковое для labelGoTo1 и labelGoTo2';
k := 'Одинаковое для labelGoTo1 и labelGoTo2';
LabelMainLoop:
...
test := functionTest(a,b,c,d,e,f,g,k);
if buttonExit = true then exit;
ProcessMessages;
if not someGlobalBoolean then goto LabelMainLoop;
if test = 1
then GoTo labelGoTo1
else GoTo labelGoTo2;
потому что двойные стандарты это плохо, и программа(/модуль/текст процедуры) должна писаться используя однообразные подходы. Это важно повышения удобство чтения и понимания программы(/модуль/текста процедуры). По той же причине, что и в стихах, держится рифма.
Re: GoTo или repeat until?
Добавлено: 01.09.2015 15:59:42
vitaly_l
скалогрыз писал(а):Правильно его писать вот так:
КОД: ВЫДЕЛИТЬ ВСЁ
labelGoTo1:
а := 'Задаётся заново только для labelGoTo1';
b := 'Задаётся заново только для labelGoTo1';
c := 'Задаётся заново только для labelGoTo1';
d := 'Задаётся заново только для labelGoTo1';
e := 'Задаётся заново только для labelGoTo1';
labelGoTo2:
f := 'Одинаковое для labelGoTo1 и labelGoTo2';
g := 'Одинаковое для labelGoTo1 и labelGoTo2';
k := 'Одинаковое для labelGoTo1 и labelGoTo2';
LabelMainLoop:
...
test := functionTest(a,b,c,d,e,f,g,k);
if buttonExit = true then exit;
ProcessMessages;
if not someGlobalBoolean then goto LabelMainLoop;
if test = 1
then GoTo labelGoTo1
else GoTo labelGoTo2;
потому что двойные стандарты это плохо, и программа(/модуль/текст процедуры) должна писаться используя однообразные подходы. Это важно повышения удобство чтения и понимания программы(/модуль/текста процедуры). По той же причине, что и в стихах, держится рифма.
Вот пожалуйста, реальный код и реальное доказательство с пояснениями. И я верю, скалогрызу, т.к. понимаю, что это будет работать либо с той-же скоростью, либо на порядок быстрее, особенно без подключения под-функций.
Есть программисты способные оспорить пример приведённый уважаемым скалогрызом? Или всё-таки вселенная существовала бесконечно долго до глобального взрыва (к вопросу об Академиках и трусах)?
.
Re: GoTo или repeat until?
Добавлено: 01.09.2015 16:18:07
sts
нашли о чем спорить
была удачная пиар компания против гото от опытных товарищей, дабы, в дальнейшем, избавить их от разбора будущего говнокода наклепанного молодежью (что уже было в 80х), а сами, втихаря, его используют, благо в прикладных задачах в нем просто не возникает необходимости, а исходники драйверов мало кто смотрит.
Добавлено спустя 1 минуту 29 секунд:
яркий пример удачного манипулирования группой людей
Re: GoTo или repeat until?
Добавлено: 01.09.2015 16:46:22
Ism
Goto малопредсказуем и очень плохо читаем, я со временем научился обходиться без него, достаточно обычных циклов и условий