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

    +86

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    @Override
    public boolean equals(Object obj)
    {
       return obj != null && obj.equals(this);
    }

    Запостил: SSSandman, 26 Марта 2013

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

    • class Trap {
          public boolean equals(Object obj) {
             return obj != null && obj.equals(this);
          }
      }
      ...
      Trap a = new Trap();
      if (a.equals(a)) {
          // прошла вечность...
      }
      Ответить
      • для вечности нужен большой стек
        Ответить
        • Джва стека
          Ответить
        • Или tail call optimization. Здесь как раз кошерная хвостовая рекурсия будет.
          Ответить
          • http://goo.gl/ox8E6
            gcc, вот, сообразило что тут к чему.

            http://goo.gl/gqGCt
            И даже так (смотрим строки 5 и 6).
            Ответить
            • По умолчанию там clang компилит. Он нормально делает.
              Ответить
              • Ну gcc заменяет рекурсию на вечный цикл в обоих случаях, и это правильно. Clang почему-то тупо возвращает 0, и это не очень нормально...
                Ответить
          • А я кстати не особо шутил про джва стека
            public boolean equals(Object obj) {
            	try{
            		return obj.equals(this);
            	}finally{
            		return obj != null && obj.equals(this);
            	}
            }
            Ответить
            • Без TCO это просто продлит мучения программы ;)

              Будет падать не через O(stacksize) а через O(stacksize^2), если не туплю.
              Ответить
              • А, походу туплю, и получится O(2^stacksize). Но все равно это не вечность.
                Ответить
                • >Но все равно это не вечность.
                  А ты попробуй.
                  Это как история про ханойскую башню. По человеческим меркам - вечность.
                  Ответить
                  • > По человеческим меркам - вечность.
                    А потом, когда-нибудь, программа вылетит. И бессмертные энергетические существа назовут ее автора говнокодером, не умеющим писать программы с расчетом на будущее.

                    https://ideone.com/nxELez
                    Ответить
                • зависит от размера стека.

                  вы похоже разбалованы слабыми и медленными десктопными системами.

                  на правильном *них серваке (со слегка кривой конфигурацией, типа: без лимита на размер стека и размер корки) и 64бита, это будет почти вечность, потому что свопать начнет очень скоро. потом приложение повалится в корку, и еще одну небольшую вечность почти весь своп будет переливатся в кор-дамп программы.

                  если тебе интересно, можешь посчитать эффект свопа на "производительность." :)
                  Ответить
                  • Я понимаю. Но это никак не отменяет того факта, что математически это не вечность. В отличие от случаев, когда компилятор делает ТСО, как гцц в примере выше.

                    П.с. кстати человека программа 3.14159 переживет уже при совсем маленьком объеме стека. Места под 64 фрейма вполне хватит до момента, когда догорит солнце ;)
                    Ответить
                    • Так она и длинных стеков не требует, и не свопится.
                      По крайней мере несколько первых тысяч лет.
                      Код надо писать эффективно.
                      Ответить
                      • Вот с длинным стеком она как раз засвопится. Надо покороче, чтобы в кеш помещался, тогда быстрее будет перебирать...
                        Ответить
                        • А хотя не засвопится. Будет копошиться в районе конца стека. Все норм.
                          Ответить
                    • > математически это не вечность.

                      вечность - это понятие растяжимое :)
                      Ответить
            • f(1) = 1
              f(N) = f(N-1) + f(N-1)

              f(N) = 2^N
              Как-то так.
              Ответить
        • Стек мебиуса
          Ответить
          • Бегает по кругу, первым проходом пишет в little endian вторым вверх-ногами в big endian и так далее? ;)

            P.S. Что-то я слабо представляю где у стека стороны...
            Ответить
            • Ну почему, тут как раз понятно ) В начале области памяти стека - начало, в конце - конец )
              Ответить
              • Стек это божья инстанция. Ибо в конце его есть начало, а в начале конец.
                Ответить

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