1. Java / Говнокод #7209

    +83

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    public final static String sqlCottOpen = new StringBuilder()
    			.append("select\n")
    			.append("rtt.object_id as rtt_id,\n")
    			.append("rtt.name as rtt_name,\n")
    			.append("stt.object_id as stt_id,\n")
    			.append("stt.name as stt_name,\n")
    			.append("(SELECT status_value.value\n")
    			// Ещё 40 строчек апендов
    			.append("      and rownum = 1) stt").toString();

    Одна из десятка констант модуль Contants.

    Запостил: stokito, 08 Июля 2011

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

    • "Добавление" прием учил парень.
      Ответить
    • прям метаговно:
      1. какого хуя™ клеить стрингбилдером вручную, + вполне так же перегружен
      2. какого хуя™ не в одной строчке
      3. какого хуя™ в константе хранить запрос
      4. какого хуя™ вообще запрос в явном виде (да еще и с мускульным акцентом)
      Ответить
      • а можно по всем пунктам поподробнее?
        Ответить
        • Ну я попробую ответить:
          1. Тут создаётся стрингбилдер, 50 раз дёргается его метод append, а потом он преобразовывается в строку. Это совершенно лишние операции поскольку можно сразу задать строковый литерал.
          2. Многострочные константы это потенциальный источник гемора, особенно если пропустить пробел или символ переноса строки.
          3. Запросы не желательно хранить в константах, они не рассчитаны для этого. Лучше их загружать из шаблона или оформить его в хранимую процедуру. Иногда бывает нужно что-то дописывать в запрос, тогда хранимая процедура не поможет.
          4. См. пункт 3. Хотя возможно комментатор имел в виду наличие SQL'ного форматирования внутри (отступы, переносы строк).
          Ответить
        • 1. ""+"" эквивалентно new StringBuilder("").append("")
          2. лишние операции, можно было в строку
          3. совершенно нецелесообразно хранить запрос sql в константе
          4. существует jdbc и querybuilder/orm фреймворки для более удобного и красивого обращения с базой
          Ответить
          • 1. Согласен
            2. Не согласен. Ниже приведем пример того как бы это выглядело в строчку. Считаю, что в данном случае, многострочно выглядит выгоднее.
            3. Почему нецелесообразно? Как можно сделать лучше? Тот же самый jpa со своими @NamedQuery по сути и есть хранение запроса в константе.
            4. А если в проекте всего 3-4 таблицы и используется не больше 10 запросов и заведомо известно, что дальнейшего роста проекта не будет? Про целесообразность библиотек мы уже поговорили в #7177.

            П. С. Неплохо бы указывать размер проекта, когда постится код.
            П. С. С. Учитывая название константы, это все же скорее всего говнокод.
            Ответить
          • На самом деле компилятор склеивает строковые литералы, то есть "string1" + "string2" будет заменено на "string1string2". Так что это ещё хуже, чем просто конкатенация плюсами, которая была бы осуществлена на стадии компиляции.

            А вот если часть строки генерируется динамически, тогда да, "string" + func() эквивалентно new StringBuilder().append("string").append( func()).toString(). Хотя опять же компилятор оптимизирует байт-код по сравнению с явным вызовом StringBuilder.

            Явно вызывать StringBuilder имеет смысл лишь в циклах, когда промежуточные результаты присваиваются временной переменной.
            Ответить
            • может быть в рантайме компилятор и идет на такую оптимизацию, я не в курсе. Но при дебаге явственно видно, что используется StringBuilder
              Ответить
        • private final static String sqlCottOpen = "select\nrtt.object_id as rtt_id,\nrtt.name as rtt_name,\nstt.object_id as stt_id,\nstt.name as stt_name,\n(SELECT status_value.value\n..."
          Ответить
      • >какого хуя™
        откуда эта фраза? чем знаменита?
        Ответить
      • капитан очевидность озадачен
        Ответить
    • думаю что он так хотел форматирование текста сделать

      ХА-ХА-ХА-ХА
      Ответить
    • показать все, что скрытоvanished
      Ответить

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