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

    +95

    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
    // same as Callable but without exception
    public interface  Executable<T>
    {
     	public T call();
    }
    /*В другом классе: методы для конверсии туда-сюда */
    	public Callable<T> toCallable(final Executable<T> ex){
     		return new Callable<T>(){
    			public T call() throws Exception{
    				return ex.call();
    			}
    		};
    	}
    	public Executable<T> toExecutable(final Callable<T> c)
     	{
     		return new Executable<T>(){
    			public T call(){
    		 		try{
    					return c.call();
    				}catch (Exception e){
    					throw new RuntimeException(e);
    				}
    			}
    		};
    	}

    Запостил: 3.14159265, 11 Июня 2012

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

    • catch (Exception e) {
          throw new RuntimeException(e);
      }

      Зачем???
      Ответить
      • A method is not required to declare in its throws clause any subclasses of RuntimeException that might be thrown during the execution of the method but not caught.

        Завернули в RuntimeException, чтобы throws Exception не писать?
        Ответить
        • Так точно. Но более опытные граждане пишут так:
          throw (e instanceof RuntimeException) 
          			? (RuntimeException) e 
          			: new RuntimeException(e);
          Ответить
      • Вы даже не представляете сколько кода было написано джавистами за многие годы, для борьбы с checked exceptions.
        Ответить
        • > для борьбы с checked exceptions.
          Чтобы выстрелить себе в ногу...
          Ответить
          • как показала практика, от checked exceptions больше вреда, чем пользы.
            да, они показываются в сигнатуре, и их обработка обязательна.

            но действие рождает противодействие - они тупо оборачиваются в catch(Exception e){e.printStackTace();} или, в лучшем случае, catch(Exception e){throw new RuntimeException(e);}. Наиболее сознательные пишут catch(Exception e){logger.log(e);}

            но во всех трех случаях происходит совершенно не то, что изначально задумывалось, а именно - борьба, но никак не обработка по каждому исключению. т.е. "правильно" было бы так:
            catch(FirstException e) {
            //действия, специфичные для FirstException
            }
            catch(SecondException e) {
            //действия, специфичные для SecondException
            }
            но, как несложно заметить, код распухает и становится нечитаемым.

            лучше бы все исключения были непроверяемыми - достаточно было бы javadoc документации по ним.


            з.ы. на закуску оставлю пост одного неглупого человека, исполненный ненависти к проверяемым исключениям:
            http://tapestryjava.blogspot.com/2011/05/tragedy-of-checked-exceptions.html


            з.з.ы. ну и чтобы исчерпать дискуссию (либо поднять древний холивар), есть еще одна достойная альтернатива исключениям:
            http://en.wikipedia.org/wiki/Pattern_matching
            Ответить
            • > лучше бы все исключения были непроверяемыми
              В с++ так и поступили и, видимо, поступили правильно.

              > Pattern_matching
              Вы имеете в виду что-то типа хаскелевских Maybe a и Either error result? Ну да, удобная вещь, особенно в сочетании с соотв. монадой. Или есть еще какое-то применение pattern matching'а для обработки исключений?
              Ответить
              • все верно
                Ответить
              • You have a problem and decide to use Java.
                Now you have a ProblemFactory.

                На jav'е не пишу, но наблюдая код человека, который на ней писал - складывается впечатление, что утверждение верно :)
                Ответить
                • я пишу на джаве, страшно подумать, 10 лет.
                  так вот, что я могу сказать: вырабатывается стойкая "привязанность" к языку, т.е. на другом языке начинаешь писать код в том же стиле. после джавы, например ФП, кажется очень противоестественным.

                  насчет паттернов: да, они там есть, и очень часто язык, а особенно фреймворки, заставляют ими пользоваться. и тут два пути:
                  если ты осилил паттерны - ты умело ими пользуешься и они тебе помогают
                  если ты пишешь вроде бы паттерны, но неправильные или не в нужном месте, они начинают жутко мешать.
                  впрочем, достаточно освоить несколько и их комбинировать. тут уже, подобно разговорному языку, надо чувствовать джаву - где какое решение будет лучшим, а где лучше не стоит в данной ситуации
                  и факторов много:
                  - фреймворк
                  - необходимость такой функциональности (ограничение снизу)
                  - достаточность функциональности (ограничение сверху) т.е. будет ли востребована, или только мешать?
                  - производительность
                  - скорость реализации
                  Ответить
                  • У нас в проекте используется PureMVC фреймворк, портированный с java на obj-c, допиленный разработчиком, пришедшим с android, под реальности iOS, и помешанном на паттернах. Выглядит противоестественно и велосипедисто, надо сказать. И кучи вручную написанного копипастом служебного кода.
                    По крайней мере в моих глазах, бывшего C#-разработчика.
                    Ответить
                    • не слышал такой.
                      у нас в проекте используются Spring+Stripes, JPA\Hibernate.
                      Stripes - ну ничего такой, хотя и местами хлопотный.

                      все равно лучше Tapestry 5 я ничего не видел.
                      Ответить
                  • вот ведь святая наивность!
                    паттерны существуют для того, чтобы сократить время на обучение мартышек
                    Ответить
                    • Вы так говорите, как будто сокращение времени обучения мартышек - это что-то плохое.
                      Ответить
                      • Вы так говорите, как будто количество перерастает в качество ;-)
                        Ответить
                        • Ну так многие и действуют по принципу:
                          "Хоть говно, зато полный рот."
                          Ответить
                          • Последнее прямо таки характеризует нынешнуюю ситуацию с Microsoft Visual C#.

                            Проблема в том, что мартышка, познавшая паттерны уже не хочет стричь газоны и класть асфальт, а начинает считать себя программистом.
                            Ответить
                            • Да. В этом что-то есть. А c# принял эстафету у Делфи.
                              Ответить
                              • Таки в большей мере у VB, но тенденция та же самая у всех трёх.
                                Ответить
                                • Вы обое-трое правы.

                                  >А c# принял эстафету у Делфи.
                                  Папашка ж в мелкософт ушел.
                                  >Таки в большей мере у VB
                                  А команда у MS осталась VB-шная.

                                  А тут еще и Сан забрала лицензию на жабу.
                                  Ну не увольнять же их?!
                                  Ответить
                        • Вы так говорите, как-будто мартышка знающая паттерны хуже мартышки их не знающей :)
                          Ответить
                    • мартышка и очки паттерны
                      оксюморон
                      Ответить
                      • Мартышка к старости слаба мозгами стала;
                        А у людей она слыхала,
                        Что можно с кодом много не тупить:
                        Лишь стоит паттерны вкурить.
                        И их с полдюжины себе она достала;
                        Вертит кусками кода так и сяк:
                        То к классу их прижмет, то их на list нанижет,
                        То их понюхает, то их полижет;
                        Но паттерны не действуют никак.
                        'Тьфу пропасть!' говорит она: 'и тот дурак,
                        Кто слушает людских всех врак:
                        Про паттерны мне лишь налгали;
                        А проку на́-волос нет в них'.
                        Мартышка тут с досады и с печали
                        Шифт-делом так хватила их,
                        Что только брызги засверкали.
                        ----
                        К несчастью, то ж бывает у людей:
                        Как ни полезна вещь,- цены не зная ей,
                        Невежда про нее свой толк всё к худу клонит;
                        А ежели невежда познатней,
                        Так он ее еще и гонит.
                        Ответить
                  • 10 лет? эт вы еще с 1.4 начинали если не с 1.3? Сколько же вам лет? =)
                    Ответить
                    • да, я помню, когда начал изучать джаву, была версия 1.3, и только я достаточно освоился, Сан испек версию 1.4. помнится, кроме прочих инноваций, там была добавлена поддержка html во все компоненты и даже подобие html-редактора. я еще помню, как некий чел под ником Бенедикт, сделал html-чат на jsp "Авалон", ныне почивший, но waybackmachine может еще помнить avalon.departament.com
                      я даже помню свой "хелловорлд", это был апплет, анимированная плазма 256х256 (на синусо-косинусах). не помню, где он описывался, но по картинке вот нашел вроде бы тот: http://phpbb3.ru/?p=1950
                      книга, по которой я изучал (чуть позже) джаву, была "JAVA 2. В подлиннике. Наиболее полное руководство", авторы П. Ноутон, Г.Шилдт (да, я нашел, как она называлась!). до сих пор ярко помню эти апплеты, billboard.java и scrabblet.java, где Ноутон хвастался, как впечатлил публику, сделав эти апплеты (наплевав на ООП в общем и инкапсуляцию в частности) мгновенно загружавшимися, без мерцаний серого квадрата.

                      вот такие воспоминания о моих первых шагах на джаве...
                      Ответить
                      • а как же Философия Java Эккеля?
                        Ответить
                      • Хммм... А существует ли язык, о котором Шилдт не написал книгу?
                        Ответить
                      • Люр, вот скоко ты уже на гкоде, а не знаешь, что [u] нужно вносить в [color], а не наоборот.
                        Хотя это конечно лучше, чем [code], которые мой букмарклет не хавает.
                        Ответить
                        • а я и не замечал, что ассоциативность в этом кольце недействительна.
                          Ответить
                    • о, я еще не ответил,
                      > Сколько же вам лет? =)
                      я родился в декабре 1984, т.е. на момент этого комментария мне 27
                      правда, выгляжу намного моложе, даже пиво и сигареты без предъявления водительских прав (там личный код с датой рождения) не дают. = (
                      Ответить
                      • )))))))))))))))))))))))))))))))

                        Если честно, то по вашим комментам складывается впечатление, что вы года на 4 моложе
                        Ответить
                        • всего-то? :-)
                          Ответить
                        • поясню свою мысль, а то что-то минусовать начали =)

                          все что я имел ввиду: вы просто иногда высказываете суждения в резкой, безапеляционной форме, часто с небольшим налетом фамильярности, что обычно свойственно для людей более молодого возраста. Людей, которые "кодят" 2-3 года, но уже считают, что все на свете знают и видят мир таким, какой он есть на самом деле.

                          Т. о. моя фраза отражала мое восприятие товарища Lure Of Chaos и ни в коей мере не была попыткой дать какую-либо характеристику.

                          Как говорится: ничего личного =)
                          Ответить
                          • думается, минусуют ещё и за смайлофажество
                            Ответить
                            • Это не смайлофажество. Это конец длинной функции на лиспе :P
                              Ответить
                              • такие длинные функции на лиспе пишет только @wvxvw, @tir вряд ли этим занимается
                                Ответить
                                • Кстати, а откуда пошла традиция писать @ перед ником?
                                  Ответить
                                  • Энто всё со свиттера.
                                    Как и #Goomno кстати.
                                    Ответить
                                    • А. Б-гомерзский свистер. А я думал - старый добрый IRC :)
                                      Ответить
                                      • Насколько я знаю, это действительно из IRC. Например значение решётки как хеш-тега пошло от тематических каналов.
                                        Ответить
                                        • Рассмотрите свою гипотезу на предмет внутренних проиворечий и увидите, что ухо не вписывается.
                                          Ответить
                                          • > Рассмотрите свою гипотезу на предмет внутренних проиворечий
                                            @ - права оператора в IRC :)

                                            P.S. Или вы не мне? Из-за линеаризации не видно кому адресован коммент.
                                            Ответить
                            • думаю поставить дофига смайлов знак того, что ща будет произнесена такая вещь, к которой нельзя относиться серьезно
                              Ответить
                          • > вы просто иногда высказываете суждения в резкой, безапеляционной форме, часто с небольшим налетом фамильярности
                            во-первых: если осторожничать, то вас сочтут неуверенным в себе, а, следовательно, неправым. безапелляционная форма, с одной стороны, дает шанс мнению быть услышанным, а с другой - оспоренным.
                            во-вторых: после каждой моей фразы нужно мысленно ставить "имхо" - поставленное явно, оно сразу натирает глаза. имхо.

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

                            > все на свете знают и видят мир таким, какой он есть на самом деле.
                            в силу моего стойкого убеждения, что истина не является единой и абсолютной величиной, я позволяю себе считать мое мнение истинным относительно меня, и выражать его, как абсолютную истину - что совершенно не делает его истинным в системе отсчета любой другой личности.
                            все равно, я вам при всем моем желании ничего не докажу, и вы меня точно так же не переубедите. можете попробовать наращивать свой авторитет в моих глазах, и тогда я, быть может, в чем-то соглашусь с вами.
                            однако, поскольку я в ближайшие ~100 лет живу на Земле, то Солнце вращается вокруг Земли.

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

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

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

                              Дискуссия - это хорошо, это правильно, но только пока она не превращается в навязывание своей точки зрения.
                              Ответить
                              • Безапелляционная форма зачастую заставляет оппонента спора задуматься и, к примеру, почитать документацию. В результате могут появиться новые интересные факты или наблюдения.

                                Но согласен, использовать ее нужно не всегда и не везде.
                                Ответить
                                • использовать %s нужно не всегда и не везде
                                  Ответить
              • В до-диезе учли печальный опыт жабы и отказались.
                >Now you have a ProblemFactory.
                Лол, надо им написать предупреждение: длительное использование может вызывать паттернизм головного мозга.
                Ответить
                • а чаще - антипаттернизм
                  Ответить
                  • Апаттернизм
                    Ответить
                    • нет, именно анти.
                      апаттернизм, если я правильно понимаю, это полное отсутствие паттернов, их избегание
                      а анти - это повсеместное применение антипаттернов
                      Ответить
                      • Имхо, апатернизм - скорее не их (специальное) избегание, а забивание на них (если и попался паттерн, то чисто случайно).
                        Ответить
            • По игнорируемым экспешнам могли бы просто давать ворнинг. Полный отказ компиляции -- тупейший дизайн в истории проектирования языков.
              Ответить
    • Я так понял, это костыль для классов с одинаковым именем метода, не являющихся наследниками друг друга и частями одной иерархии? Да, для этого интерфейсы придумали.
      Ответить
      • В этом случае мы имеем возможность наблюдать экстрагированные жавопроблемы и их типичное жаворешение.
        Чтобы избежать checked exceptions сделан новый интерфейс - суть, константная-функция.

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

        Насколько я понял достаточно было отнаследовать стандартный интерфейс:
        public interface  Executable<T> extends Callable<T>
        {
         	public T call();
        }

        И никакий конверсии не надо (по крайней мере toCallable, точно).
        Ответить
        • Если мне не изменяет память, вся муть с исключениями -- чисто придурь Java как языка, сама виртуальная машина "проверяемые" исключения не верифицирует, поэтому такой код успешно работает.
          Ответить
          • Да. Всё верно.
            Более того, есть спец. хак - можно выбросить checked исключение, там где его совсем не ждали.
            >такой код успешно работает.
            потому что RuntimeException наследник Exception.
            Потому T call(); эквивалентно T call() throws RuntimeException;
            Ответить
            • >потому что RuntimeException наследник Exception.
              А, ну теперь понятно, почему иерархия исключений в Java такая запутанная. Пытались семантику языка Java скрестить с семантикой виртуальной машины. Получился выкидыш.
              Ответить
              • Да. Срань.
                Зато смотрите как я умею:
                public static void throwe(Throwable e) 
                        {
                                Main.<RuntimeException>trickyThrow(e);
                    }
                       @SuppressWarnings("unchecked")
                        public  static <T extends Throwable> void    trickyThrow(Throwable e) throws  T 
                        {
                        throw (T) e;
                    }

                http://ideone.com/8tgP8
                Ответить
          • Директивы throws живут в class-файлах, но никому, кроме javac, они не нужны. Всё прекрасно работает без checked exceptions. JVM вообще пофигу, checked или unchecked исключения бросаются.
            Ответить
      • Чтобы было понятней, вот код стандартного библиотечного Callable
        package java.util.concurrent;
        
        public interface Callable<V> {
            /**
             * Computes a result, or throws an exception if unable to do so.
             *
             * @return computed result
             * @throws Exception if unable to compute a result
             */
            V call() throws Exception;
        }

        Ищите отличия!
        Ответить
    • показать все, что скрытоЯ вас всех посылаю на хуй.
      Ответить
    • ШОК! Каменты, свалявшиеся в бессмысленую кучу побеждены!

      > это действительно из IRC.
      Рассмотрите свою гипотезу на предмет внутренних проиворечий и увидите, что ухо не вписывается.
      Ответить

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