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

    −41

    1. 1
    List<Map<String, SearchHitField>> tweets = tweetsCollectionsService.searchCollections(searchText, collectionIds, pageNumber, pageSize);

    Хрю.

    Запостил: zaika, 21 Декабря 2015

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

    • Хрю-хрю-хрю, хрю-хрю-хрю, очень джаву я люблю!
      Ответить
    • Как можно пользоваться языком, в котором >> может означать и оператор побитового сдвига, и две подряд идущие угловые скобки?
      Ответить
      • тупой страус (томпсон, ритчи) насрал, а хомячки радостно в рот потащили
        Ответить
      • Как можно пользоваться языком, где обычная скобка - это и вызов функции, и приведение типа, и элемент синтаксиса (if, while)?!!111
        Как можно пользоваться языком, где можно ставить точку с запятой в конце строки, а можно не ставить??7777
        Как можно пользоваться языком, где с маленькой буквы может начинаться и переменная, и тип, и ключевое слово, и макрос, и константа?7777
        Ответить
        • Отставить истерику!

          Моё сообщение немного о другом. Я согласен терпеть то, что скобочки могут иметь разную семантику. Здесь же нельзя понять, означает >> один элемент языка или два, а также имеет ли символ > пару или нет. Язык с такой неоднозначной грамматикой трудно распарсить.

          Для сравнения: ) всегда имеет пару, а )) — это всегда два элемента.
          : не имеет пары, а :: — это один элемент.
          Ответить
          • ну если кому-то сложно понять, что >> относится к декларации или арифметике, то то же будет справедливо и для одной > (закрыли шаблон или применили оператор "больше"?)
            Ответить
          • И чё? Трудно распарсить - не парси, за тебя это уже другие люди сделали.
            Ответить
            • Т. е. если надо поправить уже имеющийся код, то чтобы понять, что там происходит, нужно лезть в ассемблерный выхлоп?
              Ответить
              • Как вариант, для того, "чтобы понять что там происходит", можно чуть-чуть почитать синтаксис языка и понять, что неоднозначность в этом случае невозможна, т.к. операция побитового сдвига для необъявленного символа не может быть определена, не говоря уже о том что слева тип.
                Ответить
                • > для необъявленного символа не может быть определена
                  > слева тип
                  Но чтобы в этом убедиться надо пролистать весь исходник и все подключенные в него хедеры...

                  P.S. На самом деле, по расстановке пробелов очень легко отличить a<x> b от a < x > b. Да и два сравнения подряд никто не юзает.
                  Ответить
                  • > Но чтобы в этом убедиться надо пролистать весь исходник и все подключенные в него хедеры...
                    или воспользоваться нормальной IDE и нажать хоткей "перейти к объявлению". С точки зрения парсера - компилятор первыми прогоняет подключенные заголовки
                    Ответить
              • Ты поехавший? IDE подсвечивает парные скобки.
                Ответить
            • А то! http://govnokod.ru/19208#comment309621
              Ответить
          • скобки как раз таки без труда парсятся. Символ List является типом, значит следующая < - открывающая скобка, засовываем её в стек скобок и бежим дальше пока не встретим пару. Всё ж просто.
            И почему вы так переживаете за компиляторы?
            Ответить
            • встречаем пару: List<a>b>
              Ответить
              • и выдаем ошибку не доходя до b.
                Ответить
                • Схуяли, может там инт параметр.
                  Ответить
                  • #include <cassert>
                    
                    const int a = 2, b = 1;
                    
                    template <int IndexBase>
                    class List {
                        int storage[3];
                    public:
                        List() { for (int i = 0; i < 3; ++i) storage[i] = i; }
                        int& operator[](int index) { return storage[index - IndexBase]; }
                    };
                    
                    int main() {
                        List<(a>b)> x;
                        List<a<b> y;
                        assert(x[1] == y[0]);
                        assert(x[2] == y[1]);
                        assert(x[3] == y[2]);
                        return 0;
                    }
                    Если убрать круглые скобки в параметре шаблона для X, то код не компиляется.

                    Т.е. List<a>b> - плохо, а List<a<b> - ок. ЛОЛ.
                    Ответить
                    • А от компилятора это поведение не зависит?
                      Ответить
                    • > то код не компиляется

                      Так перегрузи же оператор > для листа, чё как маленький.
                      Не, не так всё просто.
                      Ответить
            • > И почему вы так переживаете за компиляторы?

              Да тут всем насрать на компиляторы, мы за людей переживаем.
              Ответить
              • Time flies like an arrow, fruit flies like a banana.
                Ответить
              • за людей, которые жалуются не на то, что код тяжело читать, а на то, что его тяжело парсить...
                Ответить
                • Глазами парсить имелось в виду.

                  Но неинтуитивных моментов и помимо скобок хватает - например, когда вместо вызова конструктора получается прототип.
                  Ответить
                  • как я уже написал: для того, чтобы "парсить глазами" любой код надо хотя бы владеть синтаксисом языка.
                    Ответить
      • Толсто.
        Ответить
    • кроме того, что автор пробрасывает типы эластика наружу, особого говна не вижу.
      Ответить

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