Школоло / Говнокод #17162 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 Cynicrus, (Updated )

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


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

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

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

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

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

        учитывая, что это блять какая-то игра с дамагом и инвентарём...
        на паскале...
        какие деньги??
        какой джейсон??
        как вообще можно писать на паскале????
        Ответить
          • используя существующий класс, который генерит 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" надо, конечно, убивать. Потому что если не убивать за это, то за что же тогда убивать?
    Ответить

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8