- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 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);
}
}
};
}
Зачем???
Завернули в RuntimeException, чтобы throws Exception не писать?
Чтобы выстрелить себе в ногу...
да, они показываются в сигнатуре, и их обработка обязательна.
но действие рождает противодействие - они тупо оборачиваются в 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 документации по ним.
з.ы. на закуску оставлю пост одного неглупого человека, исполненный ненависти к проверяемым исключениям:
з.з.ы. ну и чтобы исчерпать дискуссию (либо поднять древний холивар), есть еще одна достойная альтернатива исключениям:
В с++ так и поступили и, видимо, поступили правильно.
> Pattern_matching
Вы имеете в виду что-то типа хаскелевских Maybe a и Either error result? Ну да, удобная вещь, особенно в сочетании с соотв. монадой. Или есть еще какое-то применение pattern matching'а для обработки исключений?
Now you have a ProblemFactory.
На jav'е не пишу, но наблюдая код человека, который на ней писал - складывается впечатление, что утверждение верно :)
так вот, что я могу сказать: вырабатывается стойкая "привязанность" к языку, т.е. на другом языке начинаешь писать код в том же стиле. после джавы, например ФП, кажется очень противоестественным.
насчет паттернов: да, они там есть, и очень часто язык, а особенно фреймворки, заставляют ими пользоваться. и тут два пути:
если ты осилил паттерны - ты умело ими пользуешься и они тебе помогают
если ты пишешь вроде бы паттерны, но неправильные или не в нужном месте, они начинают жутко мешать.
впрочем, достаточно освоить несколько и их комбинировать. тут уже, подобно разговорному языку, надо чувствовать джаву - где какое решение будет лучшим, а где лучше не стоит в данной ситуации
и факторов много:
- фреймворк
- необходимость такой функциональности (ограничение снизу)
- достаточность функциональности (ограничение сверху) т.е. будет ли востребована, или только мешать?
- производительность
- скорость реализации
По крайней мере в моих глазах, бывшего C#-разработчика.
у нас в проекте используются Spring+Stripes, JPA\Hibernate.
Stripes - ну ничего такой, хотя и местами хлопотный.
все равно лучше Tapestry 5 я ничего не видел.
паттерны существуют для того, чтобы сократить время на обучение мартышек
"Хоть говно, зато полный рот."
Проблема в том, что мартышка, познавшая паттерны уже не хочет стричь газоны и класть асфальт, а начинает считать себя программистом.
>А c# принял эстафету у Делфи.
Папашка ж в мелкософт ушел.
>Таки в большей мере у VB
А команда у MS осталась VB-шная.
А тут еще и Сан забрала лицензию на жабу.
Ну не увольнять же их?!
оксюморон
А у людей она слыхала,
Что можно с кодом много не тупить:
Лишь стоит паттерны вкурить.
И их с полдюжины себе она достала;
Вертит кусками кода так и сяк:
То к классу их прижмет, то их на list нанижет,
То их понюхает, то их полижет;
Но паттерны не действуют никак.
'Тьфу пропасть!' говорит она: 'и тот дурак,
Кто слушает людских всех врак:
Про паттерны мне лишь налгали;
А проку на́-волос нет в них'.
Мартышка тут с досады и с печали
Шифт-делом так хватила их,
Что только брызги засверкали.
----
К несчастью, то ж бывает у людей:
Как ни полезна вещь,- цены не зная ей,
Невежда про нее свой толк всё к худу клонит;
А ежели невежда познатней,
Так он ее еще и гонит.
я даже помню свой "хелловорлд", это был апплет, анимированная плазма 256х256 (на синусо-косинусах). не помню, где он описывался, но по картинке вот нашел вроде бы тот: http://phpbb3.ru/?p=1950
книга, по которой я изучал (чуть позже) джаву, была "JAVA 2. В подлиннике. Наиболее полное руководство", авторы П. Ноутон, Г.Шилдт (да, я нашел, как она называлась!). до сих пор ярко помню эти апплеты, billboard.java и scrabblet.java, где Ноутон хвастался, как впечатлил публику, сделав эти апплеты (наплевав на ООП в общем и инкапсуляцию в частности) мгновенно загружавшимися, без мерцаний серого квадрата.
вот такие воспоминания о моих первых шагах на джаве...
Хотя это конечно лучше, чем [code], которые мой букмарклет не хавает.
> Сколько же вам лет? =)
я родился в декабре 1984, т.е. на момент этого комментария мне 27
правда, выгляжу намного моложе, даже пиво и сигареты без предъявления водительских прав (там личный код с датой рождения) не дают. = (
Если честно, то по вашим комментам складывается впечатление, что вы года на 4 моложе
все что я имел ввиду: вы просто иногда высказываете суждения в резкой, безапеляционной форме, часто с небольшим налетом фамильярности, что обычно свойственно для людей более молодого возраста. Людей, которые "кодят" 2-3 года, но уже считают, что все на свете знают и видят мир таким, какой он есть на самом деле.
Т. о. моя фраза отражала мое восприятие товарища Lure Of Chaos и ни в коей мере не была попыткой дать какую-либо характеристику.
Как говорится: ничего личного =)
Как и #Goomno кстати.
@ - права оператора в IRC :)
P.S. Или вы не мне? Из-за линеаризации не видно кому адресован коммент.
во-первых: если осторожничать, то вас сочтут неуверенным в себе, а, следовательно, неправым. безапелляционная форма, с одной стороны, дает шанс мнению быть услышанным, а с другой - оспоренным.
во-вторых: после каждой моей фразы нужно мысленно ставить "имхо" - поставленное явно, оно сразу натирает глаза. имхо.
> фамильярности
просто воспринимайте это как юмор и доброжелательность. в силу некоторых обстоятельств (кроме того, что я затрудняюсь с контролем своего стиля общения) я вполне считаю это допустимым для себя.
> все на свете знают и видят мир таким, какой он есть на самом деле.
в силу моего стойкого убеждения, что истина не является единой и абсолютной величиной, я позволяю себе считать мое мнение истинным относительно меня, и выражать его, как абсолютную истину - что совершенно не делает его истинным в системе отсчета любой другой личности.
все равно, я вам при всем моем желании ничего не докажу, и вы меня точно так же не переубедите. можете попробовать наращивать свой авторитет в моих глазах, и тогда я, быть может, в чем-то соглашусь с вами.
однако, поскольку я в ближайшие ~100 лет живу на Земле, то Солнце вращается вокруг Земли.
> не была попыткой дать какую-либо характеристику
не трудитесь, ваше мнение столь же субъективно, что вы можете даже прямо оскорблять меня, и это ничуть меня не заденет. в моей вселенной я резко и безапелляционно лучший.
спасибо за внимание.
я никогда никому ничего не доказываю, я всего лишь иногда предлагаю посмотреть на вещи с другой стороны, не более того.
Дискуссия - это хорошо, это правильно, но только пока она не превращается в навязывание своей точки зрения.
Но согласен, использовать ее нужно не всегда и не везде.
>Now you have a ProblemFactory.
Лол, надо им написать предупреждение: длительное использование может вызывать паттернизм головного мозга.
апаттернизм, если я правильно понимаю, это полное отсутствие паттернов, их избегание
а анти - это повсеместное применение антипаттернов
Чтобы избежать checked exceptions сделан новый интерфейс - суть, константная-функция.
Callable же часть стандартной либы, и ясное дело много всякого завязано на него. Ну и чтоб конвертировать одну интерфейс в другой написаны такие вот "паттернобертки".
Насколько я понял достаточно было отнаследовать стандартный интерфейс:
И никакий конверсии не надо (по крайней мере toCallable, точно).
Более того, есть спец. хак - можно выбросить checked исключение, там где его совсем не ждали.
>такой код успешно работает.
потому что RuntimeException наследник Exception.
Потому T call(); эквивалентно T call() throws RuntimeException;
А, ну теперь понятно, почему иерархия исключений в Java такая запутанная. Пытались семантику языка Java скрестить с семантикой виртуальной машины. Получился выкидыш.
Зато смотрите как я умею:
http://ideone.com/8tgP8
Ищите отличия!
> это действительно из IRC.
Рассмотрите свою гипотезу на предмет внутренних проиворечий и увидите, что ухо не вписывается.