Конференция "Прочее" » Как вы относитесь к использованию меток в Delphi?
 
  • Германн © (25.05.16 02:10) [40]

    > Kerk ©   (25.05.16 02:01) [37]
    >
    >
    > > Юрий Зотов ©   (25.05.16 01:58) [35]
    > >
    > > > Возле метки пишем краткий коммент - и проблема исчезла.
    >
    > >
    > > Еще лучше - дать метке осмысленное имя.
    >
    > Ну это еще куда ни шло :)
    >
    > Но все равно я против goto

    А мы тебе его и не навязываем. :)
  • Юрий Зотов © (25.05.16 02:21) [41]
    > Goto и метки - это не прикладной функционал.

    Еще какой прикладной, если с умом комментировать! Вот пример - описание алгоритма склейки диапазонов дат на псевдокоде:

    1. Отсортировать список диапазонов
    2. result = false
    3. i = -1
    4. i++ // берем очередной диапазон из списка
    5. Если i >= (size - 1), то выход
    6. Цикл по j от (i + 1) до (size - 1) включительно {
         если i-й диапазон склеился c j-м, то {
            i-й диапазон заменить на склеенный
     j-й диапазон удалить
     i = - 1
     result = true
         }

        goto 4 // переходим к следующему диапазону в списке
      }
    // -----------------------
    И вызывать этот код в цикле, пока не вернет false.  

  • Eraser © (25.05.16 02:30) [42]
    полностью согласен с [29].


    > Юрий Зотов ©   (25.05.16 02:09) [39]


    > Дело привычки, всего лишь.

    так и есть. лично я последний раз использовал метки году эдак в 2000-ом на паскале, будучи школьником. в Делфи уже не использовал, видимо мода на них начала проходить.
    программеры более старшего поколения наверняка использовали метки в enterprise и массово, тогда это не считалось зазорным и проблем не вызывало, поэтому и выработался автоматизм.

    для меня лично, на данный момент, код построенный на анонимных методах и замыканиях будет выглядеть куда понятнее, чем код на метках, хотя, работать будет очевидно медленнее.
  • Внук © (25.05.16 09:33) [43]

    > лично я последний раз использовал метки году эдак в 2000-
    > ом на паскале

    Вот-вот. Я не помню, когда последний раз использовал goto, при том что нет у меня установки его избегать любой ценой, совершенно. Просто не нужен. Что как бы намекает нам...
  • Юрий Зотов © (25.05.16 10:25) [44]
    > Внук ©   (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:43) [45]

    > Юрий Зотов ©   (25.05.16 10:25) [44]

    Нет, намекает это нам на то, что потребность в этом операторе очень низка, и это точно не случай топикстартера.

    Операторы break и continue ведь тоже частные случаи goto, я не призываю от них отказываться, ровно наоборот. А с появлением в некоторых языках операторов break и continue  с меткой потребность в операторе goto вообще устремилась к нулю, потому что если его использование в циклах еще можно оправдать, то вне циклов - нет.
  • Владислав © (25.05.16 11:09) [46]
    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]
    Упс...

    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>
  • KilkennyCat © (25.05.16 11:36) [48]
    Получается, что единственный аргумент - читабельность хуже.

    Однако, конечным результатом программирования является программа (или результат работы программы), а не чтиво исходников.
  • virex(home) © (25.05.16 11:48) [49]
    крылья...хвосты...
    лишь бы код читаемый был и комментов побольше, что-бы через год вспомнить о чем речь

    даже если считаете что исходники вам больше не понадобятся
  • Юрий Зотов © (25.05.16 12:00) [50]
    > Владислав ©   (25.05.16 11:09) [47]

    А теперь сравним.

    1. Читабельность - примерно одинаковая (хотя на мой взгляд вариант с goto для понимания проще, но пусть будет одинаково).

    2. Длина кода - 14 и 18 строк.

    3. Лишняя переменная ПовторитьСначала.

    4. Лишние 2 проверки этой переменной.

    То есть, преимуществ никаких, а недостатки есть. И ради чего? Только чтобы не писать goto?
  • Внук © (25.05.16 12:27) [51]

    > Юрий Зотов ©   (25.05.16 12:00) [50]

    А почему пункты 2-4 отнесены к недостаткам и почему там употреблено слово "лишний"? Не потому ли, что OR и XOR, goto, String и т.д. тоже лишние? :)
  • Владислав © (25.05.16 12:55) [52]
    > Юрий Зотов ©   (25.05.16 12:00) [50]

    Все это субъективное.

    1. Без goto читабельность лучше, хотя бы потому, что с goto нужно держать в уме, что тело внешнего цикла может не выполниться полностью, а явного указания этого в коде внешнего цикла нет. Кроме этого, в варианте с goto есть неявный цикл, который с ходу таковым не воспринимается. В варианте без goto этот цикл явный.

    2. Длина на 4 строки больше. Если это будет 31 и 35, разница уже не кажется такой большой, а вот для варианта с goto длина уже может быть довольно большая.

    3. Эта переменная как раз самодокументирует внешний цикл.

    4. Их процессор выполняет, а он быстрый.

    В итоге сплошные преимущества без goto. А ради чего? Только для того, чтобы уменьшить длину на 4 строки? 8-О

    На мой взгляд - это все не аргументы.
    Вот если бы было сказано, что процедура с goto выполняется быстрее на столько-то, что увеличивает скорость работы на столько-то, а это критично, поэтому используется вариант с goto, вот это объективный аргумент, который я бы принял, и слова бы не сказал, потому что фобий по этому поводу у меня нет.
  • Kerk © (25.05.16 13:00) [53]

    > Владислав ©   (25.05.16 12:55) [52]
    >
    > Без goto читабельность лучше, хотя бы потому, что с goto
    > нужно держать в уме, что тело внешнего цикла может не выполниться
    > полностью, а явного указания этого в коде внешнего цикла
    > нет. Кроме этого, в варианте с goto есть неявный цикл, который
    > с ходу таковым не воспринимается. В варианте без goto этот
    > цикл явный.

    Вот это главный аргумент. Само наличие goto мгновенно усложняет код.
  • DVM © (25.05.16 13:45) [54]

    > Владислав ©   (25.05.16 11:09) [47]

    GOTO убрали, BREAK два раза вставили. BREAK или EXIT те же GOTO по сути.
    Будем уж последовательны, прервем цикл без BREAK.
  • Внук © (25.05.16 13:57) [55]

    > DVM ©   (25.05.16 13:45) [54]

    Попробуйте обойтись в программе без инструкций семейства JMP, тогда эта претензия будет понятна.
    Речь же о структуре кода. Операторы Break, Continue и функция Exit предсказуемы. Оператор Goto мало того, что способен выкинуть в произвольное место, еще и заставляет анализировать возможные побочные эффекты. Мне это не нравится.
  • Владислав © (25.05.16 14:00) [56]
    > DVM ©   (25.05.16 13:45) [54]

    "BREAK или EXIT те же GOTO по сути."

    Те же, да не те же. Возьмем некий абстрактный цикл с break, и такой же с goto. Можно не смотря на код ответить, какой код начнет выполняться после break? Да. А какой код начнет выполняться после goto? Нет. Сначала надо на код посмотреть.
    И еще один момент. Break нам говорит о том, что цикл завершается. Exit говорит о том, что процедура завершается. Goto не говорит ни о чем, нужно разбираться в коде.
  • NoUser © (25.05.16 14:58) [57]
    http://www.google.com/search?q=Stiv_Makkonnell_-_Sovershenny_kod_2-e_izdanie.pdf

    IV, 17. "Нестандартные управляющие структуры" (404|382)

    P.S.
    > Kerk ©   (25.05.16 13:00) [53]
    а FixInsight по этому поводу что-то ищет/предупреждает ?
  • DVM © (25.05.16 15:10) [58]

    > Внук ©   (25.05.16 13:57) [55]


    > Владислав ©   (25.05.16 14:00) [56]

    Вы оба правы, BREAK, разумеется, выкинет нас из цикла в предсказуемое место за циклом, но, с другой стороны, GOTO тоже нас перекидывает не в рандомное. Конечно, конец цикла найти проще, чем метку в объемной процедуре, но, с другой стороны, огромные процедуры сами по себе признак плохого кода и без меток.

    На мой взгляд, если GOTO перекидывает в место, расположенное "рядом", то код от такого подхода ничуть не страдает. Мне вариант с GOTO кажется даже более понятным, т.к. чем меньше циклов тем легче воспринимать код.
  • Внук © (25.05.16 15:14) [59]
    Все еще хуже. Насколько я помню, сейчас Юрий программирует в Java, в которой нет goto вообще (я ничего не путаю?). Так что это просто зависть к нам, оставшимся верным Delphi :)
 
Конференция "Прочее" » Как вы относитесь к использованию меток в Delphi?
Есть новые Нет новых   [134432   +19][b:0.001][p:0.002]