На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
Страницы: (7) « Первая ... 2 3 [4] 5 6 ... Последняя » все  ( Перейти к последнему сообщению )  
> Нелюбовь к goto
    Хмм... Сам я goto ПОЧТИ не юзаю, но глупо считать него ненужным или тем более вредным(особенно если он ведёт на метку с толковым названием, типа extremal_error_exit :)).

    Если кто-то (физически близко находящийся : )) мне скажет, что лучше написать лишних десять строк кода, чем поставить goto -- серьёзно рискует получить увечья. И не за наличие мнения по теме, а за то, что не сможет ответить за базар (т.е. обосновать своё высказывание)

    А вообще, здесь не место для флейма (да он и вовсе неуместен, надо просто банить тех кто немотивированно орёт "goto отстой" : ) ), есть специальный холивар на эту тему.

    ЗЫ. И не надо мне говорить, что пять вложенных if, физически не помещающихся в один экран кода, нагляднее (даже звучит-то тупо...), чем 2 goto, указывающих на одну и ту же метку.

    И ещё одно "зы": Вот примерно так выглядит структура case select на пхп:
    ExpandedWrap disabled
      switch ($a){
        case 1:
           echo "1";
           break;
        case 2:
           echo "2";
           break;
        default:
           echo "not 1, not 2."
           break;
      }


    так вот, пославлю ПЛЮС тому, кто сможет ВНЯТНО сказать, чем вот такой вариант был бы хуже (синтаксис условный, это НЕ работает):
    ExpandedWrap disabled
      switch ($a){
        case 1:
           echo "1";
           goto end_select;
        case 2:
           echo "2";
           goto end_select;
        default:
           echo "not 1, not 2."
           goto end_select;
      }
      label end_select:


    разница только в том, что в оригинале слово goto с переходом на подразумеваемую_метку заменено специальным аналогом - словом break.
    Просто для того, чтоб не было goto.
      BlackSnake
      Цитата
      switch ($a){
      case 1:
      echo "1";
      goto end_select;
      case 2:
      echo "2";
      goto end_select;
      default:
      echo "not 1, not 2."
      goto end_select;
      }
      label end_select:

      зачем здесь Goto, если после Case идет эта метка label end_select:, ведь выполнится только что-то одно, что первое подойдет по условию, и сразу уйдет за пределы Case, на то, что стоит после него.
      Ведь принцип работы Case, выполнять одно условие. Или я чего-то не догоняю.
        Цитата Dr._S @
        Ведь принцип работы Case, выполнять одно условие. Или я чего-то не догоняю.


        Сразу заметно, что не сишник-)

        Добавлено
        Цитата Lucifer @
        И неудобстве сопровождения


        Совершенно голословное утверждение.
        Всякому фрукту свое время. В том числе и GoTo.
        Блин, холивар продолжается :lol:
          Цитата Демо @
          Блин, холивар продолжается

          Ну, пока всё идет достаточно спокойно. Главное - держите себя в руках, и модераторы вас не тронут :D
            goto не использую, не возникает необходимости...
            только как временная мера...

            Цитата BlackSnake @
            switch ($a){
            case 1:
            echo "1";
            goto end_select;
            case 2:
            echo "2";
            goto end_select;
            default:
            echo "not 1, not 2."
            goto end_select;
            }
            label end_select:

            а зачем? просто чтобы было?
            все какую-то синтетику, в качестве примеров приводят
            покажи кусок кода из реального проекта, где goto тебе помогло(сократило, улучшило читабельност кода и тд)
              Демо,
              Цитата
              Сразу заметно, что не сишник-)
              да, не сишник, этого не знал, теперь понятно, уже почитал. В этом случае, на мой взгляд проще обойтись break;, чем лишняя метка.
                BlackSnake
                Цитата
                кто сможет ВНЯТНО сказать, чем вот такой вариант был бы хуже

                Тем что придется писать "goto end_select", что на 10 символов длиннее break :) Плюс, лишняя строчка с самой меткой...
                  хмм... пока никто ничего ОБЪЕКТИВНОГО не сказал...

                  Цитата Dr._S, 21.02.2006, 12:17:11, 1022622
                  В этом случае, на мой взгляд проще обойтись break;, чем лишняя метка.

                  видишь ли в чём дело... эта метка ЕСТЬ ВСЕГДА (просто для программера она неопределена, только для компилятора/интерпретатора), и break; - это всего лишь СИНОНИМ goto end_case_label.

                  Цитата Shaggy, 21.02.2006, 11:28:15, 1022576
                  а зачем? просто чтобы было?
                  все какую-то синтетику, в качестве примеров приводят
                  покажи кусок кода из реального проекта, где goto тебе помогло(сократило, улучшило читабельност кода и тд)

                  это не синтетика, а кусок реального проекта :) только он ОБРАТНЫЙ, т.е. показывает, как плохо БЕЗ goto. (напомню, я про пхп говорил, а там goto если и есть, то в мануалах не объявлен)

                  или ты структурой case select не пользуешься?

                  имхо, далеко не самая читабельная вещь, особенно если растянуть её строк так на тысячу. (принципиально не выделяю бессмысленных функций)
                    Цитата BlackSnake @
                    эта метка ЕСТЬ ВСЕГДА (просто для программера она неопределена, только для компилятора/интерпретатора), и break; - это всего лишь СИНОНИМ goto end_case_label.

                    да, но ЯВУ позволяют абстрагироваться от деталей реализации
                    пусть она и существует, но мне та этот счёт напрягаться не нужно, это головная боль компилятора
                    Цитата BlackSnake @
                    показывает, как плохо БЕЗ goto.

                    :) улыбнуло
                    Цитата BlackSnake @
                    или ты структурой case select не пользуешься?

                    я Delphi`ст, там эти бряки не нужны совершенно :tong:
                      тебе никогда не приходилось набивать код такими комментами? а я такое и сам бывает пишу, и чужое часто вижу (прим: в релизах, даже в опен-сорсных, часто потёрта значительная часть каментов, которые были поставлены разработчиками "для себя")

                      ExpandedWrap disabled
                        //это скобка от блока If в самом начале. если обращение
                        //прямое, без  субдомена, портал неактивен и выполнение
                        //продолжается со строки, следующей за скобкой.
                        }


                      вот ещё пример:

                      ExpandedWrap disabled
                           }
                           echo "</div>";
                          }
                         }
                         echo "</div>";
                        }
                         
                        }}} else {


                      очень понятно, что где? Учти, что парная открывающая скобка от полследней закрывающей - на 1200 строк выше, следующие две - примерно на 800 и 700 строк, причём там (между 1й и 2й скобками ещё несколько циклов, два селекта и несколько ифов, каждый со своими наборами скобок)

                      и ты хочешь сказать, что это УДОБНЕЕ меток??? :ph34r:

                      Грустно... как людям паскальщики мозг промыли...
                        Цитата BlackSnake @
                        и ты хочешь сказать, что это УДОБНЕЕ меток???

                        НЕТ :wacko:

                        Цитата BlackSnake @
                        на 1200 строк выше, следующие две - примерно на 800 и 700 строк,

                        такую функцию писать, а тем более отлаживать НЕ СТАНУ!
                        здоровье дороже
                          BlackSnake 1200 строк - это сила..... Нельзя было на функции разбить?
                          У меня лично (хоть я и не считаю себя хорошим программистом) больше 50-60 строк функция не занимает....
                          И никаких проблем нету. И я почти уверен в том, что любую программу можно разбить на короткие функции.
                            Цитата Lucifer, 22.02.2006, 01:00:12, 1023281
                            BlackSnake, а неписать такие длинный функции ты не пробовал? Мартин Файлер "Рефакторинг".
                            И мозги мне никто не промывал.


                            насчёт длинных функций - я НИКОГДА не выделяю код в отдельную функцию, если это не несёт СМЫСЛОВОЙ НАГРУЗКИ, и если он непериодичен. более того, иногда я разворачиваю функции в периодический код, ради оптимизации ВЫПОЛНЕНИЯ.

                            когда речь идёт о пхп, всё ещё сложнее... из-за отсутствия goto нередко приходится идти на вообще немыслимые извращения, ради того, чтобы не набивать код чем-нить типа die();


                            вот недавний пример: скрипт, выполняющий ПОСЛЕДОВАТЕЛЬНОСТЬ действий (заполняешь форму, жмёшь сабмит, ЭТОТЖЕ скрипт обрабатывает результат и выдаёт другую форму, и так несколько раз.)...
                            в конечном итоге я развернул его в структуру select case, по полученным данным определяющую, какую форму давать теперь, и выбирающую одну из функций, анализирующих данные и генерящих новую форму, но это было неправильной и ВЫНУЖДЕННОЙ мерой, нарушающей прЫнцЫпы структурного программинга и ДЕЙСТВИТЕЛЬНО затрудняющей разбор кода...
                            Функция должна только анализировать данные и возвращать результат, а применение функции в качестве контейнера кода - вообще-то, изврат.


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



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


                            Вообще же, сам я в состоянии разобратся в любом коде (разумеется, на знакомом языке), особенно если код грамотно комментирован. (в МОЁМ коде - не менее 10% - комменты.)
                            И я искренне считаю, что писАть надо так, чтобы: а) было удобно писаАть. б) оптимизировать выполнение кода.

                            И если ради оптимизации time-critical участка мне придётся отказаться от ООП, и соорудить код, где каждая пятая строка - goto, а функции развёрнуты в периодики, я не буду колебаться ни секунды. (разумеется, только в том случае, если стандарные приёмы оптимизации, вроде кэширования свойств объектов и применения архитектурно-совместимых величин (для Win32 это означает, что все переменные,какие удастся, описываются как Long. Это даёт до 7% прироста эффективности.), окажутся недостаточными)
                              BlackSnake,
                              Цитата
                              видишь ли в чём дело... эта метка ЕСТЬ ВСЕГДА (просто для программера она неопределена, только для компилятора/интерпретатора), и break; - это всего лишь СИНОНИМ goto end_case_label.
                              я уже про это писал, что если накатать две проги, одинаковые по функциональности, откомпилить, а птом дизассемблировать и посмотреть тот участок, где есть и где нету Goto, то они ничем не будут отличаться.

                              Пример:
                              ExpandedWrap disabled
                                   Dim i As Integer, j As Integer
                                   If Second(Time) / 2 <> Int(Second(Time) / 2) Then GoTo 1
                                   For i = 1 To 100
                                      j = j + i
                                   Next i
                                1:
                                   MsgBox j


                              ExpandedWrap disabled
                                   Dim i As Integer, j As Integer
                                   If Second(Time) / 2 = Int(Second(Time) / 2) Then
                                     For i = 1 To 100
                                       j = j + i
                                     Next i
                                   End If
                                   MsgBox j


                              Мне кажется, что это бессмысленный спор, в итоге каждый останется при своем мнении и никто никому ничего не докажет, да и в этом нет смысла.
                                Цитата BlackSnake @
                                И я искренне считаю, что писАть надо так, чтобы: а) было удобно писаАть. б) оптимизировать выполнение кода.
                                a) Удобно читать - что означает "удобно отлаживать" и удобно "сопровождать". После того, как мне пришлось поучаствовать в паре проектов по отладке/сопровождению "чужого" кода, я ставлю это на первое место. Да и в своем коде, через пару лет после написания ... ой-ой-ой.
                                б) оптимизировать выполнение кода (но только если это на самом деле необходимо - иначе - ассемблер в руки, или может в машинных кодах?)
                                в) было удобно писАть.
                                Если на а) стояло бы "оптимизировать выполнение кода" языки высокого уровня просто бы никогда не появились, про интерпретаторы я вообще молчу.
                                Цитата BlackSnake @
                                И если ради оптимизации time-critical участка мне придётся отказаться от ООП, и соорудить код, где каждая пятая строка - goto, а функции развёрнуты в периодики, я не буду колебаться ни секунды.
                                Лучше хотя бы на секунду задуматься - "а это на самом деле time-critical?" Часто натыкAлся на код по приему нек. информации по нек. соединению, очень-очень "таймекритично соптимизированный", после которого шел код по обработке этой информации, который просто физически не успевал да и не мог поспеть за этим оптимизированным потоком данных - и кому было нужно торопиться?
                                Цитата BlackSnake @
                                (для Win32 это означает, что все переменные,какие удастся, описываются как Long. Это даёт до 7% прироста эффективности.), окажутся недостаточными)
                                Что-то это как-то поверхностно звучит, точнее, не по-боюсь этого слова, - по-дилетански. Скорее "для 32-х разрядной ОС на 32-разрядном процессоре, для поддерживающего такой процессор компиляторе и то - не всегда :)". Например, для той же win32 на 64-битном процессоре бывает оптимальнее использовать __int64... и то - не всегда :)".

                                Цитата Dr._S @
                                Мне кажется, что это бессмысленный спор, в итоге каждый останется при своем мнении и никто никому ничего не докажет, да и в этом нет смысла.
                                Закоренелые - остнуться, а "сомневающиеся" будут смотреть на аргументы. Единственным стОящим аргументом за goto было подмена break в switch, но Люцифер его опроверг одним мановением руки :). Про удобство использования goto в функциях по 800 строк, принимая во внимание мой пункт а), я лучше по-молчу, чтоб не прослыть хамом.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0469 ]   [ 15 queries used ]   [ Generated: 14.06.24, 18:02 GMT ]