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

    −28

    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
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    Map<String, TrainingDataLine> trainingMap;
    
        public class TrainingDataLine {
            Integer v;
            List<RelationSourceBean> r;
    
            public class RelationSourceBean {
                Integer e;
                Integer n;
    
                public Integer getE() {
                    return e;
                }
    
                public void setE(Integer e) {
                    this.e = e;
                }
    
                public Integer getN() {
                    return n;
                }
    
                public void setN(Integer n) {
                    this.n = n;
                }
            }
    
            public Integer getV() {
                return v;
            }
    
            public void setV(Integer v) {
                this.v = v;
            }
    
            public List<RelationSourceBean> getR() {
                return r;
            }
    
            public void setR(List<RelationSourceBean> r) {
                this.r = r;
            }
        }

    facepalm!

    Запостил: zaika, 15 Апреля 2016

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

    • явапроблемы
      Ответить
      • причем тут ява? тут идиотопробелмы
        Ответить
        • При том что только в Java такую хуету приходится писать.

          В пхп, например, заводишь массив и заебись.
          Ответить
    • ээ а что в жавке бывают вложенные public классы?
      Ответить
      • конечно

        даже не статик
        Ответить
        • А как создавать экземпляр? New class1.new class2?
          Ответить
          • new class1.class2?
            Ответить
          • public class External {
              public class Internal {
            
              }
            }
            //
            final External.Internal internal = new External().new Internal();


            но я тебе этого не говорил
            Ответить
            • Я как-то изъябывался это сделать но наизусть не помню. А зачем такие изъябства? Единственная причина иметь вложенные классы которая мне приходит в голову - замыкания.
              Ответить
              • замыкания уже есть в восьмерке
                Ответить
                • Но до восьмерки их не было... Что, сука, характерно, жавоебы изо всех сил утверждали, что они не нужны (3.1415 даже говорил, что вместо них есть фолдинг).
                  Ответить
                  • это сложный вопрос:)

                    лямбды это хорошо, но запутывает нить исполнения, а кложи создают неявные захваты сцылок

                    В джаве еще не так все плохо ибо GC
                    Вот в ObjC блоком можно ой налажать (см, например, strong weak dance)
                    Ответить
    • Что тут говно, что классы "матрёшкой" или этот жава-бойлерплейт с типа инкапсуляцией?
      Ответить
      • > Что тут говно
        Джава.
        Ответить
        • Въебал плюс.
          Ответить
        • Ну не надо так. Может через пару лет там проперти сделают. А потом автопроперти. А потом, глядишь и инициализацию к ним присобачат. А после этого захуячат expression body в гет-онли пропертях.
          въебал плюс
          Ответить
          • а потом кортежи введут
            а потом LinQ
            А потом вывод типов
            А потом dynamic
            а потом нул/не нул контракты прямо в язык
            а потом генерики в рантайм
            а потом получится язык, у которого ключевых слов больше чем пользователей на говнокодике
            Ответить
            • >а потом Х введут
              >а потом Y введут
              > ...
              >а потом получится язык
              С++
              Ответить
              • вообще я про с#, но с++ тоже отличнй пример
                Ответить
                • Я понял. Всё-таки кресты канонiчный пример.
                  Еще есть Scala, но там хотя бы идеи функцианальные как-никак.

                  >а потом кортежи введут
                  http://govnokod.ru/12153
                  Когда б вы знали, из какого кала, растут они не ведая стыда.
                  Ответить
                  • ну вот вернуть pair иногда нужно же)
                    в пистончике есть туплы, и это хорошо и математiчно же.
                    Правда уроды все равно используют их как рид-онли листы. Я бы вообще запретил бы итерироваться по картежам
                    Ответить
                    • Пары, тройки, да.
                      Но туплы размерностью >3 НЕ НУЖНЫ в принципе.

                      Тем более гордить вот это вот.
                      http://reflector.webtropy.com/default.aspx/4@0/4@0/untmp/DEVDIV_TFS/Dev10/Releases/RTMRel/ndp/clr/src/BCL/System/Tuple@cs/1305376/Tuple@cs
                      Ответить
                      • гетерогенную (а именно такой и должна быть тупла) можно использовать как record)

                        ну типа (вася, пупкин, валенки, 25 лет, трактарист)
                        Ответить
                        • Люди для этого ООП придумали, а тебе "туплы", "туплы"... гуэсто одним словом
                          Ответить
                          • Ну это очередной срач про бороду Оккама. Можно логически непротиворечиво орать, что ООП нинужно, потому что только плодит бесполезные абстракции.
                            Ответить
                            • а вы все еще мыслите категориями
                              очень хорошо - очень плохо?
                              Ответить
                            • ничего не нужно кроме оператора NAND
                              Ответить
                              • А если мне NOR больше нравится?
                                Ответить
                                • Значит, ты не любишь ТТЛ. Вероятно, предпочитаешь КМОП.

                                  Но почему? Ты прагматичный немец и экономишь электричество?
                                  Ответить
                          • ООП тут не причем вообще
                            ты наверное хотел сказать "придумали структуры"
                            но я как я уже писал ниже, иногда создавать класс ради одного кейса -- глупо
                            Ответить
                      • туплы не нужны в принципе. Создаешь сематнически значимый класс и радуешься
                        Ответить
                        • def get_user():
                              return (get_login(), get_name())

                          ну вот нахуй тут класс-то?
                          Ответить
                          • Чтобы не ебаться с составлением тульп из get_login(), get_name(), get_sex(), get_age()...
                            Ответить
                            • если там есть все эти поля то лучше создать класс

                              а если у меня один метод на один случай?
                              Ответить
                              • А через неделю-месяц-год будет два. Или три. Или десяток. И будешь ты ебаться с туплами до скончания веков, ага.
                                Ответить
                                • да схуя их там столько будет?
                                  преоптимизация?
                                  Ответить
                                  • Если ты пишешь скрипт на один день - не будет. А в крупном, развивающемся продукте - будет.
                                    Ответить
                            • >>тульп
                              >> get_sex()

                              охуеть, дайте два
                              Ответить
                          • А я смотрю ты любишь обмазывться несвежими тайплами и дрочить
                            Ответить
                            • а ты всегда в классы ебешься?

                              Знаешь как прикольно делать класс, особенно наприер в шестой джаве?
                              Ответить
                          • Вот нахуй такая функция?

                            берем данные, засовываем в тайпл, передаем, достаем данные из тайпла....

                            а в самом коде не проще вызвать get_login() и get_name()?
                            Ответить
                            • ты правда не понимаешь что там может быть логика выбора пользователя, например?)
                              Ответить
                              • Если эти тайплы не хранятся - то это упаковка ради упаковки. Если хранятся - то это, блеать, должны быть объекты семантически значимой структуры
                                Тайпл - это костыль в хуевой архитектуре
                                Ответить
                                • они не хранятся, но они могут передаваться дальше

                                  Смотри: допустим у меня есть три приватных функции, и я между ними должен передавать какую-то свою структуру данных. Вот она мне только вот тут нужна, и больше нигде.
                                  Это не часть API и у нее нет своего поведения и она может вообще выглядеть глупо и не иметь даже внятного имени.
                                  Зачем тут класс?

                                  Кроме того иногда правда треба вернуть 2 значения. Я конечно понимаю что в языках, содержащих в названии букву C для этого можно спровайдить указатель или ссылку, но во-первых в жабе так нельзя, во-вторых передавать их дальше все равно сложно.

                                  А кроме того: тупла в ЯП со стат. типизацией сосет ибо проебывается типизация, а например в пистончике не сосет ибо типизации статической и так нет.

                                  Но я согласен с тем, что кортежи длиной в 20 символов бесят, а кроме того это не замена же классам.
                                  Ответить
                                  • >> они не хранятся, но они могут передаваться дальше

                                    Хуевая архитектура

                                    >> Смотри: допустим у меня есть три приватных функции, и я между ними должен передавать какую-то свою структуру данных. Вот она мне только вот тут нужна, и больше нигде.

                                    Почему не сделать это через побочные эффекты?

                                    Приведи адекватный пример, на словах ниче не понятно
                                    Ответить
                                    • >>Хуевая архитектура
                                      Хуевая если это экспортируется в public api, а внутри модуля нормально.

                                      >>Почему не сделать это через побочные эффекты?
                                      какие эффекты, если это обычная функция и питон, например?

                                      >>Приведи
                                      def get_best_users(num):
                                          """
                                           ищем n пользователей с лучшими очками
                                          :returns [(user, score), (user, score), ...]
                                          """
                                         # тут что-то делаем
                                         return result
                                       
                                      def send_email_to_winners(users):
                                           """
                                           Отправляет письмо всем победителям у кого очков больше чем указано в настройках
                                           """
                                          for user, score in users:
                                              if score > FOO:
                                                      send_mail(user)
                                       
                                      def pretty_print(user, score):
                                          print("{0} got {1}".format(user, score))
                                       
                                      #########
                                      best_users =  get_best_users(42)
                                      send_email_to_winners(best_users)
                                      for user, score in best_users:
                                              pretty_print(user, score)


                                      ну вот что тут делать? класс ``UserWithScore`` с двумя полями? класс ``CompetitionParticipantInfo``?

                                      Мне кажется что это дискуссия из серии нужно-ли всегда делать максимально круто, или нет

                                      Например нужно-ли всегда иметь Service Layer, ORM, MVC итд
                                      Ответить
                                      • прежде чем пизтонисты доебуца:

                                        я знаю что send_email_to_winners можно сократить через filter или list comprehision

                                        я для наглядности, вдруг кегги пистона не знает
                                        Ответить
                                      • >> Хуевая если это экспортируется в public api, а внутри модуля нормально.

                                        Видимо для тебя и в жопу ебаться нормально, главное что бы никто не видел

                                        Ладно, не суть

                                        Ну, питон на то и питон. Он и прочие скриптовые языки поощряют кортежи сахарком, угу, говноязыки поощряют говнопарадигмы

                                        Но почему не создать класс, который содержит в себе имя, очки, toString и т.д?

                                        А потом функции, работающие с конкретным типом данных, и объединенные конкретной логикой размазаны по галактике
                                        Ответить
                                        • чото у тебя про жопу много всего
                                          весна чтоли?

                                          Я действительно считаю что публичный API в тысячу раз важнее кишок модуля

                                          >>Но почему не создать класс, который содержит в себе имя, очки, toString и т.д?

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

                                                  если в тупле 2 члена, и все ее использование ограничено одним модулем то проблем с чтением не возникает

                                                  а вот проблемы с пониманием класса с невнятным именем точно будут)
                                                  Ответить
                                              • Документацию, блядь, ещё написать надо!
                                                А потом ещё следить за тем, чтобы она соответствовала реальному коду! После каждого изменения, КАРЛ! Ну и нахуя такая еботня, если можно делать код самодокументированным?
                                                Ответить
                                                • описанный мною пример невозможно сделать самодокументированым

                                                  будет либо класс с невнятным именем, либо тупла
                                                  тупла проще

                                                  читать доку придется и так и так
                                                  публичные API, кстати, надо документировать

                                                  нормальные API тем и отличаются от говна, что у них есть мануал
                                                  Ответить
                                                  • > описанный мною пример невозможно сделать самодокументированым

                                                    Невозможно сделать самодокументированным, если ты хуёвый программер. Это обычная инженерная задача - написать код так, чтобы документация на банальные конструкции (не бизнес-логику) была не нужна.

                                                    > будет либо класс с невнятным именем, либо тупла

                                                    private IEnumerable<UserScore>GetTopUser(int threshold) {...}
                                                    IEnumerable<Tuple<int, User>>GetTopUser(int threshold) {...}

                                                    Что понятнее? Мне лично за вторую конструкцию хочется убить. И потом уже закопать, когда из тульпы item1 & item2 извлекаются.
                                                    Ответить
                                                    • видимо ты тоже хуевый программер (ктобы сомневался!) потому что класс UserScore в данной ситуцации ни разу не самодокументированный, и понять его сложно, кроме лишнего семантического мусора он ничего не несет


                                                      из его названия следует что он представляет очки пользователя, а не пользователя и его очки

                                                      чтобы это понять, мне придется пойти и посмотреть на сырцы класса, где меня встретят много ненужных букв

                                                      а в случае джавы так еще и геттер и конструктор
                                                      (и еще .class файл, бугага)

                                                      А вот IEnumerable<Tuple<User,int>>GetTopUserAn dScore() выглядит достаточно годно

                                                      Если в тупле будет хотя бы 3 поля или если это будет публичное API, то тогда я конечно сделаю класс
                                                      Ответить
                                                      • > класс UserScore в данной ситуцации ни разу не самодокументированный, и понять его сложно
                                                        class UserScore
                                                        {
                                                            private int userId;
                                                            public int Score;
                                                            public User User { get { return Users.GetUser(userId); } }
                                                        }

                                                        Ну да, оооочень сложно. Без бутылки не разберёшься.
                                                        Это в идеальном случае, когда внутри тела метода три точки, нужно только передать параметры и принять их. Если про реальный код говорить, то тут может быть айди вместо юзера (как у меня в коде), нужно будет эти данные собрать, сложить, отсортировать. Вот в класс я возьму и воткну компаратор по Score. А потом Equals по userId, хэшкод туда же. Куда ты это всё засунешь в тапл? В очко ей?

                                                        > из его названия следует что он представляет очки пользователя, а не пользователя и его очки
                                                        "Мартышка и очки", бгггг! Ну всё правильно, в первую очередь очки интересуют, у нас же топ.
                                                        Ответить
                                                      • > чтобы это понять, мне придется пойти и посмотреть на сырцы класса, где меня встретят много ненужных букв

                                                        Кстати, я советую код писать в IDE, а не блокноте.
                                                        Ответить
                                                    • и знаешь что смешно? в C# 7 есть туплы, и часть API будет на них, и ты будешь юзать их как миленький, и через пару лет сам будет вещать тут об их преимуществах

                                                      потому что у тебя bulb paradox
                                                      Ответить
                                                      • > в C# 7 есть туплы
                                                        Шобля?
                                                        Они уже тыщу лет в шарпе. И пара лет уж точно прошло, как я за "передовыми" мартышками переделывал говно вроде такого: http://govnokod.ru/19815

                                                        > и через пару лет сам будет вещать тут об их преимуществах

                                                        Да щаз.
                                                        Это я сначала был рад такому нововведению. Теперь, по прошествию пары лет, я это закопать хочу там, откуда это выползло.

                                                        > потому что у тебя bulb paradox
                                                        Парадокс Блаба, же, а не лампы, идиота кусок. Хоть проверяй, чем подъебать собрался.
                                                        Ответить
                                                      • прочитал про СИдьмой Си шарп

                                                        Person inigo = new Person("Inigo Montoya", 42);
                                                        Person humperdink = inigo with { Name = "Prince Humperdink" };


                                                        (string first, string last) = GetNames("Inigo Montoya")


                                                        Макрософт, вы там охуели? Ну, всмысле, больше обычного
                                                        Ответить
                                                        • Сначала они ввели dynamic. Я не обратил внимания. Потом они сделали string interpolation. Потом dictionary initialization. А теперь обещают вот это. Неужели надо было в хороший изначально язык добавлять всякую похапщину?
                                                          Ответить
                                                          • Хз, я как то ничем из этого не пользуюсь
                                                            Ответить
                                                        • У них же есть Haskell F#. Впрочем, хорошо, когда в язык стягивается много фич. Можно выбрать лучшие из них для своей конкретной задачи. И с лучшим пониманием архитектуры не переписывать в ужасе всё напитон, а просто постепенно изменять функции.

                                                          А с таким критическим отношением можно на брейнфаке писать. И если 99% программистов не умеют писать программы, то не надо пенять на C++ и php и стараться ограничивать язык до пары фраз, чтоб уж точно не ошибиться, надо программировать учиться и других учить.
                                                          Ответить
                                                          • Проблема гибкого инструмента в том, что два разных программиста могут вообще друг друга не понять. Есть миллион способов писать на крестах и бородатые одмины херачат друг друга палками, доказывая свою правду. Оно нинужно.

                                                            В шарпе нахуй не нужны элементы скриптового языка. Если майкрософт хочет скриптовый язык - пусть делает новый скриптовый язык с ноля, а не шарп уродует ИМХО
                                                            Ответить
                                                            • Нда, тонкий вопрос. С другой стороны, один из программистов может пойти напитон, тогда другой его не поймёт и программу ни запустить, ни использовать как основу для себя не сможет. А так - просто скопипастил себе питонокод, а он и работает.
                                                              Или создаст себе метаинструменты, которые кроме него никто не понимает. (Пример метаинструмента - операция умножения в Brainfuck)

                                                              А бородатые админы пусть продолжают страдать. Не поняли, что 4 языка в одном - преимущество - значит пусть используют только царские массивы. Массивов хватит всем.
                                                              Ответить
                                                              • >> Не поняли, что 4 языка в одном - преимущество

                                                                сомнительное преимущество.

                                                                Такой язык превращается в раскрытый швейцарский нож - вроде все есть, а пользоваться неудобно

                                                                "Пусть функция делают одну вещь, но делает ее хорошо"
                                                                Ответить
                                                                • У нас и задачи как такой нож (ну или как масло с торчащей пробкой, в которую завинчена гайка, к которой привязана нитка - как раз требуются нож, штопор, отвёртка и ножницы). Там критичный царский код для асимметричной криптографии, здесь красивый функциональный рекурсивный код для пробегания по небольшому дереву версий, неподалёку - типы и опереции над ними - выделенная логика на ООП, рядом - платформозависимый код с макросами и условной компиляцией.

                                                                  А потом народ тихо пилит всякие синглтоны и статические функции. ООП, да не ООП. Процедурный подход, но крашеный.
                                                                  И ещё то, на что пирфоманса не хватило, переписывают на другом языке. Потом важные куски по сшиванию этих модулей суют как метакод во всякие мэйкфайлы и проую питушню, нужно устанавливать сразу компилятор сишки, питон и .NET фреймворк нужной версии.
                                                                  Ответить
                                                • Самодокументация вместо какого-то непонятного (name, score):
                                                  class Tuple_133_of_username_and_score_for_send_email_to_winners {
                                                  public:
                                                    String_type_for_usernames username_string;
                                                    Integer_number_type_unsigned_positive_for_scores score_int;
                                                  
                                                    // TODO: constructor
                                                    // TODO: copy constructor
                                                    // TODO: move constructor
                                                    // TODO: restructor
                                                    // TODO: destructor
                                                    // TODO: instructor
                                                  
                                                    String_type_for_usernames getUsernameAsString() {
                                                      return (String_type_for_usernames) username_string;
                                                    }
                                                  
                                                    void setUsernameFromStringToVoid(String_type_for_usernames username_string_local_argument) {
                                                      username_string = username_string_local_argument;
                                                    }
                                                  
                                                    // TODO: score getter
                                                    // TODO: score setter
                                                    // TODO: smart validation
                                                  
                                                    // TODO: а ещё
                                                    //             мне
                                                  
                                                    //                    платят
                                                  
                                                    //                              за
                                                  
                                                    //                                   строчки
                                                  };
                                                  Ответить
                                                  • Вообще же, такой класс из пары полей всё равно будет неполноценным. И если что-то добавится, его всё равно скорее всего придётся переписать заново, поскольку окажется, что архитектура совсем не та, что была нужна. Так что уж лучше кортежик, а если реально он дорастёт до класса - туда ему и дорога.
                                                    Ответить
                                                  • кстати в ваших JSах все проше.
                                                    Вместо туплы можно сделать hash:
                                                    {user:"pup", score:22}


                                                    а потом сказать "да это же объект! ооп!" и ведь это будет правдой!!
                                                    Ответить
                                                    • Хе-хе, добавить потом пару методов на лету, да.
                                                      Ответить
                        • И создаешь его опять, и опять радуешься, и опять создаешь, и опять расуешься. Вот поэтому Го, например, такой позитивный язык.
                          Ответить
                  • Кресты хуёвый пример. Нихуя не каноничный. Кресты до сих пор самый нечитаемый язык из используемых, и самый лучший для выстрела в ногу.
                    Ответить
                    • Кресты это именно что каноничный пример того, что в ЯП напихали все чего только можно и нельзя:)

                      Плюсы всяко не хуже перла в плане читаемости, и при всей их мерзости, однако, это редкий ЯП где есть с одной стороны прямой доступ к памяти, а с другой ООП и шаблоны, и в это его сила
                      Ответить
            • Кортежи не нужны. Лучше возврат нескольких именованных переменных из метода. Линк заебись, но вместе с expression tree. Вывод типов тоже заебись, давно var в жаве не хватает. Dynamic не нужен.Контракты notnull/nullable тоже нужны, но их нет даже в чистом шарпике (между нами, девочками, нулл тоже не нужен, только тсссс... шопотом).
              Ответить
              • параметры передавать дальше неудобно

                кортеж это легкая альтернатива классам для создания записи. Но если в ЯП есть способ сделать класс в три строки (как в котлине например, да и в C# это просто) и не компилиться в отдельный .class файл (привет, jvm) то конечно туплы нужны почти никогда

                dynamic нужен для скриптовых языков в clr;) А в шарпике он нужен для очень волшебной магии тоесть практически никогда в обычном коде

                null/notnull лучше разделить на уровне типов(как в приснопамятном котлине) ну или сделать паттерн матчинг
                Ответить

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