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

    ExpandedWrap disabled
      Sub Parce(B() As Byte)
       
        Dim i As Integer
        Dim OpenQuote As Byte
        Dim Pos As Long
        Dim Buffer() As Byte
        
        ReDim Buffer(UBound(B))
        
        For i = 0 To UBound(B)
          Select Case B(i)
          Case 34, 39
            If OpenQuote <> B(i) Then GoTo CASE_ELSE
            OpenQuote = B(i)
          Case 60
          Case 62
          Case Else
      CASE_ELSE:
            Buffer(Pos) = B(i)
            Pos = Pos + 1
        Next
       
      End Sub


    Т.е. суть, как перейти с одного ветвления select case в другой ???
    Без нагрузки процессора лишними условиями! т.к. для парсера время критично.
      Эх, сейчас это разве goto - так, слабое подобие.
      Вот раньше в Паскале действительно goto был всем gotoям goto!
      Это было круче, чем нынешний exception (удивляюсь, как его могли реализовать при тех компиляторах).

      ..Если кто помнит, можно было из функций делать переход вовне через любое число уровней, причем не только вперед, но и назад.
      Вот против такого goto тогда в основном и выступали.. поскольку продолжение выполнения безобидного x:=f(y) можно было ожидать на любой метке.
        Цитата Adil, 22.02.2006, 17:06:02, 1023927
        a) Удобно читать - что означает "удобно отлаживать" и удобно "сопровождать". После того, как мне пришлось поучаствовать в паре проектов по отладке/сопровождению "чужого" кода, я ставлю это на первое место. Да и в своем коде, через пару лет после написания ... ой-ой-ой.
        б) оптимизировать выполнение кода (но только если это на самом деле необходимо - иначе - ассемблер в руки, или может в машинных кодах?)
        в) было удобно писАть.
        Если на а) стояло бы "оптимизировать выполнение кода" языки высокого уровня просто бы никогда не появились, про интерпретаторы я вообще молчу.


        удобство чтения - бред. как я уже говорил, я в любом коде легко разбираюсь, если он написан на знакомом мне языке и снабжён грамотными комментами, и я очень неуважаю так называемых "программистов", которые не то что свой код не умеют грамотно писать, а даже в готовом разобраться не могут. Свой код - проверял пару дней назад: читал свои сорцы 98 года... нашел несколько неудачных, на мой нынешний взгляд, решений, разобрался легко, несмотря даже на то, что ТОГДА мне вообще наср@ть было на структурность и ооп.

        Цитата Lucifer, 22.02.2006, 21:51:51, 1024160
        Либо ты видиш этой смысловой нагрузки. Я говорю о языках, поддерживающие ООП, где функция длинной в два экрана - НОНСЕНС

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

        насчёт ооп - большей тупости, чем "ООП ради ООП" даже представить не могу. всё хорошо в меру. я никогда не стану выделять что-то в объект, если с точки зрения логики оно не может быть ПРЕДСТАВЛЕНО объектом. не надо забывать, что ООП служит не для структурирования как такового, а для наглядного обозначения структуры и связей.


        Цитата Adil, 22.02.2006, 17:06:02, 1023927
        Цитата BlackSnake, 22.02.06, 03:42
        (для Win32 это означает, что все переменные,какие удастся, описываются как Long. Это даёт до 7% прироста эффективности.), окажутся недостаточными)
        Что-то это как-то поверхностно звучит, точнее, не по-боюсь этого слова, - по-дилетански. Скорее "для 32-х разрядной ОС на 32-разрядном процессоре, для поддерживающего такой процессор компиляторе и то - не всегда ". Например, для той же win32 на 64-битном процессоре бывает оптимальнее использовать __int64... и то - не всегда ".

        вин32 на проце64 - изврат.

        просто я писал не для дилетантов, а для понимающих людей... поэтому ПОДРАЗУМЕВАЕТСЯ, что речь идёт о 32х разрядной ОС, работающей на 32х разрядном процессоре, и само собой, речь о программе, скомпилированной 32х разрядным компилером.

        насчёт вин32 на 64-битном процессоре - непроверял и пока не собираюсь. года через два-три, не раньше.


        Итак, фанатам борьбы с GOTO - слив засчитан, т.к. аргументов не приведено.
        Цитата Adil, 22.02.2006, 17:06:02, 1023927
        Закоренелые - остнуться, а "сомневающиеся" будут смотреть на аргументы. Единственным стОящим аргументом за goto было подмена break в switch, но Люцифер его опроверг одним мановением руки . Про удобство использования goto в функциях по 800 строк, принимая во внимание мой пункт а), я лучше по-молчу, чтоб не прослыть хамом.

        твой пункт а) во внимание принят быть не может, ибо ты защищаешь неграмотных. незачот.
        функции по 800 строк, если тебе доводилось писать проги хотябы в 50 000 строк, не кажутся большими. незачот.

        настоящий программер пишет так, как считает правильным в каждой конкретной ситуации.
        если надо использовать goto - то НАДО его использовать, а не тратить время, изобретая путь через ж-пу, зато без него.
          BlackSnake, а вы не с ЛОРа ли будете с такой безапелляционностью, самоуверенностью и лексикой?
            Цитата
            BlackSnake, а вы не с ЛОРа ли будете с такой безапелляционностью, самоуверенностью и лексикой?

            Судя по холивара, он, наверное, с ВОРа -- windows.org.ru, буде такой появится.

            Недопрограммистов, пишущих функции по 800 строк, надо рефакторить на пилораме. Чтобы другим неповадно было. Почему? Чтобы такие команде день не портили, ежели им придется в нормальном коллективе работать.

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

            Ради Аллаха, не требуй только с такой "гениальностью" повысить тебе зарплату, если хочешь остаться в живых при нормальном начальнике. Ибо твоя гениальность не гребет никого, если код пишет более одного человека.
              Цитата SCINER @
              ExpandedWrap disabled
                Sub Parce(B() As Byte)
                 
                  Dim i As Integer
                  Dim OpenQuote As Byte
                  Dim Pos As Long
                  Dim Buffer() As Byte
                  
                  ReDim Buffer(UBound(B))
                  
                  For i = 0 To UBound(B)
                    Select Case B(i)
                    Case 34, 39
                      If OpenQuote <> B(i) Then GoTo CASE_ELSE
                      OpenQuote = B(i)
                    Case 60
                    Case 62
                    Case Else
                CASE_ELSE:
                      Buffer(Pos) = B(i)
                      Pos = Pos + 1
                  Next
                 
                End Sub


              Т.е. суть, как перейти с одного ветвления select case в другой ???
              Без нагрузки процессора лишними условиями! т.к. для парсера время критично.


              часть:
              ExpandedWrap disabled
                Case 34, 39
                   If OpenQuote <> B(i) Then GoTo CASE_ELSE
                   OpenQuote = B(i)

              в приведённом примере, ненужна, и вообще бессмысленна
              уж лучше в Case Else проверку на равенство выполнить

              Цитата
              а не тратить время, изобретая путь через ж-пу, зато без него

              goto ж0№а :lol:
              Сообщение отредактировано: Shaggy -
                Цитата Gregory Petrosyan, 23.02.2006, 01:08:25, 1024283
                BlackSnake, а вы не с ЛОРа ли будете с такой безапелляционностью, самоуверенностью и лексикой?

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

                2. самоуверенность? отсутствует. есть совершенно нормальная (не чрезмерная) уверенность в себе. Я вовсе не считаю себя правым всегда и во всём, как, например, один человек с явно китайско-вьетнамским именем :) Я живой человек, иногда я ошибаюсь, иногда мои сведения неточны, и я признаю свои ошибки, когда узнаю о них. Но есть темы, скаждем так, религиозного плана, в котрых ни я, ни мои оппоненты не могут ДОКАЗАТЬ свою правоту. вопрос "goto or not goto" относится как раз к этим темам.

                3. лексика? что не так в моей лексике?

                Ho Im, я тебя уважаю, но ты совершенно невыносимый тип.

                Цитата Ho Im, 23.02.2006, 03:07:01, 1024332
                Недопрограммистов, пишущих функции по 800 строк, надо рефакторить на пилораме. Чтобы другим неповадно было. Почему? Чтобы такие команде день не портили, ежели им придется в нормальном коллективе работать.

                Ho Im, почитай сорцы ядра твоей любимой ОСи, там и не такое есть.

                Реально, такие длинные функции для меня всё-таки не правило, а исключение, и применяю я их, как уже говорилось, только в маленьких проектах, ибо там в этом есть смысл. В больших - действительно, такие вещи применять смысла обычно нет.

                Цитата Ho Im, 23.02.2006, 03:07:01, 1024332
                Ради Аллаха, не требуй только с такой "гениальностью" повысить тебе зарплату, если хочешь остаться в живых при нормальном начальнике. Ибо твоя гениальность не гребет никого, если код пишет более одного человека.
                свой уровень, как программерский, так и IQ, я считаю средним (т.е. неглуп, но не гений :)), но человек, которому тяжело понять пару сотен строк относительно линейного кода, на мой взгляд, стоит на лестнице развития где-то между лягушкой и ёжиком. ниже только те, кто считают грамотное комментирование кода излишеством.

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

                  Таки по Фрейду :)

                  Я не знаю, очень ли ты внимательно читал сорцы ядра Linux, но там есть правило: если функция больше 50 строк, переписать так, чтобы было меньше, а если нельзя, то написать объяснительную с доказательством, что иначе не получится. Линус, тот самый Линус, которому на мнение Вирта плевать и который оправдывает goto, утверждает, что ему искренне влом разбираться с неструктурированным кодом.

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

                  С другой стороны, перл и пхп позволяют выйти из цикла на любой уровень вложенности. С пхп, если мне предстоит писать гигантский switch, я его никогда не пишу, а вместо этого создаю много функций и вызываю их по табличке. Кстати, я когда-то тоже асмом баловался, так что понятие "таблица переходов" очень оказалось кстати. А это нам дает удобство тестирования (как хочешь, так юнит-тесты и дробишь), и удобство рефакторинга -- перестраивай вызовы функций как хочешь, а сами функции, если они работают как надо, рефакторить не надо вообще. Использование goto лишает напрочь код такой гибкости.
                    Цитата
                    часть:

                    ExpandedWrap disabled
                      Case 34, 39
                         If OpenQuote <> B(i) Then GoTo CASE_ELSE
                         OpenQuote = B(i)


                    в приведённом примере, ненужна, и вообще бессмысленна
                    уж лучше в Case Else проверку на равенство выполнить

                    1. как ненужна :blink:
                    если встретилась открывающая кавычка, тогда закрываем ее, иначе надо добавить в буфер параметра тега, а для этого чтобы не дублировать код необходимо переместиться на другую ветку Select Case'а

                    2. И как интересно выглядит проверка переменной OpenQuote в Select Case ?
                      Кстати, некоторые языки поддерживают nested functions. Для них ИМХО goto не нужен. Пример:

                      ExpandedWrap disabled
                        def f():
                            def g(): do_stuff
                            def h(): do_some_other_stuff
                            def cleanup(): perform_cleanup
                         
                            if a:
                                if a1:
                                    g()
                                elif a2:
                                    cleanup()
                            elif b:
                                if b1:
                                    h()
                                elif b2:
                                    cleanup()
                            else:
                                cleanup()
                        А так разве не проще?
                        ExpandedWrap disabled
                          def f():
                                   def g(): do stuff
                                   def h(): do other stuff
                                   def cleanup(): do cleanups                                                                                                                                                                                                  
                                   if (a and a1): g()
                                   elif (b and b1): h()
                                   else: cleanup()
                          a1, a2, b1, b2 -- вовсе не обязательно константы, кроме того, после elif a2 и до cleanup() вполне может идти ещё какой-то код, etc etc etc. Само собой, этот пример не несёт никакого _практичесого_ смысла, его единственная цель -- донести до людей идею о том, что при наличии nested functions значительная область применения goto переходит, вполне естественным образом, к этим самым вложенным функциям.
                            Цитата
                            a1, a2, b1, b2 -- вовсе не обязательно константы

                            Это не имеет значения. Можешь убедиться, что для всех возможных значений a* и b* функции выполняют одинаковое действие.

                            Кстати о топике. Еще я вижу смысл в goto в том случае, если интерпретатор не имеет понятия о хвостовых вызовах, а "наглядная" в таких случаях рекурсия отъедает слишком много памяти. Тогда метка в самом начале функции и понеслась...
                              Решил сутра почитать какой-нить холивар, позабавило)
                              А теперь немного по теме:
                              - убили функции по 800 строк
                              - сам использовал goto только для выхода из большого кол-ва вложенных циклов, сейчас в основном на java пишу, где goto слово, конечно, зарезервированное, но благо не компилящееся. Ибо сделали нормальный способ эти циклы покинуть.
                              - тут приводился пример case и говорилось, почему же не заменить break на goto + label, это какое-то программирование недовысокого уровня получается. Ведь вроде бы защитники goto кричали, про убогость неиспользование всех возможностей языка. К тому ж если так тяготеете к безусловным переходом и расшифровкой того, что было выделено в отдельный оператор (как continue, break, etc.), пишите на асме, вам никто слово не скажет. :D
                                Цитата Kheor, 24.02.2006, 11:00:52, 1025261
                                - убили функции по 800 строк
                                в time-critical функциях это ОЧЕНЬ оправдано, т.к. вызов функции (даже из этого проекта) занимает достаточно много времени. Ещё такие вещи оправданы в пхп-скриптах, когда необходимо всю функциональность разместить в одном файле.


                                Цитата Kheor, 24.02.2006, 11:00:52, 1025261
                                - тут приводился пример case и говорилось, почему же не заменить break на goto + label, это какое-то программирование недовысокого уровня получается.

                                речь шла не о том, чтоб так писАть, а о том, что с с точки зрения компилера это АБСОЛЮТНО идентичные вещи, просто написанные разными буквами.


                                Цитата Kheor, 24.02.2006, 11:00:52, 1025261
                                Ведь вроде бы защитники goto кричали, про убогость неиспользование всех возможностей языка.
                                ну, я никогда не стану пользоваться какой-то возможностью языка, просто потому, что она есть, если она мне не нужна :)
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (7) « Первая ... 3 4 [5] 6 7  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0489 ]   [ 15 queries used ]   [ Generated: 21.05.24, 16:57 GMT ]