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

    +94

    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
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    function TMyDb.getUserItemsINTOMarkt(userid: Int64; marktid: String): SOString;
    var
      Query : TZQuery;
    begin
     Result := '';
     try
     lock;
     Query := TZQuery.Create(nil);
     if not isConnected() then
            connect();
       Query.Connection := SQLCon;
          Query.SQL.TEXT:='SELECT mi.markt_id, mi.price, mi.item_id,ui.used_limit,'+
                               'ui.max_limit,ui.inv_id,ui.inv_min_damage, ui.inv_max_damage,'+
                               'ui.inv_options,ui.inv_bonuses,ui.inv_mods,ui.modifed,'+
                               'i.name FROM bkheroes.markt_items mi '+
                               'JOIN user_inventory ui ON mi.user_id='+IntToStr(userid)+' AND '+
                               'mi.user_inv_id=ui.inv_id AND mi.markt_id='''+marktid+
                              ''' AND ui.userSellItem=''yes'' JOIN items i ON i.id=mi.item_id';
    
       if SQLCon.Connected = True then
      begin
        Query.Open;
        if Query.RecordCount > 0 then
        begin
          while not Query.EOF do
          begin
              Result := Result+'{"marktid":'+Query.FieldByName('markt_id').AsString+
                        ',"inv_id":'+Query.FieldByName('inv_id').AsString+
                        ',"price":'+Query.FieldByName('price').AsString+
                        ',"itemid":'+Query.FieldByName('item_id').AsString+
                        ',"used_limit":'+Query.FieldByName('used_limit').AsString+
                        ',"max_limit":'+Query.FieldByName('max_limit').AsString+
                        ',"min_damage":'+Query.FieldByName('inv_min_damage').AsString+
                        ',"max_damage":'+Query.FieldByName('inv_max_damage').AsString+
                        ',"options":'+explodeParams(query.FieldByName('inv_options').AsString,',',':').AsString+
                        ',"bonuses":'+explodeParams(Query.FieldByName('inv_bonuses').AsString,',',':').AsString+
                        ',"mods":'+explodeParams(Query.FieldByName('inv_mods').AsString,',',':').AsString+
                        ',"modifed":"'+Query.FieldByName('modifed').AsString+
                        '","name":"'+Query.FieldByName('name').AsString+'"},';
              query.Next;
          end;
        end;
      Result:='{"marktid":'+marktid+',"items":['+Copy(Result,1,Length(Result)-1)+']}';
      end;
      TLogger.GeneralLog('getUserItemsINTOMarkt: '+Result,'TMyDBUnit',ltTrace);
      finally
      Query.Close;
      Query.Free;
      unlock;
      end;
    end;

    О боже! Как можено такое писать за деньги? Да вообще, как можно писать такое??

    Запостил: Cynicrus, 24 Ноября 2014

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

    • Как? На PHP.
      Ответить

    • Зато без дурацких громоздских фреймворков и биндингов и MVVM которые сами строят формочки и заполняют их данными, затобез всяких ORM, правда?
      Ответить
      • А что, при кривых руках - помогут фрэймворки и прочая шелуха? Если у человека в голове триппер, то в это виновата не IDE, не компилятор, и тем более не язык программирования.
        Ответить
        • Фреймворки избавляют от необходимости написания подобного говна:)
          Хотя я согласен с тем, что и без фреймворка можно было так бойлерплейтово не писать
          Ответить
          • Ну не скажите, тот же буст например, без должного опыта только способствует говнописательству. Как и Qt на самом деле. В результате мы имеем, что сраный оконный менеджер на Qt требует как Need For Speed: Shift, да и то - тормозит при этом.
            Ответить
            • Ну Выж не хотите сказать что писать лучше вообще без оконного фреймворка* (fixed)?:)

              GUI вообще писать без опыта сложно: начиная с деятельности в евентовом треде
              Ответить
              • А причём тут окна сейчас?-) Мы не говорим об окнах, мы говорим больше об алгоритмической части, пожалуй.
                Ответить
                • Ну мы начали с того что существует 2 способа решить задачу:
                  1) Взять framework который эту задачу решает, изучить его и пользоваться.
                  2) Написать кучу бойлерплейта слабоподдерживаемого, потом как-то его генерализировать и всё равно написать свой фреймворк.

                  Я за первый вариант.

                  А что бустом, QT, и чем угодно нуб может стрельнуть себе в ногу -- это понятно
                  Ответить
                  • ZEOS - на самом деле и есть фрэймворк для работы с мускулем на самом деле. А можно - приложить голову куда надо, и писать не абстракцией по абстракции, на интерпретируемой абстракции, а нормальный код с использованием инструмента под задачу. Без лишнего, но используя необходимое. Запилив в класс приватные методы, которые будут решать общие задачи, и затем дёргая эти самые методы из методов публичных под задачи конкретные. Без тонны копипасты, 400 местров ненужных либ и т.д.

                    И да, всё же задачу решает, тот кто код пишет, а не framework.
                    Ответить
                    • Ну если у Вас есть 20 бизнес объектов, и каждому нужен CRUD, и каждому нужны пермишены, то наврядли ZEOS спасет Вас от кучи бойлерплейта)
                      Ответить
                      • Так ведь мы обсуждаем не фрэймворки вообще - в каких-то задачах они нужны, в каких-то не нужны-) Я ведь не утверждаю, что они все одно большое не нужно. Вы же мне старательно доказываете - нужно. Так, да - нужно. Но нужно, только там где без этого никак:)
                        Ответить
                        • А, ну и ещё сам запрос переписать по человечески.
                          Ответить
    • но.. ведь... это же... json!
      Ответить
      • json можно сформировать нормально, а можно через жопу. Тут второй вариант. В первом - достаточно использовать существующий класс.
        Ответить
        • в... паскале... класс?..

          учитывая, что это блять какая-то игра с дамагом и инвентарём...
          на паскале...
          какие деньги??
          какой джейсон??
          как вообще можно писать на паскале????
          Ответить
          • >>в... паскале... класс?..
            но-но) Я азы ООП изучал по Borland Pascal:)
            Ответить
            • используя существующий класс, который генерит json не через жопу™?
              в дельфи уже завезли jackson.map.ObjectMapper?
              Ответить
              • ннет.. В моем детстве не было jsona (к щастью).
                И я не уверен на счет рефлексии в паскале, а значит может быть с мапингом тоже беда
                Ответить
          • Легко и непринужденно. XE7 даже Parallels.For умеет. Ну и прежде чем выдать такой перл - надо матчасть покурить, таки да.
            Ответить
    • У нас такой стандарт написание кода, только вот так обвертка сделана
      Format(QuerySelectCountRes,[2013,2014]) в QuerySelectCountRes шаблон запроса 2013 и 2014 это подставки в отчет через %d
      Ответить
      • А параметры использовать например? Ну и там ещё текст запроса в константы вынести, отформатировать нормально? Ну Json формировать не анальным способом.
        Ответить
        • А вдруг это специальный Format, который корректно экранирует аргументы?
          Ответить
          • обработка до Format (в контроллере спец методы валидации)
            Ответить
        • QuerySelectCountRes - это и есть константа
          "Ну Json формировать не анальным способом." что??
          Ответить
    • Первый ярко видимый косяк - это в try-finally помещать внутрь создание объекта Query, который закрывается и освобождается в секции finally. В результате, если строка "Query := TZQuery.Create(nil);" вызовет-таки исключение, то переменная Query останется неинициализированной, и дальнейшие попытки вызвать Query.Close и Query.Free сами вызовут ещё исключения.

      Заполнение переменной Result, конечно, надо сделать циклом, а не строить эту жуть.

      Запрос - параметризовать.

      Ну а за конструкцию "if SQLCon.Connected = True then" надо, конечно, убивать. Потому что если не убивать за это, то за что же тогда убивать?
      Ответить

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