1. Ruby / Говнокод #7857

    −96

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    <%products = Array.new
      count = Product.count(:conditions => "novelty = 'true'")
      while products.size < 10 do
        products << Product.find(:first, :conditions => "novelty = 'true'",:offset => rand(count))
        products.uniq!
      end-%>

    при количестве новинок меньше 10 получаем бесконечный цикл. счастье в продакшене, там sql запросы не пишутся в лог)

    Запостил: malleus, 13 Сентября 2011

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

    • > счастье в продакшене, там sql запросы не пишутся в лог)
      че, логи девственно чисты???
      Ответить
      • Наверняка есть какой-то аналог StackOverflowException
        Ответить
        • а как здесь переполнение стека получится?
          Ответить
          • Да, ступил. Привычка мыслить о циклах рекурсивно :(
            Ответить
            • рекурсию можно в цикл преобразовать... как и наоборот
              Ответить
              • Цикл то в рекурсию обычно просто, а вот наоборот...
                Ответить
                • наоборот тоже нетрудно - заменить стек вызова на стек программный, и - в цикл ))
                  Ответить
                  • Ага, попробуйте на досуге преобразовать quicksort или какой-нибудь древовидно-рекурсивный алгоритм в итеративную форму...
                    Ответить
                    • Ну руками стек эмулируешь - и вперёд. Только нафига... Хотя для итераторов для деревьев пригодится, например.
                      Ответить
                      • потому-что умные машины выдают "переполнение стека"
                        Ответить
                      • Руками… стимулируешь…
                        Ответить
                        • особенно правильный смысл фраза приобретает, если вспомнить, что раньше называлось "стимул"ом
                          Ответить
    • да и в целом слишком много логики во вьюхе
      Ответить
      • конкретный пример - это немного для этого проекта) там местами встречается на порядок хуже. увы, код не будет переписываться.
        Ответить

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