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

    +76

    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
    if (s.contains("-"))
                    {
                        String[] sa = s.split("-", 2);
                        for (Long i = Long.parseLong(sa[0].trim()); i<=Long.parseLong(sa[1].trim()); i++)
                        {
                            departmentsQueue.add(i);
                        }
                    }
                    else
                    {
                        Long id = Long.parseLong(s.trim());
                        departmentsQueue.add(id);
                    }

    Отличный цикл! Кстати, я бы тут ещё и s.contains() убрал

    Запостил: konsoletyper, 25 Августа 2011

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

    • Воняет жутко...
      1. А если "-" в начале строки...
      2. Надеюсь, обработка исключений просто не вошла в пост.
      3. Обязательно ли создавать объекты Long на каждый код подразделения?
      Я бы в такой ситуации написал бы, наверное, простенький класс
      //можно и без дженериков обойтись, но так красивее
      class Range<T extends Comparable<? super T>>
      , который на вход принимает два элемента диапазона и проверяет, входят ли в диапазон определённые значения. Так можно в теории сэкономить кучу памяти. Жаль, что в java нет аналога [1..100500] из python/haskell.
      Ответить
      • 1. Мне кажется, что здесь заведомо известно, что в код придут только строки вида '123' или '23-35'
        2. В свете п. 1 исключений не должно возникнуть
        3. А как Range использовать в данной ситуации?
        Ответить
        • Заведомо не известно. Это конфиг, туда можно хоть "мама мыла раму" написать. Другое дело, что тут, как я понимаю, Quartz отловит и залоггирует исключение. Правда, не при запуске приложения, а при каждом запуске задачи.
          Ответить
        • > как Range использовать в данной ситуации
          Использовать его вместо очереди. Если нужна именно последовательность, можно реализовать тривиальный итератор по числам. Если уж выбрали Long, то, вероятно, числа содержат знаков эдак под 18. Если кодов подразделений меньше ста и они все небольшие, оно того не стоит.
          Ответить
          • Понятно. Я просто думал, что этот код работает в стиле:
            String[] departments = "1, 3, 5-10, 25".split(",");
            for (String department: departments) {
              // вызываем код по добавлению в очередь
            }
            Ответить
      • А разве в Python список 1..100500 ленивый? Мне казалось, что только в третьей ветке. А во второй - xrange.

        Лепить здесь интервалы - это оверхед. Подразделений 100. Ну 1000 на худой конец. Да и в конфиге (а этот код как раз обрабатывает конфиги) обычно указывается не так много.

        Пункт 1 покрывается пунктом 2 - исключения ловятся снаружи. Другое дело, что там ужаса много, формат ресурса не позволяет показать всего великолепия. Например, вот класс, откуда я скопировал фрагмент - это job для Quartz. Там с каждым запуском парсятся конфиги, поднимается JaxWsProxyFactoryBean, настраиваются параметры веб-сервиса, SSL и прочее. Я понимаю, что это делается раз в 4 часа. Но всё равно - нафига писать так криво? Более того, конфиги было бы оправданно парсить для возможности их горячей правки. Но фишка в том, что Properties загружается из файла пи запуске, а при каждом запуске задачи происходит загрузка списка подразделений указанным кодом. Ну и зачем в данном случае очередь, да ещё и потокобезопасная (тоже осталось за рамками фрагмента).
        Ответить
        • Вот это уже гораздо интереснее, вы совсем не то запостили :) плюсану.
          С Range я погорячился, да. Long смутил.
          Ответить
        • Надо было сразу этот текст в описание включить, а то "Отличный цикл! Кстати, я бы тут ещё и s.contains() убрал " уж слишком неинформативно.
          Ответить
        • > А разве в Python список 1..100500 ленивый
          Да, вы правы, не ленивый. Однако же в этой ситуации его было бы удобно использовать.
          Ответить
      • Тогда, пожалуй, самое интересное - это
        i<=Long.parseLong(sa[1].trim())

        Парсим на каждой итерации, что тут стесняться то.
        Ответить
        • Да, это я и подразумевал. Но ещё и мелочи, вроде использования Long вместо long, лишнего String.contains
          Ответить
        • Вопрос: кому РЕАЛЬНО создавал проблемы производительности лишний String.trim или Long.parse, или сложение строк, а не использование StringBuilder'а?
          Ответить
          • По-моему, именно здесь больше проблемы с читабельностью и отношением, чем с производительностью.
            Ответить
            • >Парсим на каждой итерации, что тут стесняться то.
              Просто в этой фразе читался намек на плохую производительность.

              А с читаемостью тут конечно не фонтан =)
              Ответить
          • При чём тут StringBuilder? Здесь надо перед циклом распарсить sa[1] и положить результат в переменную, с которой и сравнивать i. Я понимаю, что этот код срабатывает раз в 4 часа. Но всё-таки даже в такой ситуации, при прочих равных я бы предпочёл более производительный вариант. Хотя бы потому, что не надо городить ради этого лишние 1000 строк.
            Ответить
            • StringBuilder для красного словца.

              Просто меня всегда удивляют такие вот оптимизации, типа сложения строк, или парсинга чисел, которые чаще всего дают практически незаметный рост производительности. Рост есть, но толку от него никакого.
              Ответить
              • Ну вот здесь весьма и весьма возрастёт производительность конкретно этого кода. Другое дело, что на производительности системы в целом это мало повлияет.
                Ответить
          • Кстати, вот тут надо было написать лишнюю строчку для не слишком востребованной оптимизации. Зато там, где можно было бы обойтись обычным семафором, человек нагородил лишние 50 строк: http://govnokod.ru/7567
            Ответить
      • Range бы тут не сильно помог...
        Ответить
    • показать все, что скрытоvanished
      Ответить
    • Молниеносный удар ноги Евгения отправил его в нокаут. А едва он очухался, сразу услышал ледяной голос друга:
      Ответить

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