Jawa / Говнокод #10918 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 3.14159265, (Updated )

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

    • 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#.

                          Проблема в том, что мартышка, познавшая паттерны уже не хочет стричь газоны и класть асфальт, а начинает считать себя программистом.
                          Ответить
                            • Таки в большей мере у 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, где Ноутон хвастался, как впечатлил публику, сделав эти апплеты (наплевав на ООП в общем и инкапсуляцию в частности) мгновенно загружавшимися, без мерцаний серого квадрата.

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

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

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

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

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

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

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

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

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

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

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

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

                              Но согласен, использовать ее нужно не всегда и не везде.
                              Ответить
            • В до-диезе учли печальный опыт жабы и отказались.
              >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 скрестить с семантикой виртуальной машины. Получился выкидыш.
            Ответить
        • Директивы 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.
    Рассмотрите свою гипотезу на предмет внутренних проиворечий и увидите, что ухо не вписывается.
    Ответить

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

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8