(решено) GoTo или repeat until?

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

(решено) GoTo или repeat until?

Сообщение vitaly_l » 31.08.2015 20:45:23

Всем привет и хорошего настроения!

Правила:
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 действительно очень плохо для программы?



.
Последний раз редактировалось vitaly_l 04.09.2015 13:33:19, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: GoTo или repeat until?

Сообщение скалогрыз » 31.08.2015 21:25:49

Goto это очень полезный инструмент в наборе разработчика.
Но только до тех пор, пока мне не нужно отлаживать этот самый код, использующий Goto.

а repeat..until придумали трусы и академики. Это выдуманная и ненужная конструкция, кой не существует на аппаратном уровне.

рекомендую использовать Goto для:
* краткости и наглядности записи кода
* аппаратной эффективности
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: GoTo или repeat until?

Сообщение sign » 01.09.2015 07:16:25

Код: Выделить всё
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;               
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: GoTo или repeat until?

Сообщение Снег Север » 01.09.2015 08:33:04

Когда-то (очень-очень давно) я перешел с Фортрана на Турбо-паскаль и некоторое время использовал, по привычке, goto. Потом, освоившись в языке, полностью от переходов по метке отказался в пользу циклов и подпрограмм/функций. Единственная причина - более удобный, компактный и читаемый код.

Вопросы скорости меня (именно в этом отношении) никогда не волновали - всегда оказывалось, что быстродействие лимитируется чем-то другим. Правда, приложений под системы реального времени я не разрабатывал, допускаю что там может быть иначе.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: GoTo или repeat until?

Сообщение xterro » 01.09.2015 09:55:50

Сложности с GoTo начинаются, когда их становится много, это доставляет реальный батхёрт при отладке приложения(постоянные прыгания туда-сюда, иногда сложно отследить последовательность выполнения, логику действий приложения). Да и просо, это считается дурным тоном в программировании. Как показывает практика, практически всегда можно обойтись без goto(мне ещё не попадалось случаев, когда нельзя было бы обойтись без goto). Если без него обойтись нельзя, то надо переделывать логику программы. :) приведенный пример, какой-то он куцый, но по факту, блоки "labelGoTo1:" и "labelGoTo12:" можно оформить процедурами и вызывать уже их... без всяких прыжков по goto )
xterro
постоялец
 
Сообщения: 148
Зарегистрирован: 23.02.2014 13:49:33

Re: GoTo или repeat until?

Сообщение vitaly_l » 01.09.2015 10:59:24

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 придумали трусы и академики. Это выдуманная и ненужная конструкция, кой не существует на аппаратном уровне.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: GoTo или repeat until?

Сообщение xterro » 01.09.2015 11:45:28

По сути, с точки зрения компьютера, любой вызов функции/процедуры это есть "GoTo", только условный, с возвратом в точку вызова. GoTo же - это безусловный переход, т.е перейдя по нему, программа продолжит выполнение с места перехода, не возвращаясь в точку вызова(воткнул goto не туда и привет при отладке, внезапно программа работает не так как ожидалось, но на малых объёмах кода, когда глаз ещё не замылился, это не проблема), какой-то прям assembler-style на языке высокого уровня(от чего собственно и старались уйти, разрабатывая такие языки). А вообще это дело вкуса, можно носить штаны, а поверх одевать шорты, но вы же так не делаете, хотя никто этого не запрещает... не носите и всё тут, дурной вкус, на улице засмеют... да и не удобно, если что, две ширинки расстегивать, то же самое и тут. Каких-то технических ограничений в использовании конечно же нет, но код программы получается как масло-мАсляное. Да и просто удобнее использовать функции или процедуры, т.к они имеют имя и уже по нему можно понять что делает та или иная ветка/условие кода, без перепрыгиваний и перематываний листинга. В общем, со временем сами {label1: всё поймёте}, а не поймёте, старшие дадут по рукам и goto label1; :D
xterro
постоялец
 
Сообщения: 148
Зарегистрирован: 23.02.2014 13:49:33

Re: GoTo или repeat until?

Сообщение vitaly_l » 01.09.2015 11:57:30

xterro писал(а):а поверх одевать шорты, но вы же так не делаете, хотя никто этого не запрещает... не носите и всё тут, дурной вкус, на улице засмеют... да и не удобно
Расскажите это мастерам спорта по футболу и посмотрим кто кого засмеёт: Вы болельщиков или болельщики Вас?... Но опять таки Ваш пример не более чем словоблудие, а я просил реальный пример и доказательства.
xterro писал(а):Да и просто удобнее использовать функции или процедуры, т.к они имеют имя и уже по нему можно понять что делает та или иная ветка/условие кода
А по названию GoTo нельзя понять что она делает? Ну назовите лейбл более понятно (при работе в команде - Вы безусловно правы, лейбл нужно было назвать более понятно). И что? Вы всё равно не решили поставленный в топике вопрос - сплошное словоблудие и пустое вихляние. "Старшие какие-то..." - бандиты, рабовладельцы, поставят на место, засмеют и т.д., а конкретного доказательства в Вашем ответе нет.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: GoTo или repeat until?

Сообщение Mikhail » 01.09.2015 12:23:09

vitaly_l писал(а): Использование GoTo действительно очень плохо для программы?

Не всегда, иногда его использование упрощает код, например выход из нескольких вложенных циклов, работа с ресурсами (если не использовать исключения). Но, в целом, использование goto - зло.
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: GoTo или repeat until?

Сообщение xterro » 01.09.2015 12:28:55

И что? Вы не решили поставленный в топике вопрос

Я его и не решал.

а конкретного доказательства в Вашем ответе нет.

Потому что по данному вопросу, нет никаких доказательств и быть не может в принципе. Причина не использования goto одна - отсутствие необходимости, нет таких задач, где его применение было бы оправдано или целесообразно. Хотите использовать - используйте, флаг вам в руки...
xterro
постоялец
 
Сообщения: 148
Зарегистрирован: 23.02.2014 13:49:33

Re: GoTo или repeat until?

Сообщение vitaly_l » 01.09.2015 12:48:59

Mikhail писал(а):выход из нескольких вложенных циклов

Да согласен, вот пожалуйста уже трое, говорят об исключительной полезности GoTo. А альтернатива - пока что только в сложности отладки, но конкретного примера никто не привёл и не объяснил.

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: GoTo или repeat until?

Сообщение скалогрыз » 01.09.2015 16: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;

потому что двойные стандарты это плохо, и программа(/модуль/текст процедуры) должна писаться используя однообразные подходы. Это важно повышения удобство чтения и понимания программы(/модуль/текста процедуры). По той же причине, что и в стихах, держится рифма.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: GoTo или repeat until?

Сообщение vitaly_l » 01.09.2015 16:59:42

скалогрыз писал(а):Правильно его писать вот так:
КОД: ВЫДЕЛИТЬ ВСЁ
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;

потому что двойные стандарты это плохо, и программа(/модуль/текст процедуры) должна писаться используя однообразные подходы. Это важно повышения удобство чтения и понимания программы(/модуль/текста процедуры). По той же причине, что и в стихах, держится рифма.


Вот пожалуйста, реальный код и реальное доказательство с пояснениями. И я верю, скалогрызу, т.к. понимаю, что это будет работать либо с той-же скоростью, либо на порядок быстрее, особенно без подключения под-функций. Есть программисты способные оспорить пример приведённый уважаемым скалогрызом? Или всё-таки вселенная существовала бесконечно долго до глобального взрыва (к вопросу об Академиках и трусах)?



.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: GoTo или repeat until?

Сообщение sts » 01.09.2015 17:16:38

нашли о чем спорить
была удачная пиар компания против гото от опытных товарищей, дабы, в дальнейшем, избавить их от разбора будущего говнокода наклепанного молодежью (что уже было в 80х), а сами, втихаря, его используют, благо в прикладных задачах в нем просто не возникает необходимости, а исходники драйверов мало кто смотрит.

Добавлено спустя 1 минуту 29 секунд:
яркий пример удачного манипулирования группой людей
sts
постоялец
 
Сообщения: 406
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: GoTo или repeat until?

Сообщение Ism » 01.09.2015 17:46:22

Goto малопредсказуем и очень плохо читаем, я со временем научился обходиться без него, достаточно обычных циклов и условий
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

След.

Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

Рейтинг@Mail.ru