1. Pascal / Говнокод #4965

    +113

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    function FUNC(XD: TXMLDocument; L: ShortString): IXMLNode;
    var
      c: integer;
      ln: IXMLNode;
      s: ShortString;
    begin
      c:=0;
      while c <> XD.DocumentElement.ChildNodes.Count-1 do
      begin
        if VarToStr(XD.DocumentElement.ChildNodes[c].Attributes['id']) = L then
        begin
          ln:=XD.DocumentElement.ChildNodes[c];
          c:=XD.DocumentElement.ChildNodes.Count-1
        end else
        begin
          c:=c+1; {DEBUG(VarToStr(XD.DocumentElement.ChildNodes[c].Attributes['id'],L) } 
        end
      end;
      result:=ln
    end;

    К слову о невнимательности и "непримеченных слонах". Итак задачка: перебором найти в наборе данных нужную строку и вернуть в итоговый результате элемент набора данных. Используем код (выше). По невнимательности своей я допустил в алгоритме ошибку и функция работала несколько некорректно. Перед Вами её изначальный вариант, до исправления. Если вкратце, то баг заключался в том, что функция не читала последний элемент XML-документа. Называется, нефиг было мудрить с алгоритмом. По сути там надо убрать из двух мест "-1". Но пока я докапывался до сути ошибки, я написал тестовую функцию, сравнивающую две строки и выводящую результат сравнения в окно сообщения. Назовём её DEBUG. И... Началось непонятное. Функция выдавала сообщение, значит результаты, как видно по алгоритму, не равны, но она выдавала РАВЕНСТВО! Мозг взрывается, ломаются представления о математике и рациональности вообще!

    Запостил: Xander_Bass, 18 Декабря 2010

    Комментарии (24) RSS

    • Debug попросим в студию
      Ответить
      • if VarToStr(XD.DocumentElement.ChildNodes[c].Attributes['id'] = L then
        MessageBox(Handle,'EQUAL!','Debug',MB_OK );
        Ответить
    • Больше надо спать.
      Ответить
    • показать все, что скрытоВСЕМ ПОСТАВИЛ МИНУСЫ
      Ответить
    • Стандартная ошибка с пропуском последнего элемента.

      А ещё я никогда не любил оператор <> в заголовке цикла. Скажите честно, c может быть больше XD.DocumentElement.ChildNodes.Count? Если бы было записано
      while c <= XD.DocumentElement.ChildNodes.Count-1 do
      , то и ошибки бы не было. Более того, неравенство вместо <> в некоторых программах предотвращает зацикливание.
      Ответить
      • Да это-то и понятно. Там надо было просто удалить -1 из двух мест.
        Ответить
    • вообще, коде-стуле хреновый
      Ответить
      • Я тоже считаю, что выносить бегин на новую строчку это не круто.
        Ответить
        • А͌̈ ̲̦̳̥̥͉̣̈́я̟̖̠ ̱̖͎̯̻͆̉́̉ͧ͂̾ͅс̤̭ͥ͌̈́̆͗ч̯̱̠̣̘̓̊͂͒̽ͅи̐ͯͤͧт̾ ͖͇̥̰̟̰͚͂а͇̤̩̳̘̬̌ͭ͛̑̊͊ͅю̦ͫ,̟͙̥̓̂̑ͬ ͓͖̳ͮ͆͗ͫч͂ͪт͇͕ӧ̺͉͚͌ͫ̔ ̭̦̬͓̗̹͎̌̈́̃̾̉в̯̖̮̈́̄̓̒͗ͨы̗͕͍͇̟͙͗н̪̙͙̪ͣͭоͮ̂ ͧ̊ͬ̓ͦс̠̃̀и͖̱̠̬̞͚͐̾̍̅̚т̣̗ͥ̀ͅь̜̳̳̗̘̹ ̤̄̅͂ͨ̿͋̽б͍̘̜̓̐͛ͥ̔е͔̦͇̯ͦ͛͋͌г̦͓̥͖̙̤̑͋̀̉̈́ͭͅ и̞̖̥͕̣̩͑ͨ́̍н͚͍̣̗̖̟̼̄̏̆̂̓ ̬͙̜̯͋̋ͤ͗ͣн͉̟̳̫̩̃̽ͧа͉͓̱ͪͭ̐̓͂ͬͭ ͙͉̯̯̂̓ͧ̐̍̽̽н̩̘͍̥̞͕̆̈̉̐о͙̓̌̌̌ͭ̚в̌̀ͯ͋̌ͅу͊̉ ͩͣͤю̩̼̳̫̺ͭ̅̔ͥ̾̃̎ ͈̳̼͈͍̎̂ͦ́͌с͓̫̎т̺̮͕̘р̥̞͎͍́̐͛ͧ͐ͅо̦̪͔̥̇ͦ͗ͅч ̣к̙̥̙̳̟̝͕͋ͮ͑ў̭̣̦͚ ̳̘̙͖̰̍ͫ͋̍̂͑͗—͈̹͕̜̞̥̂̇̚ ̙̞͉̖̝̘ͦ̃к͙̱͓͓͓͕р̣͐͌̏у̪̮͍̖͔̺̞́̌т̘̘̍̒̏̌͋о̌ ̤̝̘̝͔̙̹̄͊͑̉̈!͖̜̻̮̉ͫ̒̽
          Ответить
          • Чё? Я ничего не вижу, кроме 9 строчек ятей.
            Ответить
            • он сказал: "А я считаю, что выносить бегин на новую строчку — круто"
              в хроме нормально смотрится.
              Ответить
              • TarasB однажды разоткровенничался и сказал, что использует Delphi 7
                логично предположить, что там рядом Internet Explorer 5.5
                Ответить
          • Ḧ̦́̓E̲̳̰͇ ͂̂ͭͥC͇O̩̱̒̈̇͞MĒͤͫ͆ͫ̾҉̻̮̗S̱͌̊̚!̦̲ͤͅ
            Ответить
          • Это юникод? Прикольно...
            Ответить
        • > выносить бегин на новую строчку
          керниганопоклонство до добра не доведет, я уже предупреждал

          а вообще, я не про форматирование, а про
          { уклюжая версия }
          function GetNodeById(Document: TXMLDocument; const Id: string): IXMLNode;
          var
            I: Integer;
          begin
            for I := 0 to Document.DocumentElement.ChildNodes.Count - 1 do
            begin
              Result := Document.DocumentElement.ChildNodes[i];
              if VarToStr(Result.Attributes['id']) = Id then
                 Exit;
            end;
            Result := nil;
          end;

          12 орехов > 20 зерен риса
          Ответить
          • Ну, здесь не codestyle, а скорее суть алгоритма. Одно точно подогнано под другое. Да и вообще кому как.
            Ответить
            • Какая ещё суть? Запоминай найденный узел в переменную и получится отрефакторенная копия твоего кода (которая, кстати, вернет узел с последним совпадающим Id и мусор со стека, если не найдено)

              А стильно в оригинале использование цикла не по назначению с соответственными выкрутасами для управления им и чтение неинициализированных переменных. Что значит "кому как"? Это -- говно-с.
              Ответить
              • Возможность пропуска инициализации ln в оригинальном коде не бросилась в глаза. Плюсую за зоркость! Только оригинальный код возвращал не последний совпадающий Id, а первый, поскольку строка
                c:=XD.DocumentElement.ChildNodes.Count-1
                действовала как break.

                Рефакторинг лаконичен, даже хочется несколько плюсов поставить.
                Ответить
                • а, точно, последний найденный приглючился

                  а не бросилось потому что у него идентификаторы больше похожи на смайлики
                  Ответить
    • Я все жду когда же мистер Хандер Бас сознается в авторстве шедевров http://www.govnokod.ru/4959 и http://www.govnokod.ru/4958
      Ответить
      • Остаётся только методом телепатии найти недочёты в вышеуказанных фрагментах ))) А ещё попрошу в студию непосредственный источник вышеуказанного кода.
        Ответить
    • Понял, откуда скопипащено ))) К сведению: я никогда не копирую на форумы фрагменты кода из РЕАЛЬНО работающих проектов. А теперь, мистер qbasic, потрудитесь прокомментировать вышеуказанные коды в соответствующей теме. Очень хочется слышать мнение о недочётах ))) Смелее! Я критику люблю.
      Ответить

    Добавить комментарий