powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Delphi vs Java2
201 сообщений из 201, показаны все 9 страниц
Delphi vs Java2
    #33351819
Ewg_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет ли где сравнения этих средств разработки ? (для интранет систем)

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

или Java и "интранет" вообще несовместимы?
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33351881
Фотография Михаил Михайлович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ewg_нет ли где сравнения этих средств разработки ? (для интранет систем)

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

или Java и "интранет" вообще несовместимы?



сеть - это только один из элементов проекта... для сравнения мало (как мне кажется)
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33352117
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему это если Java - так сразу прям уж и в рефреш браузере?

Java-приложения ничем не уступают Delphi-приложениям и имеют такие преимущества, как
Код: plaintext
1.
2.
3.
4.
5.
бОльшая скорость разработки
бОльшая надёжность приложения
бОльшие функциональные возможности
бОльшая прозрачность кода
бОльшая скорость работы приложения
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33352142
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, согласно отчёту Evans Data Corporation, большинство GUI-приложений (47%) в настоящее время написаны на J2SE/Swing. Доля свинговых приложений во всём мире значительно превосходит долю приложений написанных WinForms.NET и Delphi.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33353446
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ewg_хотелось бы найти подтверждение (ну может и опровержение) своего мнения, что у Java - только один плюс - платформо независимость
С моей точки зрения это малоосмысленное сравнение, поскольку у них разные ниши. Писать веб на дельфе - примерно такой же идиотизм, как писать гуй на яве. Ниша, где они более-менее конкурируют - всякого рода сервера, вебсервисы итп. Но и то они настолько различаются, что почти по любой задаче имхо можно сказать, на чем ее делать явно лучше.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33353452
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkSquid
Гон по всем пунктам. Хотя, разумеется, по каждому можно найти такую java-программу и такую delphi-программу, что java выиграет.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33353714
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer Писать веб на дельфе - примерно такой же идиотизм, как писать гуй на яве.
Это почему гуй на джаве идиотизм?
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33353755
Ewg_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkSquidА почему это если Java - так сразу прям уж и в рефреш браузере?
эээ...
а как еще.
не виндузовские же формы на Жаве использовать?
основным лейтмотивом выбора Жавы была платформо независимость.
поэтому браузер и только браузер, какие еще есть варианты?

DarkSquid
Java-приложения ничем не уступают Delphi-приложениям
вот хотелось бы увидеть результаты адекватного сравнения.

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

далее, насчет скорости разработки, точнее исправления ошибок, с которыми мне пришлось столкнуться:
в дельфи тыкание на кнопку (поле) выводит на выполняемый код (или на то, чем заполняем)
в Жаве (по крайней мере то что я видел) - эти связи на поверхности не лежат, и на внос незначительных изменений (добавить поле, изменить выводимое значение) тратися по нескольку часов, в то время как в дельфи эта операция заняла бы максимум полчаса.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33353761
note...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторпримерно такой же идиотизм, как писать гуй на яве

а мужики - то и не знают... (Sun, Oracle, Sybase, Novell etc.)
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33353766
note...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторв дельфи тыкание на кнопку (поле) выводит на выполняемый код (или на то, чем заполняем)

это - пример того, как НЕ НАДо писать на Delphi.
Такие программы как раз имеют "низкую прозрачность кода"
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33353783
Ewg_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerС моей точки зрения это малоосмысленное сравнение, поскольку у них разные ниши. Писать веб на дельфе - примерно такой же идиотизм, как писать гуй на яве.
золотые слова.
вот хотелось бы пару ссылочек на какое-нибудь авторитетное издание или исследование. (дабы было что положить на стол руководству).

у нас щаз - GUI на Java, причем только в локалке (с довольно фиговой функциональностью и внешним видом).
Основной довод выбравших Java - "переход на Linux"
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33353790
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу того, что Ява на клиенте память жрёт... Так ведь Internet Explorer жрёт памяти примерно столько же. А Mozilla памяти жрёт намного больше. Для Интранета, кстати особых преимуществ Web-приложений, по сравнению с Java Web Start нет.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33353804
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ewg_основным лейтмотивом выбора Жавы была платформо независимость. поэтому браузер и только браузер, какие еще есть варианты?


SWING + J2SE1.5 + Java Web Start
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33353817
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ewg_у нас щаз - GUI на Java, причем только в локалке (с довольно фиговой функциональностью и внешним видом).

А у меня GUI выглядит как нативное. Скриншот к сожалению дать не могу, но мне нравится. Надо просто постараться получше и всё будет.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33353819
Ewg_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
note... авторв дельфи тыкание на кнопку (поле) выводит на выполняемый код (или на то, чем заполняем)
это - пример того, как НЕ НАДо писать на Delphi.
Такие программы как раз имеют "низкую прозрачность кода"

чего то я не понял (или меня не поняли)
вот собственно пример:
в таблице добавили столбец, на форме надо поле переориентировать на этот столбец (но просто его убрать нельзя - оно продолжает использоваться в другом месте)
в Делфи: тыкание на это поле показывает источник данных. меняем и задача выполнена.
в Жаве несколько часов искали где и чем это поле заполняется...

насчет НЕ НАДО, ну ладно, не сам код выводится по щелчку, но процедура или акшен, которые легко и быстро находятся.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33353834
Ewg_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkSquidSWING + J2SE1.5 + Java Web Start
а SWING - это что?
он в качестве клиента используется?
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33353849
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ewg_а SWING - это что?
он в качестве клиента используется?

Это либа гуёвая - виджеты, окна, панельки, поля ввода и прочая ерунда. Я её выделил отдельно, потому как могли бы и AWT-шные классы использоваться.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33353881
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
note...а мужики - то и не знают... (Sun, Oracle, Sybase, Novell etc.)
И это Вы таки мне будете говорить, особенно про Oracle.

Это почему гуй на джаве идиотизм?
Признаться, не вижу возможности провести обсуждение, не свалившись во флейм. Кратко - меня решительно не устраивает соотношение цена/качество этого процесса. Даже при использовании развитых вещей, того же Spring-а.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33353981
note...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarerИ это Вы таки мне будете говорить, особенно про Oracle.
А чего они тогда пишут, неужто чисто из-за идеологии?
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33354016
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
note...А чего они тогда пишут, неужто чисто из-за идеологии?
Я не очень понимаю, что Вы называете идеологией.

Если Вы спрашиваете моего мнения, почему Oracle активно пользуется явой, то:

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


Сама по себе ставка была сделана не с бухты барахты и даже не под впечатлением от бурных успехов явы. Oracle принял решение отказаться от качества в угоду скорости. Если раньше он долго делал, то теперь он быстро делает, а потом долго выпускает патчи. И в рамках этой концепции переход на хреновый, но унифицированный код инструментов дает выигрыш в скорости.


Восьмая версия оракла была объявлена с суффиксом "i" - в смысле Internet. Для движения в этом направлении ява, безусловно, удобнее чем Си.


Помимо базы и связанных с ней инструментов, Oracle активно расширяет линейку своих продуктов и технологий. Для соблюдения кроссплатформенности и скорости разработки у него есть два выбора - ява или Oracle*Forms. Он выбрал первое, и при такой постановке вопроса это безусловно разумно.


Последние годы ява, помимо прочего - оппонент микрософтовскому .NET. Так что вполне понятно, что и IBM, и Oracle, и многие другие будут продвигать эту технологию во многом ради "против мелкософта".
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33354029
note...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторПоследние годы ява, помимо прочего - оппонент микрософтовскому .NET. Так что вполне понятно, что и IBM, и Oracle, и многие другие будут продвигать эту технологию во многом ради "против мелкософта".

это я и имел в виду под "идеологией" в основном :-)

Знаю, что у Novell была точно такая же мотивация (она была еще более против "против мелкософта")
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33354113
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мля, ну скока мона? Ну если есть люди, которые на этом пишут и получают кайф, то значит на этом можно писать и получать кайф!!! Как можно сравнивать ТАКИЕ среды разработки? У каждой своя ниша. У каждой свои фанаты, достоинства и недостатки.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33354173
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ewg_или Java и "интранет" вообще несовместимы?Почаму? тцп/ип форева.
Ewg_Основной довод выбравших Java - "переход на Linux"Ну а ты им про куликс расскажи.
И покажи им, вот, дескать, сколько с жабой паримся, на дельфе всё уже давно готово было бы. Но если оппонент невменяем, то я тебе сочувствую.
DarkSquidSWING + J2SE1.5 + Java Web Startща вроде свт начинает набирать популярность, нет? Кстати, а чего все так на свинг ломанулись в своё время?
Ewg_поэтому браузер и только браузер, какие еще есть варианты?виртуальная жаба-машина. Скомпиленные классы можно запускать как обычные приложения, при этом они не обязаны наследовать от апплета, а класс окна - Frame, если мне не изменяет склероз. Фигаришь на него в рантайме контролы, отображешь фрейм и поехали слушать евенты. Логика сходна с винапи.
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33355452
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoСкомпиленные классы можно запускать как обычные приложения, при этом они не обязаны наследовать от апплета, а класс окна - Frame, если мне не изменяет склероз.
Собственно говоря, при минимальных усилиях почти любой java-апплет можно превратить в "обычное gui-приложение" и наоборот - классы хорошо совместимы, так что если не втыкаться в ограничения безопасности итп, все будет.

Фигаришь на него в рантайме контролы, отображешь фрейм и поехали слушать евенты. Логика сходна с винапи.
Ну, сходство пожалуй оччень общее - не более чем на уровне концепции event-driven program. Пожалуй, в "логика сходна с Turbo Vision" будет даже чуть побольше правды :)
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33357125
jdev333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в частности Жава-приложения требуют 2 лишних сервера для обеспечения своей работы (сервер приложений и сервер отчетов) - а Дельфи прекрасно и без них обходится. для средних фирм, где менее 50 рабочих мест это довольно важно.

Не понял. Зачем отдельный сервер для отчетов?
Жаба "не требует", вообще, никаких серверов. Они могут использоваться и широко используется, но по совсем другим причинам.

То что Delphi обходится без апп-сервера - это не прекрасно, это значит, что у Delphi нету апп-сервера. А это серьезный минус для более-менее немаленьких сложных проектов.
Соответствующие "+-" 3-х звенок для больших проектов описаны в соотв-х местах - мона их щас не обсуждать.
------

GUI на Delphi писать - вполне нормально.
На жабе хороший "нетормозной" GUI - мона, но займет больше ресурсов.
А "бизнес" писать лучше на жабе (быстрая разработка, апп-сервера и т.д.)
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33357378
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jdev333 То что Delphi обходится без апп-сервера - это не прекрасно, это значит, что у Delphi нету апп-сервера.
Не совсем понял, что Вы имеете в виду. Наличие J2EE-подобных спецификаций на контейнеры, объекты итп?

jdev333 А это серьезный минус для более-менее немаленьких сложных проектов.
Согласитесь, что это не "минус", а "предмет многих религиозных споров без какого-либо осмысленного результата".

jdev333 На жабе хороший "нетормозной" GUI - мона, но займет больше ресурсов.
Честно говоря, не видел. Вроде как называли отличным примером идею, но и она не очень быстра.

Впрочем, у меня больше претензий ко времени, необходимому для разработки функционально нормального интерфейса.

jdev333 А "бизнес" писать лучше на жабе
Не соглашусь, пожалуй, хотя вопрос в принципе оценочный - кому что проще. Минус дельфы в этом плане - непроработанные в эту сторону стандартные библиотеки. А большой плюс - абсолютный минимум технических деталей, которые следует постоянно держать в голове. Пример такой детали - стандартная для явы проблема использования частично инициализированного объекта (из конструктора предка вызывается виртуальный метод, доопределенный в потомке). Из всего, что я пробовал, дельфа в наибольшей степени дает программисту сосредоточиться на сути ("что я делаю"), уводя на второй план технику реализации ("как это делать"), что является плюсом для бизнес-приложений. Хотя, безусловно, вызывает появление толпы ламеров, которые вроде как специалисты. Впрочем, таких ламеров обильно везде.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33357466
jdev333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer

jdev333
То что Delphi обходится без апп-сервера - это не прекрасно, это значит, что у Delphi нету апп-сервера.

Не совсем понял, что Вы имеете в виду. Наличие J2EE-подобных спецификаций на контейнеры, объекты итп?

ну да, если я правильно понял человека, писавшего про сервера для жабы :)



jdev333
На жабе хороший "нетормозной" GUI - мона, но займет больше ресурсов.

Честно говоря, не видел. Вроде как называли отличным примером идею, но и она не очень быстро
Впрочем, у меня больше претензий ко времени, необходимому для разработки функционально нормального интерфейса


вот и я к тому же. На джаве делать GUI пока не особо оправданно.

------
Зато на жабе есть исключения и загрузка класса по имени. А самое главное - апп-сервер, который дает кучу возможностей.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33357675
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jdev333 Зато на жабе есть исключения и загрузка класса по имени.
Хм. Вы так говорите, слово в жабе они появились раньше чем в дельфе :)

Если уж говорить о подобных возможностях, приведите жаба-аналог следующего кода, столь же простой и удобный:

Код: plaintext
1.
2.
3.
4.
5.
6.
 function  TMyForm.CreateControl ( ClassName :  string  ;
                                Left, Top, Width, Height : integer ) : TControl ;
 begin 
  Result := TControlClass ( GetClass ( ClassName )).Create ( Self ) ;
  Result.SetBounds ( Left, Top, Width, Height ) ;
  Result.Parent := Self ;
 end  ;

jdev333А самое главное - апп-сервер, который дает кучу возможностей.
Это самое главное для тех задач, где он нужен :) Само по себе безусловно хорошо, но это не столько объект сравнения, сколько вопрос разных ниш. Борландеры с моей точки зрения повели себя несерьезно, вроде как попытавшись подсесть на веб, но более декларативно - типа "а у нас можно и эту модную феньку тоже" - чем действительно попытавшись сделать удобное решение для этой ниши.

Само по себе решение идти в эту нишу с виндовс-продуктом - вряд ли было разумно, просто дань моде, которая ничего особенного не дала.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33357902
jdev333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer

а чего тут? Создать класс по имени , вызвать конструктор или getInstance() или метод.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33358013
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jdev333а чего тут? Создать класс по имени , вызвать конструктор или getInstance() или метод.
Безусловно, можно. Только займет раза в три больше места и не будет никакой поддержки от компилятора (вместо ошибки компиляции "нет такого конструктора" при исполнении вылетит InvocationЧтоТоException).

С поддержкой исключений в жабе у меня также есть некоторые претензии. Первая - директива throws. Точнее, то, что из метода, указанного как не возбуждающий исключений, тем не менее может вылететь уйма исключений; соответственно эта директива только мешает без какой-либо практической пользы. Вторая - отсутствие нормальной поддержки исключений в Swing-е; в результате, кстати, многие java-программы работают "втихую": я нажал на кнопку, исключение вылетело в System.out, красота, ошибок нет, работы тоже нет :)
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33358032
jdev333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Безусловно, можно. Только займет раза в три больше места и не будет никакой поддержки от компилятора (вместо ошибки компиляции "нет такого конструктора" при исполнении вылетит InvocationЧтоТоException).

ЭЭЭ! Стоп!.
Как это "ошибка компиляции" для класса, которого еще может не быть? :)
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33358082
-------------
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Безусловно, можно. Только займет раза в три больше места и не будет никакой поддержки от компилятора (вместо ошибки компиляции "нет такого конструктора" при исполнении вылетит InvocationЧтоТоException).

Ну прям таки в три раза :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Component createComponent ( String className ,  int  left ,  int  top,  int  width,  int  height)   throws     InvocationTargetException
{
  Component comp =  Class .forName(className).newInstance();
  add(comp);
  comp.setBounds ( left, top, width, height ) ;
   return  comp;
}
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33358211
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jdev333 ЭЭЭ! Стоп!.
Как это "ошибка компиляции" для класса, которого еще может не быть? :)
Близким аналогом в данном случае будет работа через интерфейс с классом, которого может еще не быть.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33358236
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-------------
Ну прям таки в три раза :)
Между

Код: plaintext
Create ( Self ) ;

и

Код: plaintext
newInstance();

есть некоторая разница, реализация которой несколько увеличит этот код.

Ладно, уточню свою фразу: в три, если расписывать аккуратно, и в два, если описывать и инициализировать массив в одну строку.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33358313
jdev333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer


есть некоторая разница, реализация которой несколько увеличит этот код.

Какая такая разница и как увеличит?

по-моему, все одинаково.


Близким аналогом в данном случае будет работа через интерфейс с классом,
которого может еще не быть.

Это к чему?
Пусть есть интерфейс, от которого наследуются все классы, вызываемые таким способом ( по имени). В каком языке компилятор выдаст преупреждение об ошибке на этапе компиляции для еще несуществующих классов?
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33358422
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jdev333Какая такая разница и как увеличит? по-моему, все одинаково.
Хм. Боюсь, на "одинаково" я могу только посоветовать посмотреть повторно. Увеличит за счет необходимости использования объекта Constructor.

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

К сожалению, я не предполагал, что беседую с человеком, не знакомым с дельфой. Reflection в данном случае - довольно неуклюжее приближение к имеющемуся в Delphi механизму сlass references (хотя с другой стороны является более мощным и более универсальным механизмом). Происходящее в написанном мной коде жабовскими словами можно описать примерно так: от загруженного по имени класса берется интерфейс, и по этому интерфейсу вызывается конструктор объекта.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33358452
jdev333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В любом нормальном языке компилятор выдаст ошибку (а не предупреждение) на попытку вызова метода, отсутствующего в интерфейсе либо присутствующего с другой сигнатурой. Даже если через этот интерфейс предполагается работа с классом, который может не существовать на момент компиляции вызывающего кода.

Ну да. Но и в жабе выдаст ошибку при попытке вызвать метод, отсутствующий в интерфейсе.


К сожалению, я не предполагал, что беседую с человеком, не знакомым с дельфой. Reflection в данном случае - довольно неуклюжее приближение к имеющемуся в Delphi механизму сlass references (хотя с другой стороны является более мощным и более универсальным механизмом). Происходящее в написанном мной коде жабовскими словами можно описать примерно так: от загруженного по имени класса берется интерфейс, и по этому интерфейсу вызывается конструктор объекта.

ну и в жабе так же берется интерфейс и вызывается что-то.

Где Вы видите разницу в 3 раза какую-то?


Хм. Боюсь, на "одинаково" я могу только посоветовать посмотреть повторно. Увеличит за счет необходимости использования объекта Constructor.

Не понял. Почему это в жабе необходимо использовать какой-то объект Constructor?
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33358617
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
С поддержкой исключений в жабе у меня также есть некоторые претензии.Первая - директива throws. Точнее, то, что из метода, указанного как не возбуждающий исключений, тем не менее может вылететь уйма исключений; соответственно эта директива только мешает без какой-либо практической пользы.


вообщето, без объявления в директиве throws, могут вылетать только наследники RuntimeException, а это такие ошибки, которые в отлаженной программе не должны возникать, а если они есть, то это реальные баги. А вот все остальные ошибки, обязаны быть объявлены в throws или перехвачены в try/catch иначе будет ошибка на этапе компиляции.
На счет ненужности throws это вы конечно загнули, а как бы вы например читая JavaDoc, определяли какие ексепшены может выкидывать тот или иной метод? Или вам чисто пофиг, у вас каждый метод в try/catch ??? Или вы любитель копатся в исходниках, которые не всегда есть?? А компилятору тоже тогда нужно в исходниках копаться?

softwarer
Вторая - отсутствие нормальной поддержки исключений в Swing-е; в результате, кстати, многие java-программы работают "втихую": я нажал на кнопку, исключение вылетело в System.out, красота, ошибок нет, работы тоже нет :)


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

Кстати, аналог log4j в делфи есть?
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33358730
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jdev333Ну да. Но и в жабе выдаст ошибку при попытке вызвать метод, отсутствующий в интерфейсе.
Угу. Вот только в жабе написанный мной код не удастся выполнить через интерфейс. Или она уже научилась засовывать в интерфейс конструкторы?

jdev333 ну и в жабе так же берется интерфейс и вызывается что-то.
Где? Пока что я вижу одно предложения java-реализации, где интерфейсами и не пахнет. Мало того, сначала Вы сказали "выпадет в ранайтме, так и надо", теперь вроде как говорите что все будет так же, с ошибкой в дизайн-тайме.

jdev333 Где Вы видите разницу в 3 раза какую-то?
Не понял. Почему это в жабе необходимо использовать какой-то объект Constructor?
Хм. Простите, я еще готов понять, что я рассказываю про возможности дельфы, но неужели мне нужно рассказывать еще и про возможности жабы?

Сформулирую так: в чем, по-Вашему, отличие Class.newInstance() и Constructor.newInstance()?
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33358771
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessenвообщето, без объявления в директиве throws, могут вылетать только наследники RuntimeException, а это такие ошибки, которые в отлаженной программе не должны возникать, а если они есть, то это реальные баги.
И кому легче от того, что они не должны возникать? Они возникают. Причем в официальных релизах тех же оракловых программ (это чтобы убрать ссылку на лично мои кривые руки). В любой нетривиальной программе есть ошибки, и задача программиста - минимизировать проблемы от них. Если программа упадет от NullPointerException - пользователю, час вбивавшему данные, глубоко наплевать на то, что эта ошибка не должна была возникнуть.

wessenА вот все остальные ошибки, обязаны быть объявлены в throws или перехвачены в try/catch иначе будет ошибка на этапе компиляции.
Это был бы замечательный принцип, если бы он всегда работал. Но тогда, когда он работает по принципу "здесь играем, здесь не играем, а здесь рыбу заворачивали", проще вставить в шаблон метода throws Throwable и не париться. Догадываетесь, почему Throwable? Потому если если вставить throws Exception, то программа таки будет падать - именно падать, пролетая сквозь вроде бы правильные блоки catch.

wessenНа счет ненужности throws это вы конечно загнули, а как бы вы например читая JavaDoc, определяли какие ексепшены может выкидывать тот или иной метод?
Я предпочту здесь отойти от сути и сфокусироваться на логике рассуждений: Вы считаете правильным модифицировать язык, чтобы сделать малополезную документацию чуть менее малополезной?

wessenИли вы любитель копатся в исходниках, которые не всегда есть??
Наоборот. Я не люблю копаться в исходниках, но пока что я не встречал джавовской библиотеки (включая JDK), которая рано или поздно не заставила бы меня (может быть взять декомпилятор) и разобраться, что там понаворотили.

wessenА компилятору тоже тогда нужно в исходниках копаться?
Хм. Признаться, не уследил за логикой Ваших рассуждений. А компилятор копается в javadoc-ах?

wessenтут чего то вообще не понял, при чем тут свинг??
При том, что свинг - одно из мест, где эту проблему можно было бы исправить.

wessenКак описали вы, может происходить в любой программе и без свинга, это все зависит от рук программиста,
В случае жабы - именно так, от рук программиста. В случае дельфы - можно специально постараться и сделать программу, которая работает "как описал я". Но если не стараться, пользователь как минимум увидит сообщение об ошибке.

wessenКстати, аналог log4j в делфи есть?
Затрудняюсь ответить насчет аналога, поскольку log4j не устроил меня и я плохо знаю его возможности. Средств аналогичного назначения, разумеется, полно.

Впрочем, имхо сравнение библиотек малоосмысленно - все равно их слишком много, чтобы кто-нибудь имел представление о всех имеющихся, и можно говорить лишь о наличии решений под ту или иную довольно узкую задачу. С тем же успехом я могу спросить о наличии в яве аналога DevExpress, GExperts или хотя бы ODAC (вот об отсутствии последнего, кстати, я сильно печалюсь).
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33358880
jdev333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer jdev333
Ну да. Но и в жабе выдаст ошибку при попытке вызвать метод, отсутствующий в интерфейсе.

Угу. Вот только в жабе написанный мной код не удастся выполнить через интерфейс. Или она уже научилась засовывать в интерфейс конструкторы?

Конструкторы, действительно, в интерфейсы не засунешь. Мона засунуть метод
createNewInstance(), а конструктор спрятать. Поэтому выполнить - удастся.

softwarerjdev333
ну и в жабе так же берется интерфейс и вызывается что-то.

Где? Пока что я вижу одно предложения java-реализации, где интерфейсами и не пахнет. Мало того, сначала Вы сказали "выпадет в ранайтме, так и надо", теперь вроде как говорите что все будет так же, с ошибкой в дизайн-тайме.


Вы чего, жабу не знаете? :)
((MyInterface)Class.forName(name)).createNewInstance(a,b,c,d);

softwarerjdev333
Где Вы видите разницу в 3 раза какую-то?
Не понял. Почему это в жабе необходимо использовать какой-то объект Constructor?

Хм. Простите, я еще готов понять, что я рассказываю про возможности дельфы, но неужели мне нужно рассказывать еще и про возможности жабы?

Сформулирую так: в чем, по-Вашему, отличие Class.newInstance() и Constructor.newInstance()?

Constructor - это , вообще, что?
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33358894
jdev333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer wessenКак описали вы, может происходить в любой программе и без свинга, это все зависит от рук программиста,

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

Специально постараться, как я понимаю, должен программист? :)


softwarer wessen
А вот все остальные ошибки, обязаны быть объявлены в throws или перехвачены в try/catch иначе будет ошибка на этапе компиляции.

Это был бы замечательный принцип, если бы он всегда работал. Но тогда, когда он работает по принципу "здесь играем, здесь не играем, а здесь рыбу заворачивали", проще вставить в шаблон метода throws Throwable и не париться. Догадываетесь, почему Throwable? Потому если если вставить throws Exception, то программа таки будет падать - именно падать, пролетая сквозь вроде бы правильные блоки catch.

OutOfMemory перехватывать собрались? :)
Checked exceptions - бизнес -эксшепшионы, Runtime - остальные. работа с ними всегда ведется по-разному, ибо суть у них разная.


softwarer
wessenНа счет ненужности throws это вы конечно загнули, а как бы вы например читая JavaDoc, определяли какие ексепшены может выкидывать тот или иной метод?

Я предпочту здесь отойти от сути и сфокусироваться на логике рассуждений: Вы считаете правильным модифицировать язык, чтобы сделать малополезную документацию чуть менее малополезной?

Вы и сами в состоянии обвинить себя в передергивании и переставлении с ног на голову :) Однако, Вы этого не делаете. Разве все так плохо? :)
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33358955
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jdev333Специально постараться, как я понимаю, должен программист? :)
Да. В дельфе, если специально постараться, можно сделать плохую (в части данной конкретной особенности) программу. В жабе программист должен постараться, чтобы сделать (в свете данной конкретной особенности) хорошую. Соответственно, в рамках сравнения реализации исключений в двух средах - это недоработка жабы. Заметьте, сравнивать исключения предложил не я :)

jdev333
OutOfMemory перехватывать собрались? :)
Не пробовал. Полагаю, в моем случае они обработаются по общей схеме, и надеюсь, у создателей java-машины хватило умения реализовать их хотя бы на уровне Turbo Vision (где эту проблему можно было адекватно обработать).

jdev333 Checked exceptions - бизнес -эксшепшионы, Runtime - остальные. работа с ними всегда ведется по-разному, ибо суть у них разная.
Это теория. Какое отношение, например, SQLException имеет к бизнесу при нормальном понимании слова "бизнес"? То, что для одного класса - бизнес-функция, для другого - неинтересная техническая деталь.

Работа с ними ведется одинаково, ибо в первую очередь интересно одно: бизнес-функция работает либо бизнес-функция не работает. Грубо говоря, если я начал транзакцию, мне надо откатить ее вне зависимости от того, произошло ли SomeBusinessRuleException, SQLException или NullPointerException.

Разумеется, абзац выше - определенная гипербола, утрированная точка зрения. Такая же гипербола, как Ваше "всегда по-разному". Реальность - где-то посередине; где-то я ловлю конкретные исключения, где-то пишу реакцию на Exception, а кое-где - и на Throwable; если я этого не сделаю, моя программа станет тем самым дерьмом, которое втихую гадит под себя (в смысле - в System.out).


softwarer
[quot wessen]На счет ненужности throws это вы конечно загнули, а как бы вы например читая JavaDoc, определяли какие ексепшены может выкидывать тот или иной метод?

jdev333 Вы и сами в состоянии обвинить себя в передергивании и переставлении с ног на голову :) Однако, Вы этого не делаете. Разве все так плохо? :)
Признаться, совсем не понял смысла этой фразы :(

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

Если Вы считаете, что на основании этого меня нужно обвинить в дезориентации чего-либо - что ж, обвиняйте.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33359180
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю, как сейчас, но помню года 4 назад достаточно было саму Delphi оставить на выходные, чтобы в понедельник утром из-под неё полезли совершенно тупые сообщения об ошибках. Думаю, комментарии о надёжности Delphi-программ излишни.

И stack trace в Дельфи есть? Как его программно получить, чтобы узнать в каком месте ошибка было и залогировать ей в стандартный вывод?
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33359245
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
как минимум сообщение об ошибке


Ну и какова польза от этого сообщения - без логов, без стэктрайса, без всего?

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

Ваши действия?

А теперь представьте, что у вас есть нормальный человеческий лог с вызовами процедур и со стэктрейсом. Вы можете начать с того, что возьмёте из SourceSafe'а версию кастомера и просмотрите именно то место, откуда вылезла ошиюка. И, скорее всего, даже если код писали китайские студенты, Вы сможете придумать достоверную гипотезу о том, почему ошибка возникла и что с ней делать.

Как на Delphi сделать так, чтобы эксепшины писались в лог, а не гадились на экран?
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33359294
jdev333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerЯ специально подчеркнул, что отхожу от вроде бы намеченной темы (и был бы рад, если бы мои собеседники делали так же). Причину тоже указал, правда в форме вопроса - примененная схема рассуждений мягко говоря неудачна, первичная вещь (язык) выводится следствием вторичной (javadoc), серьезно отвечать на следствия из этого бессмысленно.


То что есть throws в методе - подсказывает программисту о возм-х исключениях (это мона сделать в комментариях-документ) и программно задает (а это уже нельзя) логику поведения метода и т.д. И в javadoc это отображается (автоматом) и в коде программы. И нет никакого влияния документации на жабу - ясное передергивание. И Вы сами это понимаете, но прикидываетесь. Придраться к толкованиям формы рассуждений (типа тут бы нуна вместо javaDoc сказать о сыпцах)- так себе занятие.

А, вообще, забавно. Вы открыли мне глаза. Я-то думал, что Delphi - старый недобрый Паскакаль, а там, оказывается, что-то полезное появилось. Но не все :)
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33359315
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А самое прикольное, что в Дельфи эксепшины из разных мест программы выглядят абсолютно одинаково . Вы можете даже воспроизвести баг у себя, сделать патч к старой версии программы, отправить его кастомеру, и поставить себе текущую версию программы, чтобы продолжить над ней. Но Вы не можете быть уверены, что пофиксили именно тот баг, что воспроизводился у кастомера. Вы вполне могли воспроизвести и пофиксить другой баг. После этого кастомер ставит Ваш патч и видит тот же самый баг. Теперь Вам опять надо будет снести текущую версию и поставить старую тупую версию, которую юзает кастомер. Но Вы не можете быть уверены, правильно ли Вы отослали патч. Вы начинаете смотреть релиз-меил, проверяете-всё верно. Но что именно буилд инженеры положили в патч остаётся загадкой. Вы начинаете долгую и нудную переписку, чтобы выяснить, что патч у кастомера стоит должным образом. Но у Вас-то баг не воспроизводится, так как Вы его пофиксили. Придётся разбираться заново.

И теперь представьте, что у Вас был бы нормальный человеческий лог со стекрэйсом, который бы позволил точно отличить один баг от другого . В Delphy для различения багов программист должен приложить усилия. В Java баги различаются по умолчанию - их можно различать по стектрейсу.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33359424
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
И кому легче от того, что они не должны возникать? Они возникают. Причем в официальных релизах тех же оракловых программ (это чтобы убрать ссылку на лично мои кривые руки).


Вы действительно считаете, что оракловые программы верх совершенства и официальные релизы делают лучшие программисты планеты?
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33359453
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkSquidВы действительно считаете, что оракловые программы верх совершенства и официальные релизы делают лучшие программисты планеты?
Ничуть. Похоже, так считают мои оппоненты, которые среди прочих приводят их в пример.

Я пока что не видел программы на яве, которая бы мне действительно и безоговорочно понравилась, поэтому затрудняюсь оценить творчество лучших программистов планеты и мерять этой шкалой.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33359635
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkSquidНу и какова польза от этого сообщения - без логов, без стэктрайса, без всего?
Польза от этого сообщения в том, что пользователь знает о состоянии программы. Достаточно типичное состояние java-программы (видел не раз, хотя разумеется и не то чтобы каждый день) - в трейс вылетел тот же NullPointerException, программа осталась с висящим прогрессбаром в состоянии "вроде бы работает", и если пользователь не заглянет в лог - так и будет ждать, пока "доработает до конца".

Польза от этого сообщения в том, что пользователь не нажмет кнопку второй, третий, четвертый раз, потому что она "не нажимается - вернее нажимается, но ничего не делает", и тем не усугубит последствия ошибки.

Позволю себе переставить местами абзацы Вашего повествования, дабы соблюсти логику ответа.

DarkSquidА теперь представьте, что у вас есть нормальный человеческий лог с вызовами процедур и со стэктрейсом.
А кто Вам сказал, что у меня его нет?

Хм. У меня складывается впечатление, что в этой теме я единственный, кто серьезно работал с обоими инструментами, и разговариваю с куликами с одного болота.

DarkSquidВы можете начать с того, что возьмёте из SourceSafe'а версию кастомера
Гадость какая :( Я уж лучше из стартима возьму.

DarkSquid
Ошибка может быть где угодно, в любом из методов программы, вызываемых при возникновении события. Вот юзер пожаловался на то, что вылазит окошко с ошибкой.
Угу. Что в самом худшем случае лучше, чем если он жалуется: "Программа просто не работает. Жму, и ничего не происходит. Консоль? Какая консоль? А, это дурацкое черное окно, которое все время мешается.. Да, там постоянно что-то пишется - я никогда не обращал на него внимания. Нет, конечно ничего не сохранял. Да, сейчас запущу еще раз.... Нажал, там вылетело что-то на десять экранов, какие-то непонятные слова, ничего записать не успел. А, так это в файл надо записать? А как?"

DarkSquid..... Ваши действия?
Чтобы не расписывать, отмечу, что кроме стектрейса, у меня есть еще один простой путь - взять из VCS-а map-файл и в нем увидеть строку (файл и номер), при исполнении которой вылетела ошибка.

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

DarkSquidи просмотрите именно то место, откуда вылезла ошиюка. И, скорее всего, даже если код писали китайские студенты, Вы сможете придумать достоверную гипотезу о том, почему ошибка возникла и что с ней делать.
Ну и? Что особенного дает здесь жаба?

Хотя относительно достоверной проверки - сомнительно. Скажем, следующий фрагмент кода:

Код: plaintext
String value = textField.getText().toUpperCase();

Какую достоверную гипотезу о происхождении NullPointerException Вы выдвинете? Я - так вижу как минимум две, причем не вижу, как на основании только этой информации выбрать из них верную.

DarkSquidКак на Delphi сделать так, чтобы эксепшины писались в лог, а не гадились на экран?
Повесить на событие Application.OnException обработчик, который будет писать исключения в файл. На экран они при этом перестанут вылетать, поскольку это дефолт на случай отсутствия пользовательских обработчиков. В жабе близким к понятию обработчика является понятие Listener-а.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33359639
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЭто был бы замечательный принцип, если бы он всегда работал. Но тогда, когда он работает по принципу "здесь играем, здесь не играем, а здесь рыбу заворачивали", проще вставить в шаблон метода throws Throwable и не париться. Догадываетесь, почему Throwable? Потому если если вставить throws Exception, то программа таки будет падать - именно падать, пролетая сквозь вроде бы правильные блоки catch.

По поводу "вставить в шаблон метода throws Throwable" это вы опять загнули. Объясню почему. В жабе есть три вида ошибок, 1-ый, наследники от Error, посмотрите в "малополезном" JavaDoc, какие это ошибки и объясните мне зачем их перехватывать? Кстати, вот что в javaDoc про них описано - " A method is not required to declare in its throws clause any subclasses of Error that might be thrown during the execution of the method but not caught, since these errors are abnormal conditions that should never occur. ". 2-ой тип ошибок, это наследники от RuntimeException, они более "легкие", но все же носят системный характер и появляются на 100% от кривых рук. 3-й тип, это те самые наследники Exception, они относятня к бизнес логики и их возникновение и обработка вполне нормальное явление. Такое разбиение на типы, мне кажется вполне логичным, т.к. например 1-ые два типа ошибок, должны быть ликвидированы полностью на этапе тестирования, при чем я даже уверен, что это можно сделать, перехватить их конечно можно, но дела это особо не поправит, например NullPointerException, если он возник, то это баг в логике, который надо немедленно фиксить, если вы его перехватите, то максиму, что можно сделать, это удалить все данные пользователя и вежливо попросить его их вбить еще раз.

По поводу вашик придирок к выводу стек трейса в консоль, не пойму чем вы не довольны и при чем здесь жаба и throws вообще. Если ошибки летят в консоль, значить есть блок catch и в нем как минимум такое - exception.printStackTrace(System.out). Т.е. жаба не позволит не обработать ошибки! А почему программер вывел стек в консоль а не в лог, это спросите у него. Тут может быть только одна беда, если оставите блок catch пустым, то ошибку можно искать годами :))

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

Кстати, слышал от делфистов перешедших на жабу, что жабий стек трейс им очень по душе пришелся.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33359785
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jdev333То что есть throws в методе - подсказывает программисту о возм-х исключениях
OK. Фрагменты кода из JDK:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
     public  TreePath pathByAddingChild(Object child) {
	 if (child ==  null )
	     throw   new  NullPointerException("Null child not allowed");

     public   void  setModel(ListModel model) {
         if  (model ==  null ) {
             throw   new  IllegalArgumentException("model must be non null");

Итого: абсолютно одна и та же проблема, разве что во втором случае глупо регистрировать исключение. Исключения - разные. Подсказки в виде throws - нет. Все очень удобно и логично.

jdev333и программно задает (а это уже нельзя) логику поведения метода и т.д.
Не очень понял эту фразу. Вы имеете в виду то, что IDE умеет сгенерить вокруг вызова метода соответствующий набор catch-ей? Сама по себе нормальная фича, но зачем ради этого усложнять язык - не понимаю; эту информацию нужно хранить во вспомогательных файлах (и не говорите, что без этого компилятор не разберется).

Директива throws обязывает программиста явно задать логику обработки указанных исключений. Что было бы хорошо, если бы было всеобъемлющим; в ситуации же, когда нужно обрабатывать не только эти исключения, та же фича автоматического генерирования catch-ей только ухудшает ситуацию (поскольку неопытный программист считает, что нажал кнопку - и обработка ошибок сделана).

jdev333И в javadoc это отображается (автоматом) и в коде программы. И нет никакого влияния документации на жабу - ясное передергивание.
Ясное? Ну так и обратитесь с ним к тому, кто это передергивание допустил, а теперь в теме не участвует. Я охарактеризовал такую модель рассуждений значительно мягче, а теперь Вы почему-то приписываете ее мне.

jdev333И Вы сами это понимаете, но прикидываетесь.
Ваши телепоаналитические способности, похоже, несколько уступают горячности.

jdev333Придраться к толкованиям формы рассуждений (типа тут бы нуна вместо javaDoc сказать о сыпцах)- так себе занятие.
Я, в отличие от Вас, не думаю за собеседника, в частности, "что он должен сказать". Думать так - значит, априори считать себя умнее собеседника, а если так считать - зачем с ним говорить? Вместо этого я надеюсь иногда встречать собеседников, с которыми можно поговорить как со взрослыми разумными людьми. http://softwarer.ru/about.html#Topic

jdev333А, вообще, забавно. Вы открыли мне глаза. Я-то думал, что Delphi - старый недобрый Паскакаль, а там, оказывается, что-то полезное появилось. Но не все :)
Хм. Да в общем-то я тоже заметил, что в этой теме в основном занимаюсь ликбезом. Мало того, я давно знаю, что невиданную мощь новых технологий превозносят в основном люди с весьма узким кругозором; скажем, трудно восторженно говорить об ООП-революции, если знать, что ООП является удобной синтаксической надстройкой над так называемым "модульным программированием" конца шестидесятых - начала семидесятых годов.

Полезности в яве конечно тоже есть, но меня не перестает удивлять тот набор глупостей, под которыми они похоронены. При использовании явы у меня не исчезает ощущение отката лет на десять-пятнадцать.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33359804
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkSquidА самое прикольное, что в Дельфи эксепшины из разных мест программы выглядят абсолютно одинаково
На экране. Поскольку стектрейс мягко говоря мало что скажет обычному пользователю, если вывалить его на экран. Ну а что касается остального - уровень Вашего знания дельфы виден и в предыдущих письмах, незачем усиливать это впечатление.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33359849
jdev333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я, в отличие от Вас, не думаю за собеседника, в частности, "что он должен сказать". Думать так - значит, априори считать себя умнее собеседника, а если так считать - зачем с ним говорить? Вместо этого я надеюсь иногда встречать собеседников, с которыми можно поговорить как со взрослыми разумными людьми. http://perehodnalichnosti.ru/about.html#Topic

Ага. Как же не думаете, когда вменяете смысл о влиянии javaDoc на java?
Не свидетельствовала "та" wessen-а фраза об этом. Никак.

softwarerПри использовании явы у меня не исчезает ощущение отката лет на десять-пятнадцать.

При использовании явы должно было появиться ощущение неприятия проприетарности в др платформах, ибо платформа java развивается на открытых стандартах.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33359895
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
OK. Фрагменты кода из JDK:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
    public TreePath pathByAddingChild(Object child) {
	if(child == null)
	    throw new NullPointerException("Null child not allowed");

    public void setModel(ListModel model) {
        if (model == null) {
            throw new IllegalArgumentException("model must be non null");


автор
Итого: абсолютно одна и та же проблема, разве что во втором случае глупо регистрировать исключение. Исключения - разные. Подсказки в виде throws - нет. Все очень удобно и логично.


действительно, все удобно и логично, т.к. эти ошибки не должны возникать в уже отлаженной программе, в идиале вобще никогда. Эти ошибки не бизнес уровня, поэтому, нагружать их в throws не совсем логично.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33359904
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerЧтобы не расписывать, отмечу, что кроме стектрейса, у меня есть еще один простой путь - взять из VCS-а map-файл и в нем увидеть строку (файл и номер), при исполнении которой вылетела ошибка.
Собственно, если бы Вы когда-нибудь попробовали, например, MemCheck (это удобный вспомогательный файл, разработанный парой швейцарских студентов), то увидели бы, что он выдает трейс без всякого исключения (сообщает, например, "вовремя не освобожден указатель такой-то, выделенный там-то").


Да что Вы мне сказки рассказываете? Я превосходно знаю, как поддержка программ на Дельфи осуществляется. Там пробел в редакторе отчётов в запросе лишний поставишь - и эксепшин вылетает. И никто это годами не фиксит. А что такое VCS я не знаю, и как мне MemCheck использовать для инвестигации той ошибки, которая уже произошла у кастомера, ума не приложу. И считаю, что окошко вывести на экран с сообщением об ошибке - это не проблема. И кастомеру что не интересно знать, так это не стектрейс, кторый поможит быстрее пофиксить ошибку, а вот именно сообщение о том, что программа не может прочесть адрес в памяти не интересно кастомеру знать. И программисту оно ничего не скажет.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33359921
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Код: plaintext
String value = textField.getText().toUpperCase();


Softwarer, вы чепуху пишете. Поймите, что если я знаю, что эксепшин произошёл именно здесь, я смогу посмотреть и остальные куски программы, узнать какого класса была переменная textField и была ли она проинициализирована.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33359954
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerЧтобы не расписывать, отмечу, что кроме стектрейса, у меня есть еще один простой путь - взять из VCS-а map-файл и в нем увидеть строку (файл и номер), при исполнении которой вылетела ошибка.

Ну Softwarer , в самом деле! Вы как будто бы багов не фиксили никогда...
Важна не строка с ошибкой, но и контекст, в котором эта строка была вызвана. Контекст, понимаете. Весь. Целиком. Из какой именно процедуры эта строчка дёргалась.
Лучше всего, чтобы программа в кору дампилась. Но Дельфиские программы в кору не дампятся, насколько я знаю.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33359982
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessenОбъясню почему. В жабе есть три вида ошибок, 1-ый, наследники от Error, посмотрите в "малополезном" JavaDoc, какие это ошибки и объясните мне зачем их перехватывать?
Как минимум - для того, чтобы записать в лог хоть какую-либо информацию о том, почему вывалилась программа. Впрочем, отвечу цитатой из того же javadoc-а: An application should catch instances of this class only if it must clean up after being terminated asynchronously.

wessenТакое разбиение на типы, мне кажется вполне логичным,
Так как Вы описали, все логично. Нелогично с моей точки зрения делать RuntimeException потомком просто Exception, наравне с кучей других, впрочем с точки зрения единой их обработки это скорее удобно.

wessenт.к. например 1-ые два типа ошибок, должны быть ликвидированы полностью на этапе тестирования,
Хм. Боюсь, я слишком прагматик, чтобы разговаривать об идеалах. Помнится, кто-то из классиков, кажется Дейкстра, показал, что для доказательства правильности некоей программы из двух десятков строк (то есть отсутствия в ней ошибок) требуется доказать порядка сорока лемм.

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

wessenпри чем я даже уверен, что это можно сделать, перехватить их конечно можно, но дела это особо не поправит, например NullPointerException, если он возник, то это баг в логике, который надо немедленно фиксить, если вы его перехватите, то максиму, что можно сделать, это удалить все данные пользователя и вежливо попросить его их вбить еще раз.
Хм. И Ваши пользователи такое терпят?

Простой пример - этот NullPointerException может возникать, например, при обновлении информации в статусбаре. И если я скажу им "у меня тут проблема в отрисовке статусбара, поэтому я похерил вашу работу", они скорее всего пойдут к моему начальству рассказывать, что за двести-триста тысяч зеленых рассчитывали получить программу получше.

wessenПо поводу вашик придирок к выводу стек трейса в консоль, не пойму чем вы не довольны и при чем здесь жаба и throws вообще. Если ошибки летят в консоль, значить есть блок catch и в нем как минимум такое - exception.printStackTrace(System.out). Т.е. жаба не позволит не обработать ошибки! А почему программер вывел стек в консоль а не в лог, это спросите у него.
Угу. Вот я и спрашиваю у авторов свинга - какого хрена их исключения лезут в консоль.

wessenТут может быть только одна беда, если оставите блок catch пустым, то ошибку можно искать годами :))
Угу. Эту беду я пока что вычищаю из исходников чуть ли не каждый день - даже человек, которому вроде бы десять раз объяснял, почему такого не надо делать, на одиннадцатый делает "вроде бы не помешает и удобно".

На дельфе - иногда приходилось объяснять. Раз пять за десять лет.

wessenВсе выше сказанное, указывает на то, что в жабе более мощная и продуманная система возникновения и обработки ошибок
Я пока что не вижу ничего, что на это указывало бы. Чтобы оперировать сравнительными характеристиками, Вам нужно показать "вот это есть".. "вот этого нет".. "вот это лучше".. Пока что Вы просто выдали некую общеизвестную информацию и попытались ответить на то, что я считаю недостатками жабы в плане исключений.

wessen (как следствие более сложная), которая просто заставляет программиста писать более качественно обработку ошибок,
Неверное утверждение.

Заставляет писать - в какой-то мере. В какой-то - потому что IDE только и делают, что автоматизируют этот процесс в силу своего убогого разумения. Сложная, неформализуемая задача - обработка ошибок - отдается на откуп тупейшему коду.

Более качественную - чушь. От того, что программист нажмет кнопку "Surround with try..catch" и сгенерит что-нибудь типа

Код: plaintext
1.
2.
3.
4.
5.
6.
    try  {
     FileInputStream in =  new  FileInputStream (AppConsts.CfgFileName);
   }
    catch  (FileNotFoundException e) {
     e.printStackTrace (System.err);
   }

ничего качественного не случится, строго наоборот.

wessenа вот в случае делфи, думать обо все этом не надо, действительно, а зачем? Ведь у уюзера само выскочит окошко об ошибке...
Правильно. Основная мысль дельфы - программист может сосредоточиться на ключевых аспектах программы, например, на ошибках, которые надо обрабатывать, и не должен тратить время на третьестепенные глупости.

Тот же пример кода выше - в том месте, где я читаю файл конфигурации, мне малоинтересен этот FileNotFound. На самом деле у меня много выше по стеку вызовов вылетит примерно следующее:

Код: plaintext
1.
2.
3.
4.
5.
6.
Ошибка!

Не удалось прочитать сохраненную конфигурацию программы.
Файл не найден.
Будут использованы настройки по умолчанию.

Файл конфигурации: x:\y\z.txt

Сделать такое в жабе - можно, и делаю, но это требует дополнительной по сравнению с дельфой работы.

wessenКстати, слышал от делфистов перешедших на жабу, что жабий стек трейс им очень по душе пришелся.
Я никак не пойму, чем же он лучше дельфового. Мне, кстати, он не нравится тем, что getOurStackTrace() приватен, то есть с ним нельзя поработать без извращений, напрямую (правда, может я и не увидел какого-то пути - долго не искал, написал с извращениями).

P.S. Прощу прощения, джентльмены, но я сейчас уезжаю и не уверен, что смогу продолжить беседу раньше 9-го числа.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33360002
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkSquidНу Softwarer , в самом деле! Вы как будто бы багов не фиксили никогда... Важна не строка с ошибкой, но и контекст, в котором эта строка была вызвана. Контекст, понимаете.
Вы слово "кроме" читать умеете? Есть трейс, есть и более простой и менее мощный способ. Как человек, который фиксил прорву багов, Вы не можете не знать, что для многих ошибок и без контекста понятно, в чем дело. Скажем - какой контекст Вам нужен для ответа на тот мой пример, на который Вы так и не ответили?

Насчет дампа ядра - я бы сказал, это последний рубеж. Пока что не припомню ошибки, для которой мне потребовалось бы столь масштабное средство; пока хватало продуманной отладочной печати.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33360015
jdev333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как насчет открытых стандартов- это все же получше проприетарности.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33360035
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerВы слово "кроме" читать умеете? Есть трейс, есть и более простой и менее мощный способ. Как человек, который фиксил прорву багов, Вы не можете не знать, что для многих ошибок и без контекста понятно, в чем дело. Скажем - какой контекст Вам нужен для ответа на тот мой пример, на который Вы так и не ответили?

Ну не собираюсь я на это отвечать. Детский сад какой-то. Это ж очевидно и потому только на собеседовании уместно. Если есть стек трейс - так бы и сказали бы, что есть, что дампится он там куда-то. Надо будет - посмотрю. А так - всё равно на чём писать - что Delphi, что java.

P.S.

с тем, что ГУИ на java идиотизм - не согласен.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33360090
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По сабжу (почти) есть очень старое сравнение трёх языков:-

Delphi,C++,Java
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33360842
Ewg_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jdev333 Не понял. Зачем отдельный сервер для отчетов?
не знаю. ресурсы жрет, сабака :)
jdev333 Жаба "не требует", вообще, никаких серверов.
эээ... а как она без апп сервера?
довод выбравших жаву (кстати не надо ее жабой называть, жаба - это мой любимый TOAD!!) - мол на клиенте ничего ставить не надо, развертывание приложений и новых версий = 0 ресурсов
jdev333у Delphi нету апп-сервера. А это серьезный минус для более-менее немаленьких сложных проектов.
Соответствующие "+-" 3-х звенок для больших проектов описаны в соотв-х местах - мона их щас не обсуждать.
у дельфи есть 3-ка.
кстати где почитать о ее плюсах ?
только имеет ли она смысл при 30 пользователях?
jdev333 GUI на Delphi писать - вполне нормально.
На жабе хороший "нетормозной" GUI - мона, но займет больше ресурсов.
вот собственно я и спрашиваю, где взять факты (или исследования) для аргументации такой позиции?
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33360908
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотрите, что есть:-

JX

Код: plaintext
1.
2.
3.
4.
JX enables Delphi in Java enterprise environments to have the best of both worlds: 

RAD application development with rich GUI applications. 
RAD access to J2EE EJBs. 

J2EE App Server + Delphi GUI.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33360922
Ewg_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessen в жабе более мощная и продуманная система возникновения и обработки ошибок
насчет возникновения - это вы абсолютно правы !!! :) :) :)
для обработки ошибок в дельфи есть абсолютно все, что есть в жаве. только у большинства программистов НЕТ НУЖДЫ этим пользоваться, а жаве - ПРИХОДИТСЯ.
wessenКстати, слышал от делфистов перешедших на жабу, что жабий стек трейс им очень по душе пришелся.
угу. потому что в дельфи половина ошибок, которые в жаве выскакивают в ран-тайме, отлавливается в дизайн-тайме.
улавливаете суть?

на практике я сталкиваюсь с ошибками в жаве, когда пользователь звонит, говорит, что что-то не работает, заходишь в процессы - там висит 10-15 сессий этого пользователя, пытающихся сделать одну и ту же задачу - всё потому, что пользователь не видя ошибки тыкает на кнопку, отжирая ресурсы у себя и сервера...
причем кнопка ни хрена не блокируется, ожидая выполнения тяжелой команды (как в дельфи)
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33360933
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ewg_причем кнопка ни хрена не блокируется, ожидая выполнения тяжелой команды (как в дельфи)

Там весь интерфейс блокируется, на самом деле. Чтобы не блокировалось надо в отдельной треде ручками пускать.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33360938
Ewg_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 softwarer:

да, нелегко вам тут пришлось... :)
сэнкс.

всё таки, не ужто нигде не проводились "официальные" сравнения.
вон для Оракле и SQL-сервера можно найти...
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33360941
Ewg_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkSquid Ewg_причем кнопка ни хрена не блокируется, ожидая выполнения тяжелой команды (как в дельфи)
Там весь интерфейс блокируется, на самом деле. Чтобы не блокировалось надо в отдельной треде ручками пускать.
вот такая простая и эффектившнейшая защита от перегруза.
если у программиста хватает квалификации отдельный тред запустить для контроля, то велика вероятность что и защиту от запуска еще невыполнейвшися команды сделает
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33360947
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что сравнивать-то?

В Delphi IDE одна и тулкит один. А в Java IDE много и тулкитов много. Например, можно всё в Emacs'e делать, тогда проблем с кнопками и эксепшинами вообще не будет. А можно в IDE-шках копаться, тогда как там кодогенератором код нагенериться так всё и будет работать.

Вон у Softwarer'а, как я понял, притензии к конкретным IDE и тулкиту, которые он использует.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33360959
Ewg_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkSquid Ewg_причем кнопка ни хрена не блокируется, ожидая выполнения тяжелой команды (как в дельфи)
Там весь интерфейс блокируется, на самом деле. Чтобы не блокировалось надо в отдельной треде ручками пускать.
вот такая простая и эффектившнейшая защита от перегруза.
если у программиста хватает квалификации отдельный тред запустить для контроля, то велика вероятность что и защиту от запуска еще невыполнейвшися команды сделает
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33360970
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Преимущество Delphi для большинства программистов в том, что она более интегрирована со своим IDE, нежели Java, что позволяет избежать багов взаимодействия IDE с языком.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33360990
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще - Java/Delphi... Оплата-то всё равно почасовая. Какая разница - на чём быстрее?
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33361417
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так как проблема непойманных исключений поднималась в этом топике много раз, я решил (всё-таки) выяснить, как же можно бороться с непойманными исключениями в Java (окромя ловли их).

Что же мы имеем в J2SE 5.0? А имеем мы интерфейс Thread.UncaughtExceptionHandler, который позволяет заимплементить обработчик непойманных исключений и имеем мы так же статический метод Thread.setDefaultUncaughtExceptionHandler, который позволяет назначить обработчк непойманных исключений для всех тред. Есть так же и простой метод Thread.setUncaughtExceptionHandler, который позволяет назначать обработчик исключений для конкретной треды.

Следовательно, хотите показывать все исключения пользователю - ставите J2SE5.0, имплементите всего один метод uncaughtException(Thread t, Throwable e) в интерфейсе UncaughtExceptionHandler и добавляете в метод main всего одну строчку
Код: plaintext
1.
Thread.setDefaultUncaughtExceptionHandler(new MyUncaightExceptionHandler());

И, добавляем в список сравниваемых параметров:-

Код: plaintext
1.
2.
3.
     Обработчик непойманных исключений 
    Delphi         есть 
    Java           есть, начиная с версии 1.5 

Что там ещё можно сравнить?
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33361440
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И чтобы быть совсем точным, в любом JDK можно перехватывать непойманные исключения путём перегрузки метода

Код: plaintext
1.
public void ThreadGroup.uncaughtException(Thread t, Throwable e)

Это всего несколько строчек кода, которые могут использоваться повторно. Почему этого никто не сделал, зато все предпочитают ругать Java - неизвестно.

То, есть, исправляя предыдущий пост:
Код: plaintext
1.
2.
3.
4.
     Обработчик непойманных исключений 
    Delphi     есть 
    Java       есть 
 [code=plaintext]
                    
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33361471
Фотография Viktor Bartel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer Ewg_хотелось бы найти подтверждение (ну может и опровержение) своего мнения, что у Java - только один плюс - платформо независимость
С моей точки зрения это малоосмысленное сравнение, поскольку у них разные ниши. Писать веб на дельфе - примерно такой же идиотизм, как писать гуй на яве. Ниша, где они более-менее конкурируют - всякого рода сервера, вебсервисы итп. Но и то они настолько различаются, что почти по любой задаче имхо можно сказать, на чем ее делать явно лучше.
...........................
это совсем не идеотизм пистат web приложения на delphi и GUI, на Java.
...........................

---------
Бартель
1
в этом форуме высказывайте свое мнение
по программмированию,
2
по членам форума и по их поведению
Ваше мнение не интересно

tchingiz
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33361708
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkSquid softwarer
Код: plaintext
String value = textField.getText().toUpperCase();

Softwarer, вы чепуху пишете. Поймите, что если я знаю, что эксепшин произошёл именно здесь, я смогу посмотреть и остальные куски программы, узнать какого класса была переменная textField и была ли она проинициализирована.
Какого класса переменная textField, вообще-то ясно из ее названия. Вы, конечно, можете потратить неопределенное количество времени, прослеживая, будет ли инициализирована эта переменная во всех возможных вариантах выполнения программы. Например, мой любимый код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
 public   class  SomeMyForm  extends  SomeBaseForm {

   private  TextField textField =  null ;

   public   void  SomeMyForm() {
     super ();
  }

   protected   void  initUI() {
     super .initUI();
    textField =  new  TextField();
    .....
  }
}

 public   class  SomeBaseForm {
  
   public  SomeBaseForm() {
    .....
    initUI();
  }

   protected   void  initUI() {
    .....
  }
}

Как, будет textField инициализирована или не будет? Что ж, допустим Вы проследили все ветки и даже нашли правильный ответ. И что из этого? Проблема-то на самом деле в том, что getText() возвращает null. И нахрена было заниматься подобным прослеживанием?
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33361733
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jdev333Ага. Как же не думаете, когда вменяете смысл о влиянии javaDoc на java? Не свидетельствовала "та" wessen-а фраза об этом. Никак.
Вы, безусловно, можете иметь по этому поводу любое собственное мнение. Там было сделано обоснование от противного - throws нужны, поскольку иначе, читая javadoc, было бы трудно/невозможно получить некоторую информацию. Со схемой доказательства от противного, надеюсь, знакомы? Она формулируется так: (a => b) => (!b => !a), где a и b - некоторые утверждения. В данном случае a = "throws не нужны", b = "[как бы Вы иначе,] читая javadoc..."

jdev333При использовании явы должно было появиться ощущение неприятия проприетарности в др платформах, ибо платформа java развивается на открытых стандартах.
Хм. Лично для меня это набор малоосмысленных слов; мне интереснее качество. Впрочем, хочется спросить - и давно оно должно было появиться? Если мне не изменяет память, по вопросу открытости жабы уже сломано и продолжает ломаться очень много копий; можно в конце концов вспомнить тот судебный процесс между саном и микрософтом, итогом которого стал .NET.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33361737
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessen
if(child == null)
throw new NullPointerException("Null child not allowed");
if (model == null) {
throw new IllegalArgumentException("model must be non null");

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

Код: plaintext
1.
2.
3.
 class  NullArgumentException  extends  <любой из этих двух классов> {
   public  NullArgumentException ( Class   class , String method, String argument) {
    ...
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33361790
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkSquidДа что Вы мне сказки рассказываете? Я превосходно знаю, как поддержка программ на Дельфи осуществляется.
И при этом задаете вопросы, ответы на которые знают даже новички дельфовых форумов (про OnException). Так что простите, но к любому Вашему утверждению о знании дельфы, я теперь отношусь с очень большой долей скепсиса.

DarkSquidТам пробел в редакторе отчётов в запросе лишний поставишь - и эксепшин вылетает.
А там есть редактор отчетов? :) И какой именно?

DarkSquidИ никто это годами не фиксит.
Хм. Ну если ваши программисты так сопровождают известные ошибки.. Или это вам продали какую-то программу, которую так сопровождали?

DarkSquidА что такое VCS я не знаю,
http://www.google.ru/search?hl=ru&ie=windows-1251&q=acronym+VCS&lr=

DarkSquidи как мне MemCheck использовать для инвестигации той ошибки, которая уже произошла у кастомера, ума не приложу.
Интересно, где наш внимательный собеседник, следящий за передергиваниями.

MemCheck крайне удобен для профилактики ошибок у кастомера раньше, чем они произойдут, хотя в его информацию стоит заглянуть и после того, но вопрос не в этом. Если посмотрите, он был упомянут в контексте возможности получить стек вызовов вне контекста исключения, просто стек для текущего момента - что, как я сейчас нашел, появилось в java только с версии 1.5.

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

DarkSquidИ кастомеру что не интересно знать, так это не стектрейс, кторый поможит быстрее пофиксить ошибку, а вот именно сообщение о том, что программа не может прочесть адрес в памяти не интересно кастомеру знать. И программисту оно ничего не скажет.
Хм. Вы наворотили какой-то страшный набор слов; если я правильно понял:

1. Клиенту неинтересно знать, что произошла ошибка. То, что исключение молча упало в трейс, его вполне устраивает. Ну не прореагировала никак программа на действия пользователя - и фиг с ней, нажмет OK еще раз двадцать, и если так и не прореагирует - пойдет обедать.

2. Вы не хотите либо не умеете писать сообщения об ошибках, полезные для пользователей и для программистов.

Впрочем, возможно Ваш пассаж относится только и персонально к "не может прочесть адрес в памяти". Соглашусь с тем, что само по себе это сообщение несет мало информации - только о том, что некая бизнес-функция не работает по причине ошибки в программе. И это примерно на 100% больше информации по сравнению с молчанием программы в той же ситуации.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33361799
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkSquidСкажем - какой контекст Вам нужен для ответа на тот мой пример, на который Вы так и не ответили?
Ну не собираюсь я на это отвечать. Детский сад какой-то. Это ж очевидно и потому только на собеседовании уместно.
То есть для тривиального детсадовского примера из одной строки Вы не можете либо не хотите дать столь же однострочный ответ, который, судя по Вашей теории, существует. OK.

Кстати, не знаю как Вы, а я на собеседованиях предпочитаю давать не детсадовские примеры - мне нужны недетсадовские люди.

DarkSquidЕсли есть стек трейс - так бы и сказали бы, что есть,
Дык сказал, раз десять.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33361811
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ewg_довод выбравших жаву - мол на клиенте ничего ставить не надо, развертывание приложений и новых версий = 0 ресурсов
Это не совсем так. Если говорить о веб-приложении, развертывание разумеется ноль, но тут ключевым словом является "веб", а уж на чем он - вопрос второй. Если говорить об апплетах и гуевых приложениях, не все так просто; в принципе технологии для развертывания есть, но отсутствие проблем никто не гарантирует. В целом я не вижу большой разницы, то ли клику запустится какой-нибудь Java Web Start, то ли по клику запустится setup.exe. Для тридцати тысяч пользователей в случае дельфы стоило бы подыскать хорошее решение, но для тридцати единиц - вообще не о чем говорить. Стоимость самого тупого варианта - "идет администратор с флэшкой" - составит максимум баксов двести; на фоне стоимости разработки - не аргумент.

Ewg_у дельфи есть 3-ка.
кстати где почитать о ее плюсах ?
только имеет ли она смысл при 30 пользователях?
Количество пользователей само по себе не слишком влияет на смысл трехзвенки - только в той степени, что при таких масштабах обычно и приложение невелико, а значит его усложнение менее нужно.

Имеет ли смысл трехзвенка в Вашем конкретном случае - надо смотреть детально. Имхо она имеет смысл тогда и почти только тогда, когда видна явная в ней необходимость; в ситуациях же "можно и так... можно и эдак..." выгоднее эдак.

Предлагаемыми борландом технологиями баловались достаточно многие, я видел работающими достаточно серьезные проекты, но по большому счету они не прижились. Имхо это и есть основной минус - не mainstream.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33361821
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkSquidТам весь интерфейс блокируется, на самом деле. Чтобы не блокировалось надо в отдельной треде ручками пускать.
Это подразумевается, поскольку если этого не делать, блокируется слишком уж хорошо - не идет, например, перерисовка progressbar-ов итп. Кроме того, я натыкался на блокировку, возникавшую из-за того, что стандартный листенер пытался дождаться освобождения event thread.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33361824
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkSquidВон у Softwarer'а, как я понял, притензии к конкретным IDE и тулкиту, которые он использует.
Хм. А можно с этого момента поподробнее? Тулкит, к которому я высказывал претензии, назывался Swing (ну или JDK, если угодно). Если есть альтернативы JDK, я буду очень признателен за ссылки.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33361830
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkSquidThread.setDefaultUncaughtExceptionHandler(new MyUncaightExceptionHandler());
Вот за эту подсказку - спасибо. Пока мы пользуемся четверкой, но будет еще один аргумент в пользу пятерки.

Сказанное же Вами в следующем сообщении, к сожалению, чуть менее полезно - может быть я ошибаюсь, но я не увидел способа применить эту технику к event thread-у, который AWT создает внутри себя. В собственных же потоках, понятно, эта проблема легко решается в любом случае.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33362149
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ewg_довод выбравших жаву - мол на клиенте ничего ставить не надо, развертывание приложений и новых версий = 0 ресурсовааа... на маздайской джава-машине работает?.. А без чего дельфовое приложение не сможет запуститься? По поводу скоростных джава-гуёв советовали заценить rssowl.
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33362152
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerКак, будет textField инициализирована или не будет? Что ж, допустим Вы проследили все ветки и даже нашли правильный ответ. И что из этого? Проблема-то на самом деле в том, что getText() возвращает null. И нахрена было заниматься подобным прослеживанием?

getText() null не возвращает. Поэтому я и не хотел отвечать не зная класса textField. Ну и, кроме того, мне этот пример не интересен. И вообще он оффтопик.

cat Test5.java
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
import javax.swing.*;
import java.awt.*;

public class Test5 {

    public static void main(String[] args) {
        System.out.println("Value.Swing=" + (new JTextField()).getText());
        System.out.println("Value.Awt=" + (new TextField()).getText());
        System.out.println("Value.Null=" + null);
    }
}


java Test5
Код: plaintext
1.
2.
3.
Value.Swing=
Value.Awt=
Value.Null=null
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33362165
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, Азуреус тоже на свт написан, но скоростями он меня не впечатлил, обычный тормозной джавов гуй. Наверно, надо быть гуру, чтобы писать на джаве быстрые гуи.
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33362383
Фотография Lelikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть еще у Borland написанный на Жаве C++BuilderX.
При полном отсутствии чего-то груженого, вроде мощных библиотек в памяти или еще чего-то сей продукт умудряется заикаться на каждом шаге, даже с меню чего-то думает.
________________________________________________________
Глюк - это высокоорганизованная система не поддающихся определению частиц
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33362403
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkSquidgetText() null не возвращает.
Да, здесь я ошибся. Возможно, это наследие JDK 1.3 - проект начинался на нем, и соответствующая доработка в нашем коде появилась именно тогда. У меня сейчас нет его на машине, чтобы посмотреть.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33362552
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего, имелся ввиду не .getText(), а .getSelectedItem() из комбобокса - он-то null вполне может вернуть.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33363031
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А есть ли в Delphi стандартные классы для быстрого поиска по ключу и работы с множествами объектов?

Такие как TreeSet, HashSet, TreeMap, HashMap, Vector, ArrayList, etc...

Заметьте, что в Java мапы и сеты реализованы двумя способами - на основе бинарного дерева и на основе хэш-таблиц. Программист сам может выбрать, какая реализация ему подходит.

Код: plaintext
1.
2.
3.
    Поиск по ключу и работа со множествами объектов 
    Jaba      есть 
    Delphi    неизвестно 
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33363040
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkSquidА есть ли в Delphi стандартные классы для быстрого поиска по ключу и работы с множествами объектов?
Есть реализация STL для дельфы.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33363341
note...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, с контейнерной библиотекой у Delphi традиционно - провал...
Да и с алгоритмами. Как там стандартная функция сортировки в паскале называется? Никак? А да, ее самому писать нужно, как и контейнеры - язык-то ведь для студентов :-)
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33363872
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer wessen
if(child == null)
throw new NullPointerException("Null child not allowed");
if (model == null) {
throw new IllegalArgumentException("model must be non null");

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

Код: plaintext
1.
2.
3.
 class  NullArgumentException  extends  <любой из этих двух классов> {
   public  NullArgumentException ( Class   class , String method, String argument) {
    ...


ну так вы же этот пример надумали. кто вам мешает использовать два раза NullPointerException?
и вообще, мы спорили о throws. И логичным я назвал то, что NullPointerException и IllegalArgumentException не нужно объявлять как throws.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33365244
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessenну так вы же этот пример надумали. кто вам мешает использовать два раза NullPointerException?
Этот пример, простите, не я надумал, а авторы JDK, и вопрос стоило бы адресовать им. Относится этот пример к образцовой логичности. Если уж сами авторы не совсем понимают, что когда использовать в ими же созданном продукте, имхо это наводит на некоторые размышления.

wessenи вообще, мы спорили о throws. И логичным я назвал то, что NullPointerException и IllegalArgumentException не нужно объявлять как throws.
Давайте тогда отмотаем чуть назад. Вы назвали throws логичным, поскольку она дает информацию о возможных исключениях. Хорошо. С моей точки зрения, например, абсолютно логичен вызов setModel (null). Почему-то этот логичный вызов вызывает exception, причем не NullPointerException, которого я мог бы ожидать по предыдущему опыту с JTree, но нечто другое. Информации об этом - нет, по крайней мере в throws. Мне все равно надо лезть в исходники и проверять.

Да, такая ошибка может быть выявлена и устранена на этапе тестирования. Ровно так же, как и любая другая ошибка. Следовательно, либо вообще не реагируем на ошибки, либо - это не аргумент.

Ладно, предположим в рамках этого рассуждения, что я неправ, уже здесь начиная считать throws... малополезным. Можно было бы считать так: физические ошибки, типа (String s = null).length() хорошие программисты не делают, поэтому не ловим; ловим исключения, которые явно возбуждаются. Но - не ловим, оказывается; вот возбуждается исключение, оно логическое (дурацкая недоработка класса JList), а никакого throws нет, и это считается логичным. Что дальше?

Ладно, я бы еще понял, если бы RuntimeException был независимой веткой - типа деления на "бизнес-исключения" и "ошибки реализации". Но это - ветка Exception. Полагаю, Вы согласитесь с тем, что не всегда возможна обработка исключения, лучшая, чем подробно сообщить пользователю. Раз так - незачем писать блоки типа

Код: plaintext
1.
2.
3.
 catch  (BusinessException1 be1) { ErrorManager.collect (be1);}
 catch  (BusinessException2 be2) { ErrorManager.collect (be2);}
...

Имхо нормальный человек в таком случае будет ловить базовый класс, то есть Exception. И - по-Вашему, логичным будет писать в нем что-нибудь типа

Код: plaintext
1.
2.
 catch  (Exception e) {
   if  (e  instanceof  RuntimeException)  throw ;  else  ErrorManager.collect (e);
}

Нет, если честно, не кажется мне все это продуманной, стройной и удобной системой.

2 note... Судя по Вашей попытке, беседовать с Вами будет совершенно скучно. Извините, избегну.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33365647
jdev333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerВы, безусловно, можете иметь по этому поводу любое собственное мнение. Там было сделано обоснование от противного - throws нужны, поскольку иначе, читая javadoc, было бы трудно/невозможно получить некоторую информацию. Со схемой доказательства от противного, надеюсь, знакомы? Она формулируется так: (a => b) => (!b => !a), где a и b - некоторые утверждения. В данном случае a = "throws не нужны", b = "[как бы Вы иначе,] читая javadoc..."

Всего лишь было сказано, что "...как бы вы, например , читая javadoc..."
Учитывая, что throws в javadoc - слепок с src, то ни о какой необходимости внесения throws в язык из-за документации речи не шло. И Вы сами это понимаете!
Вообщем, неудачный случай для "умничанья".

----
Все нормально с исключениями. Есть бизнес-ексепшионы - возникают так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
...
  catch(FileNotFoundException ex) {
        throw new ConfigFailedException(ex); //FATAL error
  }
...
  catch(FileNotFoundException ex) {
        throw new CacheUnsyncException(ex); //нуна переинициализировать cache
  }

  

Ексепшионы, которые, не должны возникать(Runtime) ловятся в каком-нибудь объемлющем диспетчере, который сигнализирует об неожид ошибке при обработке данной бизнес-операции. Все очень удобно и логично, что все наследуется от Exception.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33365780
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Код: plaintext
1.
2.
catch (Exception e) {
  if (e instanceof RuntimeException) throw; else ErrorManager.collect (e);
}


Кстати, приведённый выше кусок кода можно и так записать:-

Код: plaintext
1.
2.
catch (RuntimeException e) {throw e;}
catch (Exception e) {ErrorManager.collect (e);}

Мне без instanceof больше нравится. И читается проще как "RuntimeException пробрасываем, а всё остальное передаём менеджеру ошибок".
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33366535
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЭтот пример, простите, не я надумал, а авторы JDK, и вопрос стоило бы адресовать им. Относится этот пример к образцовой логичности. Если уж сами авторы не совсем понимают, что когда использовать в ими же созданном продукте, имхо это наводит на некоторые размышления.

Как я понимаю вы привели пример из какого то базового класса. Скажите какой именно класс и метод, а мы посмотрим. Всетаки (я тут подумал) выкидывать нужно IllegalArgumentException, если входной параметр(ы) метода не соответствует каким либо требованиям, даже если он null. При беглом просмотре классов свинга так оно и есть. По поводу вашего примера, если child это глобальная переменная, то все логично, если это все таки параметр метода, то система ошибок java тут все равно не причем, тут уже нужно ловить индуса, который это написал и выяснять, почему он так сделал.

автор
Давайте тогда отмотаем чуть назад. Вы назвали throws логичным, поскольку она дает информацию о возможных исключениях. Хорошо. С моей точки зрения, например, абсолютно логичен вызов setModel (null). Почему-то этот логичный вызов вызывает exception, причем не NullPointerException, которого я мог бы ожидать по предыдущему опыту с JTree, но нечто другое. Информации об этом - нет, по крайней мере в throws. Мне все равно надо лезть в исходники и проверять.


А для меня логично вообще не вызывать метод setModel, если модели как таковой нет. Какое кстати исключение возникает, не IllegalArgumentException ли?

автор
Да, такая ошибка может быть выявлена и устранена на этапе тестирования.


вот вот.

авторРовно так же, как и любая другая ошибка.
А какая другая? Если не Runtime, то их не надо устранять, их нужно правильно обрабатывать. Такое чувство, что вас одолели Runtime ошибки, а с не Runtime вы вообще мало знакомы. Например:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
// устраняем раз и навсегда IllegalArgumentException
 if ( null  != userData){
    try {
      validate(userData);
   } catch (MyWrongDataException e){
      //выводим красивое окошко...
   }
}

Чего тут нелогичного? А вы бы как сделали? MyWrongDataException естественно объявлен в throws.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33367091
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerС моей точки зрения это малоосмысленное сравнение, поскольку у них разные ниши. Писать веб на дельфе - примерно такой же идиотизм, как писать гуй на яве. Ниша, где они более-менее конкурируют - всякого рода сервера, вебсервисы итп. Но и то они настолько различаются, что почти по любой задаче имхо можно сказать, на чем ее делать явно лучше.

Пища к размышлению (почти оффтоп):

По официальным данным Sun (было озувечено на конференции в питере) гуёвые приложения на java vs серверные приложения на java составляют примерно 54% и 46%.
(по этой самой причине такое большое внимание уделено развитию свинга в мустанге.)
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33367419
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уф..., осилил :)

softwarer
MemCheck крайне удобен для профилактики ошибок у кастомера раньше, чем они произойдут, хотя в его информацию стоит заглянуть и после того, но вопрос не в этом. Если посмотрите, он был упомянут в контексте возможности получить стек вызовов вне контекста исключения, просто стек для текущего момента - что, как я сейчас нашел, появилось в java только с версии 1.5.

А как же new Exception().getStackTrace() в 1.4, или
принт стектрейса в всвой стрим с последующей обработкой? :)

softwarer
Давайте тогда отмотаем чуть назад. Вы назвали throws логичным, поскольку она дает информацию о возможных исключениях. Хорошо. С моей точки зрения, например, абсолютно логичен вызов setModel (null). Почему-то этот логичный вызов вызывает exception, причем не NullPointerException, которого я мог бы ожидать по предыдущему опыту с JTree, но нечто другое. Информации об этом - нет, по крайней мере в throws. Мне все равно надо лезть в
исходники и проверять.


Давайте говорить не о том, чего нет нигде, а о том, что есть хоть где-то.

Или на пальцах:

перед вами класс#метод: SomeClass#setBlaBla(int a, int b, int c, int d);
(на любом языке, сути не меняет)

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

Знаете ответ? Может быть для java и delphi он как-то различается? Нет? Ну-ка, ну-ка.... хочу его улышать.

Мы с вами уже спорили на эту тему в форуме по java. Ну или покрайней мере пытались :)

В дельфи не силён, но, как я пронимаю, все эксепшины там "unchecked" в терминологии java.

Разделение же на сhecked/unchecked exceptions - палка о двух концах, т.к.

1. Оно предполагает знание неких "паттернов" (аналогичные знания необходимы для работы с методами clone, equals, hashcode, etc), следование которым приводит к надёжно работающему и устойчивому к случайным сбоям коду. Одна только не обходимость писать этот "дурацкий catch" уже плюс, т.к. вольно не вольно заставляет помнить, что существует что-то ещё кроме успешных сценариев работы приложения :)

2. Не знание паттернов приводит к рождению антипаттернов ( пустой catch, ловля errors, без дальнейшего пробрасывания и т.д.)

Но(!), по пути 2 идут те же люди, что игнорируют обработку "кода возврата", считая, что результат выполнения метода всегда успешен, либо отдают обработку ошибок на откуп среде выполнения (компилятору) принимающему решение за них, а поэтому эксепшины не могут принести в код больше вреда, чем их отсутсвие

А посему - не надо на них ругаться, их нужно понимать :)

Хочу сослаться на книжки:
"java без сбоев, обработка ошибок и ёклмн" http://www.ozon.ru/context/detail/id/2342758/,
и главу об обработке ошибок у Рихтера в ".NET Framework" http://www.ozon.ru/context/detail/id/2279035/.


Мне все равно надо лезть в исходники и проверять.

Код сам писаться никогда не будет :)

Можно развить тему борьбы с NPE (@Nullable, etc), вполне похвально и разумно пытаться выявить такие вещи в компил тайм.
Но есть же ошибки другого типа (элементарный пример метода, где не понятно, что и как передавать я привёл). Тут всё равно придётся изучить библиотеку перед тем как её использовать - грустно, но факт %)

Если повезёт, и документация будет полной - отлично, иначе - в код и тестовые запуски. И никуда от этого не убежать - не важно на delphi, java или ином диковинном языке написан код - вины эксепшинов в этом нет. Они только помогают, как могут, справиться с "нелёгкой" программерской участью %)
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33367638
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkSquidКстати, приведённый выше кусок кода можно и так записать:
Согласен, Ваш вариант изящнее. Тем не менее, с моей точки зрения, сама по себе необходимость сказать нечто типа "для всех потомков X, кроме Y, сделать Z" означает неудачную структуру классов. Поскольку означает, что у "всех кроме Y" есть нечто общее, но нет соответствующего общего предка.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33367685
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessenКак я понимаю вы привели пример из какого то базового класса. Скажите какой именно класс и метод, а мы посмотрим.
Если не изменяет память, это swing.tree.TreePath. Метод, извините, не скажу, поскольку не хочется ради этого скачивать jdk :)

wessenВсетаки (я тут подумал) выкидывать нужно IllegalArgumentException, если входной параметр(ы) метода не соответствует каким либо требованиям, даже если он null.
Согласен. Я - так вообще не могу назвать ни одной ситуации, когда нужно явно в коде возбуждать NullPointerException. imho это в чистом виде исключение java-машины, аналог "аппаратного" исключения.

При беглом просмотре классов свинга так оно и есть. По поводу вашего примера, если child это глобальная переменная, то все логично, если это все таки параметр метода, то система ошибок java тут все равно не причем, тут уже нужно ловить индуса, который это написал и выяснять, почему он так сделал.

автор С моей точки зрения, например, абсолютно логичен вызов setModel (null)
А для меня логично вообще не вызывать метод setModel, если модели как таковой нет.
Чем же это логично, если это оставит действовать старую модель?

Вообще говоря, это тема для отдельного большого обсуждения, но в практике программирования есть некая тонкая разница между "идеологически правильно" и "удобно". Грубо говоря, хороший продукт должен быть наиболее удобным из всех возможных идеологически правильных. И один из признаков удобного продукта - отсутствие лишних, пусть и формально правильных сообщений об ошибках; гибкость, способность адаптировать свое поведение там, где есть разумный метод для этого.

В следующем примере я могу чуть ошибиться - поскольку без исходников - но думаю, проиллюстрирую мысль. В вызовах

Код: plaintext
JList list =  new  JList ((ListModel)  null );

и

Код: plaintext
JList list =  new  JList ( new  Objects[ 0 ]);

имхо логически крайне мало разницы, но физически - один из них выдаст exception, другой нет. Лучшее, что я могу сделать в своем классе - это

Код: plaintext
JList list = (model !=  null ) ?  new  JList (model) :  new  JList ( new  Objects[ 0 ]);

после чего пользователи моего класса избавятся от необходимости помнить об этой особенности. И имхо такие вещи надо закапывать в библиотеки, чем глубже, тем лучше. Я бы предпочел тоже об этом не помнить, а сосредоточиться на функциональности моего класса.

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

Например, "дата начала должна быть меньше даты завершения" - это с Вашей точки зрения бизнес-исключение, которое надо обработать, или же runtime, который надо устранить?

Такое чувство, что вас одолели Runtime ошибки, а с не Runtime вы вообще мало знакомы. Например:
Не совсем так. Если говорить обо мне, то мне надоело держать в голове кучу малоинтересных технических подробностей и время от времени натыкаться на новые. Если же говорить о моих претензиях к throws, то мне не нравится тот код, который в результате этой директивы создают мои коллеги, да и авторы некоторых стандартных решений тоже. Возможно, эта та же претензия к "идеологически правильно, но практически неудобно". Практически - там, где в дельфе в худшем случае разбираешься, почему вылетело окошко с access violation, в жаве ищешь таинственную ошибку, и в конце концов находишь очередной catch (Exception e) {}. Я уже почти дошел до желания ежедневно обрабатывать исходники регулярным выражением, которое искало бы эту хрень.


// устраняем раз и навсегда IllegalArgumentException
if(null != userData){
Уже неудобно, кстати. Проверки на null - техническая деталь, которая должна быть закопана в недрах реализации и которой в логике совершенно не место.

В остальном - боюсь, не понял Вашего примера.


try{
validate(userData);
}catch(MyWrongDataException e){
//выводим красивое окошко...
}
}
И, кстати, от таких фрагментов кода я предпочитаю избавляться. Я вообще полагаю, что неленивый программист - страшная опасность для окружающих. У меня аналогичный фрагмент выглядит примерно так:

Код: plaintext
1.
2.
3.
4.
Action aCommitForm =  new  Action() {
   public   void  doAction()  throws  EValidate {
    validate (userData);
    .....
  }};
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33367758
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerЕсли посмотрите, он был упомянут в контексте возможности получить стек вызовов вне контекста исключения, ....
А как же new Exception().getStackTrace() в 1.4
Хм. А new Exception() у нас "вне контекста исключения"? Я, кажется, не говорил, что этого нельзя сделать; я привел пример того, что в дельфе это можно сделать без извращений. А в жабе - только с 1.5

или
принт стектрейса в всвой стрим с последующей обработкой?
Угу. Создал PrintWriter, натравил его на строковый объект, напечатал в него трейс, подключил регулярные выражения, распарсил... Главное - нескучно; чувствуешь, что Делом занимаешься, а не просто-напросто программируешь то, что нужно клиенту, как эти лохи вокруг ;-)

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

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

Какие значения можно передать в этот метод и что будет если передать другие значения?

Знаете ответ? Может быть для java и delphi он как-то различается? Нет? Ну-ка, ну-ка.... хочу его улышать.
Нет, по большому счету он для java и delphi никак не отличается, по крайней мере с тех пор как в java появились enum-ы.

В дельфи не силён, но, как я пронимаю, все эксепшины там "unchecked" в терминологии java.
Не знаком с этой терминологией, но скорее всего именно оно и есть.


Разделение же на сhecked/unchecked exceptions - палка о двух концах, т.к.

1. Оно предполагает знание неких "паттернов" (аналогичные знания необходимы
......
2. Не знание паттернов приводит к рождению антипаттернов
Не соглашусь с такой трактовкой. Не незнание паттернов, а их то ли выдуманное, то ли действительное неудобство; желание "просто решать простые задачи", "ну ведь здесь же действительно не будет проблем, а иначе требуется городить лишний код" итп.

Но так или иначе - я пока что вижу один конец палки: появление вредных, очень неприятных антипаттернов. Вижу другой конец палки: "знаемые паттерны" не всегда удобны. И вижу третий конец палки: тогда, когда эти паттерны удобны, никто не мешает применять их без принуждения компилятором, иначе говоря противовесом вредным антипаттернам является хинт, мелкая помощь.

Приведу некую аналогию: в некоторых языках, например в ADA, и в частности в том же Паскале была введена сильная типизация; можно определить например вещественный тип "Килограммы", вещественный тип "Километры", и компилятор не даст просто так складывать их в арифметическом выражении. Хорошо? Для своих задач, бесспорно, да. Теперь давайте предположим, что эта мысль доведена до абсурда, и в каждом классе/модуле/чемугодно нужно писать, что Class1.Килограммы cовместим с Class2.Килограммы, Class3.Килограммы.... Также давайте предположим, что параллельно в язык введен универсальный тип наподобие variant, способный хранить данные любого типа. Что мы сделали? С моей точки зрения - создали для программиста сильное искушение послать всю эту типизацию нахрен и абсолютно везде пользоваться variant-ом. Хорошо? Да нет, полагаю, хреново.

Вообще говоря, получается несколько забавная ситуация. Дело в том, что один из больших (с моей точки зрения) плюсов Object Pascal - детальная проработанность языка, максимально осложняющая процесс "хотел написать одно, а получилось другое". Так, стандартный для C++ и java вариант "опечатался в имени переопределяемого виртуального метода либо переименовал метод в предке и не поправил в потомке" там просто невозможен - вернее, его результатом будет ошибка компиляции. Директива throws, вообще говоря, пытается достичь той же цели и вроде бы мне следовало ее ценить. Реально - я в принципе готов оценить правильность идеи, но по опыту использования - неудобно. Порождает больше проблем, чем решает.

softwarer
Но(!), по пути 2 идут те же люди, что игнорируют обработку "кода возврата", ...
Не скажу, что полностью согласен, но во многом.

Давайте определим цель, которую мы преследуем, предлагая к реализации ту или иную систему обработки ошибочных ситуаций. С моей точки зрения, коротко она описывается так: уменьшение суммарной стоимости [последствий] реально возникающих проблем.

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

Далее, я полагаю игнорирование ошибки - практикой, порождающей намного более тяжелые последствия, нежели аварийное завершение (падение) программы, а аварийное завершение - практикой, порождающей более тяжелые последствия, нежели модель дельфы по умолчанию (по сути - прерывание текущей операции с выдачей окна с текстом исключения). Игнорирование кода возврата и пустой catch - это именно то самое игнорирование ошибки, и текущая реализация просто подталкивает к этому. Например, actionPerformed не имеет throws - это же просто бред. Да, так гораздо легче было писать awt/swing - ну и получилось на выходе то, что получилось.

Сухой остаток состоит из двух пунктов опыта - сравнения "как там" и "как тут".

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

2. Лично от меня реализация хорошей (с моей точки зрения) обработки ошибок в дельфе требует заметно меньших усилий, нежели в java.

Но есть же ошибки другого типа (элементарный пример метода, где не понятно, что и как передавать я привёл). Тут всё равно придётся изучить библиотеку перед тем как её использовать - грустно, но факт %)
Боюсь, Вы таки недостаточно полно осилили предыдущее обсуждение.

Как ни странно, примерно это я и доказывал своим оппонентам - все равно никуда не денешься. В то время как мне задавались вопросы типа "а вы что - любитель лазить в исходники?" и подобные. Если бы throws и/или еще что-нибудь решали бы эти проблемы - я был бы очень рад. Но ведь не решают - просто приходится писать лишнее. И - то, к чему я отношусь намного хуже - маскировать суть, функциональность, нагромождением технических деталей.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33368507
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Буду краток :)

softwarer
Как ни странно, примерно это я и доказывал своим оппонентам - все равно никуда не денешься. В то время как мне задавались вопросы типа "а вы что - любитель лазить в исходники?" и подобные.

Нет, вы доказывали, что cчитать объявления exception'ов заменой "лазанья по исходникам" нельзя. (Я правильно понял?)

Я же, как и sun, говорю, что они предназначены не для этого (затем и отсылал к книжкам). Цель эксепшинов не сигнализация о не корректности аргументов, а оповещение об исключительных, но *ожидаемых* событиях (например, потеря соединения с базой данной). В отличии от кодов возврата, их нельзя проигнорировать "неосознанно" или "от рассеяности".

Наследники RuntimeException, Error и (боже упаси) прямые наследники Throwable выполняют уже другую функцию.
Это, главным образом, средства диагности проблем для программиста.

Понимаю, тут можно приводить примеры библиотек, где "злой дядя" заставляет обрабатывать RuntimeException на ровне с Exception и нарушает "общественный договор" другими способами :)

Хочу только сказать, что ничто не мешает "хорошему дяде" рисовать окошко с ошибкой ручками (забавно было бы пытаться это сделать в консольном приложении для линух без иксов :)) и вести логи при помощи того же log4j или стандартного в java с версии 1.4. механизма, избавляя пользователя от не обходимости что-то куда-то зарисовывать.

Не далай зла сам и его станет меньше в мире (с) Л.Н.Толстой в вольной обработке :)


Если бы throws и/или еще что-нибудь решали бы эти проблемы - я был бы очень рад. Но ведь не решают - просто приходится писать лишнее. И - то, к чему я отношусь намного хуже - маскировать суть, функциональность, нагромождением технических деталей.


Скупой платит дважды. Что тут можно ещё сказать?
Нанимаешь дешёвую рабочую силу, не хочешь её обучать - трать деньги на решение возникающих проблем в будущем.


з.ы.
Я понимаю и принимаю ваши аргументы, но выводы (разный у нас опыт, никуда от этого не денешься) делаю другие :)

А истина... абсолютной истины не существует, это знают все %)
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33369800
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUsНет, вы доказывали, что cчитать объявления exception'ов заменой "лазанья по исходникам" нельзя. (Я правильно понял?)

Я же, как и sun, говорю, что....
Боюсь, в данной цитате я отвечал только на первую часть Вашего примера, где Вы строили примерно тот же пример, что и я.

NotGonnaGetUsЦель эксепшинов не сигнализация о не корректности аргументов, а оповещение об исключительных, но *ожидаемых* событиях
Хм. В первую очередь, я не понял, что Вы имели в виду, и чтобы не задавать кучу поясняющих вопросов, попросил бы Вас переформулировать максимально однозначно, в частности выделив: цель exception-ов или директивы throws, оповещение или принуждение, оповещение кого....

NotGonnaGetUsВ отличии от кодов возврата, их нельзя проигнорировать "неосознанно" или "от рассеяности".
Да. К сожалению, их слишком неудобно игнорировать "специально" (под игнорированием я здесь имею в виду "доверить их обработку вызывающей функции").

Поясню на примере. Мой пользователь в рамках одного сеанса работы и одного интерфейса работает с несколькими разными серверами (если угодно - с несколькими движками, выполняющими те или иные функции). На уровне базового окна есть метод refresh(), вызываемый по кнопке "обновить данные", ну и соответственно в зависимости от движка - в одном случае грозит SQLException, в другом - допустим, BIBeansException, итп. И тут - я добавляю новый движок, допустим AWXML, со своим AWException. Что происходит? Я должен прописать AWXML в throws refresh-а, прописать его в throws тех методов, которые его вызывают....... неинтересно, очень неинтересно. Да, я могу не выпускать исключение из refresh, выкидывать там красивое окно и вроде бы решить проблему. Назову только один минус такого решения - есть методы, которые используют refresh в своей реализации. То есть, случись что - посреди бизнес-функции вылетит красивое окно, пользователь нажмет OK, и бизнес-функция почапает дальше, считая, что refresh отработал. Хреново... Если я совсем идиот, я добавлю в refresh код возврата - типа отработал или нет. То есть вернусь в технологии на десять лет назад.

Ладно, добавление движка в конце концов случается не так часто - у нас пока что было дважды. Но refresh - такой метод, что можно довольно спонтанно захотеть вызывать его из той или иной бизнес-функции; это не столько постановочный вопрос, сколько вопрос удобства, оптимального дизайна функциональности. Захотели? Ну извините, значит садимся и снова прописываем все исключения refresh-а во все места этой бизнес-функции. Получаем полный идиотизм: функция движка A возвращает исключение, относящееся к движку B, потому что оно может быть результатом refresh-а.

Да, конечно, если говорить именно о refresh, то в его общности не так уж много смысла; можно плюнуть и откропировать код. Но ведь это относится к любой общей функциональности. А раз так.. раз так берем и пишем

Код: plaintext
 public   void  refresh()  throws  Exception

Ну и смысла в этом, соответственно.... я бы предпочел не писать. По сути, требуется просто добавить throws Exception в половину методов проекта; радости от этого никакой, смысла - столько же. Имхо.

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

NotGonnaGetUs (забавно было бы пытаться это сделать в консольном приложении для линух без иксов :))
Ровно настолько же забавно, насколько забавно использовать в таком приложении swing :))

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

NotGonnaGetUsСкупой платит дважды. Что тут можно ещё сказать?
Нанимаешь дешёвую рабочую силу, не хочешь её обучать - трать деньги на решение возникающих проблем в будущем.
Можно сказать? Можно сказать, что недешевая рабочая сила хорошо напишет и без throws. Для нее это - необходимость писать дополнительные слова и ничего больше. Для дешевой рабочей силы, судя по процитированному, это тоже не подходит. Так зачем же оно нужно?
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33370336
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прерву вашу высокоинтеллектуальную беседу


NotGonnaGetUsи вести логи при помощи того же log4j или стандартного в java с версии 1.4. механизма , избавляя пользователя от не обходимости что-то куда-то зарисовывать.

NotGonnaGetUs - я понимаю, что RTFM, но не подскажете - как это делается?
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33370463
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
java.util.logging
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33372183
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerБоюсь, в данной цитате я отвечал только на первую часть Вашего примера, где Вы строили примерно тот же пример, что и я.

Cорри, не понял ответа %)

softwarer
Хм. В первую очередь, я не понял, что Вы имели в виду, и чтобы не задавать кучу поясняющих вопросов, попросил бы Вас переформулировать максимально однозначно, в частности выделив: цель exception-ов или директивы throws, оповещение или принуждение, оповещение кого....


Хм...

Давайте попробуем.

Начну из далека.

До появления концепции исключений для обработки ошибок и не стандартных ситуаций во всю использовался подход под названием "код возврата", а так же простое "падение программы с созданием coredump" ;)

Эти "технологии", очевидно, имеют свои недостатки. А именно:

1. трудночитаемый и усложнённый код из-за неявной НЕОБХОДИМОСТИ через строчку вставлять проверки кодов возврата.

2. коды возврата в виде "простых" типов не несут достаточно информации о "проишествии", возникает не обходимость создания велосипедов ака методов getLastErrorDescription(), возврата каких-то сложных структур и т.п. усложнения, свои в каждом приложении.

3. поскольку не всегда возможно разрешить "особую" ситуацию в месте её возникновения (решение может зависить от контекста в котором вызвается метод, внтури которого возникает эта ситуация), почти каждый метод ОБЯЗАН иметь код возврата(!). Если следовать этому принципу, то согласно п.1. сколько-нибудь сложный код станет вообще не подъёмный, если не следовать - это приведёт к сокрытию причин ошибок.

Всё вместе - это умноженный на тысячу случай, когда вместо Строки метод возвращает null. Пойди разбери почему null - толи аргументы не верные, толи сетевой шнур кто-то выдернул...

Вобщем жить с этим конечно можно, но только очень аккуратным/педантичным людям :)

Исключения упрощают труд программиста.

1. В случае однотипной обработки ошибки:
вместо
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 boolean  error=false;
 int  valueA = fooA();
 if  (valueA !=- 1 ) {
     int  valueB = fooB(valueA)
     if  (valueB!=- 1 ) {
         if  (fooC(valueB)=- 1 ) {
            error = true;
        }
    }  else  {
        error = true;
    }
}  else  {
   error = true;
}
 if  (error) {
   Sout("Sorry, чё-то не так :( ");
}
Sout("Bye!");
получаем
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 try { 
   fooC(fooB(fooA()));
}  catch (FooException fe) { //вместо возврата "-1" кидается FooException
   LOGGER.warn("sorry, ошибочка вышла...", fe); //как тут поступить 
   //зависит от конкретной логики реализуемой методами foo...
}  finally  {
   Sout("Bye!");
}

2. Исключения предоставляют УНИФИЦИРОВАННЫЙ механизм доставки инфрмации об исключительных ситуациях. Эта информация влючает в себя место возникновения, причину ошибки и любую другую полезную информацию для человека-отдачика и существенно упрощает исправление ошибок.

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

Это были общие положения. Если перейти к системе исключений в java, то мы увидим что существует три разновидности исключений:

- Error extends Throwable
- Exception extends Throwable
- RuntimeException extends Exception

Первый класс включает ОШИБКИ относящиеся к среде исполнения в целом, например, OutOfMemoryError, VirtualMachineError, StackOverflowError, ConfigurationError.
Это ошибки, игнорирование которых приводит к НЕПРЕДСКАЗУЕМЫМ последствиям. Как будет работать колеченная VM никто не знает :) Если их ловят, то главным образом затем, чтобы выполнить необходимые завершающие действия и переслать выше по стеку, но никак не для того, чтобы перепрятать в консоль или лог файл (кроме тех редких случаев, когда действительно ясно, что нужно сделать чтобы исправить ситуацию).

RuntimeException (unchecked exceptions) - тоже используется для обозначения ОШИБОК, но уже ошибок программых. Их возникновение не нарушает работу среды исполнения.
В отличии от NoClassDefFoundError, после NullPointerException работать вполне себе можно :) Однако это ОШИБКА. Толи программист не правильно использует какой-то код (пытается читать поток после закрытия, засунуть null в качестве аргумента метода и т.д.), толи другой программист написал кривой метод, потому что тоже чего-то забыл или не учёл (толи звёзды так сошлись).

А вот Exception (checked exceptions) - это уже не ошибка. Это "Особая Ситуация, Которая Требует Обработки".
Например, СlassNotFoundException - это вполне ожидаемый результат попытки загрузить класс по имени, IOException - логично, что чтение из потока может прерватся по какой-то причине.
Заметьте, их возникновение не является следствием ошибки программиста (в отличии от ClassCastException, рантайм эксепшина который может возникнуть если я вдруг решу, что некий Object это ни что иное как MyBestObject и влеплю в код каст), ошибкой становится их игнорирование программистом (путём вставки пустых catch'eй, неоправдованное прокидывания в родителя (особенно обернув его перед этим в рантаймэкспешин(!)) и т.п.)
Если в думаться, то Exception это дополнительное значение возвращаемое методом, и как любое возвращаемое значение оно должно быть объявлено. Именно для этого используется директива throws - объявляет, что одним из возвращаемых значений метода является некий Exception.

И всё казалось бы хорошо, но возникает вопрос: а кто будет обрабатывать RuntimeException'ы?

Код - это не просто последовательность операторов. Он состоит из, своего рода, узловых точек, отделяющих операции предметной области (или просто осмысленные действия), такие, что ошибка в одной "операции" не должна отменить следующую за ней. Вот в этих точках и следует ловить ОШИБКИ, как минимум для того, что бы занести их в логи и позволить следующим операциям корректно выполниться.

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


Писать "общие рецепты" дело неблагодарное, но куда деваться... надеюсь я вызился достаточно однозначно :)



... На уровне базового окна есть метод refresh(), вызываемый по кнопке "обновить данные", ну и соответственно в зависимости от движка - в одном случае грозит SQLException, в другом - допустим, BIBeansException, итп. ...

В данном случае напрашивается добавление создание
класса RefreshFailedException extends Exception и
объявление его в методе refresh().
Код вызывающий метод refresh уже сам должен решить, что делать с этой ошибкой. Точнее програмист, который его пришет :)


Захотели? Ну извините, значит садимся и снова прописываем все исключения refresh-а во все места этой бизнес-функции. Получаем полный идиотизм: функция движка A возвращает исключение, относящееся к движку B, потому что оно может быть результатом refresh-а.
...
Код: plaintext
 public   void  refresh()  throws  Exception
...


Cогласитесь, разница с RefreshFailedException велика :) На полном серьёзе.

На счёт желания проигнорировать обработку исключения переслав его выше по стеку, если на самом деле его можно обработать в точке получения, полностью согласен - это bad practice, который "легко делается".
Но влюбом случае такой поступок не хуже, чем окно с сообщением и последующим завершением программы. Для меня.



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

Конечно лучше, но использование того что "хуже", вовсе не причина писать таком же уровне :)



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

Вот оно как...
Осталось только разобраться в чём причина: в архитектуре Swing или руках разработчика, который не правильно его приготовил :)
Хотя согласен, было бы приятно, если бы готовка заключалась в простом подогреве :)

Можно сказать? Можно сказать, что недешевая рабочая сила хорошо напишет и без throws. Для нее это - необходимость писать дополнительные слова и ничего больше. Для дешевой рабочей силы, судя по процитированному, это тоже не подходит.
Ну, осталось решить вопрос, какая из недешёвых рабочих сил дешевле: та, что умеет без throws или та, что умеет со throws и которой очень тяжело получается без него? %)

Но лучше не решать, а посмотреть как оно на практике получится :)

Так зачем же оно нужно?
Чтобы был мир во всём мире :)

Исключения не идеал, но и говорить что в них нет ничего хорошего тоже нельзя.

Ситуация, как с использованием наследования в ооп. Вроде бы и просто всё, но нужно много раз подумать прежде, чем делать. Причём думать нужно на этапе проектирования приложения %)
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33372383
Ewg_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вот еще вопрос,
насколько просто в java реализовать раскраску строк/ячеек грида (табличка со скроллом), в зависимости от находящихся в них значений ?
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33372410
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NotGonnaGetUs
3. поскольку не всегда возможно разрешить "особую" ситуацию в месте её возникновения (решение может зависить от контекста в котором вызвается метод, внтури которого возникает эта ситуация), почти каждый метод ОБЯЗАН иметь код возврата(!). Если следовать этому принципу, то согласно п.1. сколько-нибудь сложный код станет вообще не подъёмный, если не следовать - это приведёт к сокрытию причин ошибок.


По-видимому код ядра юникса не относится к сколько-нибудь сложному коду, неподъемен и сокрывает причины ошибок. Собственно код можно посмотреть, скачав исходники БСД. Что-то мне в жаба-мире не встречалоь ничего близкого по стабильности к юниксу. Хотя по теории, конечно, все должно быть наоборот, никто же не спорит.

Я общался с несколькими людьми, пытавшимися переписывать реальный код с обработки кодов возврата на ексепшины. Они отмечали тот необъяснимый факт, что несмотря на все их старания и всю эту красивую теорию, количество кода не уменьшается и читаемость соответсвенно тоже не улучшается. Я тоже с этим сталкивался, но они к этому подошли более капитально. Подчеркиваю: в реальных программах, которые специально основательно переписывались.



Что касается приведенного примера, то тут кое-кому следует либо сначала подучить матчасть, либо воздерживаться от категорических заявлений по предмету, в котором слабо разбирается. Тот же код может выглядеть, например, примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
{
int a,b;
if ((- 1 ==(a=fooA())) || (- 1 ==(b=fooB(a)) || (- 1 ==fooC(b))) 
  Sout("Sorry, чё-то не так :( ");
else 
  Sout("Bye!");
}

А если fooX(y) будет начинаться со строчки: if(y<0) return y; (а мы помним, что в жабе тоже " вместо возврата "-1" кидается FooException "),
то код становится еще проще:
Код: plaintext
1.
2.
3.
4.
{
if (- 1 ==fooС(fooB(fooA()))) Sout("Sorry, чё-то не так :( ");
else Sout("Bye!");
}

И почему это хуже чем
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
try{ 
   fooC(fooB(fooA()));
} catch(FooException fe) { //вместо возврата "-1" кидается FooException
   LOGGER.warn("sorry, ошибочка вышла...", fe); //как тут поступить 
   //зависит от конкретной логики реализуемой методами foo...
} finally {
   Sout("Bye!");
}
?
По-моему как минимум не хуже.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33373593
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
код возврата хуже в концептуальном плане.
Функция должна возвращать полезное значение. Но если что-то пошло не так, то возвращятся недолжно ничего. А должно происходить исключение.

Но это все в красивой теории, на практике же, все зависит от того уровня, на который программист захочет(и ему позволят обстоятельства) опустится в проработке алгоритмов.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33373717
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ewg_а вот еще вопрос,
насколько просто в java реализовать раскраску строк/ячеек грида (табличка со скроллом), в зависимости от находящихся в них значений ?

Вроде просто. Пример можно посмотреть в ${JAVA_HOME}/demo/jfc/TableExample/src/TableExample4.java
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33373847
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ewg_а вот еще вопрос,
насколько просто в java реализовать раскраску строк/ячеек грида (табличка со скроллом), в зависимости от находящихся в них значений ?

ФОрум по java в другом месте.
Задавай такие вопросы там.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33374054
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
c127
По-видимому код ядра юникс ... мне в жаба-мире не встречалоь ничего близкого по стабильности к юниксу. Хотя по теории, конечно, все должно быть наоборот, никто же не спорит.


Ну и что? Точно также существует прекрасно читаемый код написанный с кучей GOTO. Разве этот факт означает, что с goto проще и легче писать хороший код? Это значит только то, что человек способен учиться на своём и чужом опыте, вырабатывая "паттерны" эффективного поведения. В том числе эвристики как потрогать goto, что бы оно при этом не воняло :) Нужно только задуматься - а сколько же времени на это обучение уходит?

Аналогично с кодами возврата. Я чёрным по белому писал выше:
NotGonnaGetUs
жить с этим[кодами возврата] конечно можно, но только очень аккуратным/педантичным людям


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

c128
Я общался с несколькими людьми, пытавшимися переписывать реальный код с обработки кодов возврата на ексепшины. Они отмечали тот необъяснимый факт, что несмотря на все их старания и всю эту красивую теорию, количество кода не уменьшается и читаемость соответсвенно тоже не улучшается. Я тоже с этим сталкивался, но они к этому подошли более капитально. Подчеркиваю: в реальных программах, которые специально основательно переписывались.


Архитектура приложения зависит, в том числе, и из методов обработки ошибок. Если код просто "переписывался", то такой результат в полне объясним. Очень странно пытаться применять старые приёмы в работе с новыми технологиями...

Кстати, чтобы переписывать работающий код должны быть веские причины... какие были в ваших случаях? :)

c129
Что касается приведенного примера, то тут кое-кому следует либо сначала подучить матчасть, либо воздерживаться от категорических заявлений по предмету, в котором слабо разбирается. Тот же код может выглядеть, например, примерно так:


Не разобрался c тонкими намёками: кому нужно подучить матчасть? :)

c130
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
{
int a,b;
if ((- 1 ==(a=fooA())) || (- 1 ==(b=fooB(a)) || (- 1 ==fooC(b))) 
  Sout("Sorry, чё-то не так :( ");
else 
  Sout("Bye!");
}


Это называется пример легко читаемого кода? Я хотел написать с начала именно такую конструкцию, но потом подумал, что если я так поступлю, мне скажут, что я спецаильно всё усложняю %)

c131
Код: plaintext
1.
2.
3.
4.
{
if (- 1 ==fooС(fooB(fooA()))) Sout("Sorry, чё-то не так :( ");
else Sout("Bye!");
}

И почему это хуже чем
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
try{ 
   fooC(fooB(fooA()));
} catch(FooException fe) { 
   LOGGER.warn("sorry, ошибочка вышла...", fe);
} finally {
   Sout("Bye!");
}
?
По-моему как минимум не хуже.

А теперь двайте разберёмся.

Почему fooC вернул -1?
варианты:
- ошибка в методе А
- ошибка в методе В
- ошибка в методе С
- входные данные для метода А не верны (от куда-то же он берёт значение)
- входные данные для метода В не верны
- входные данные для метода С не верны
- произвольная комбинация выше перечисленного...

В случае же FooException мы получаем точное место, где произошла ошибка.
Глянув на нужную строчку кода мы увидим, что было не так:
толи проверка аргументов не прошла, толи какое-то из допущений в коде fooX() оказалось не верно; а главное мы будем знать в каком из этих трёх методов возникло исключение.

Собственно вы предложили недостающую иллюстрацию к тезису:
NotGonnaGetUs
Если следовать этому принципу, то согласно п.1. сколько-нибудь сложный код станет вообще не подъёмный, если не следовать - это приведёт к сокрытию причин ошибок.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33374223
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ewg_насколько просто в java реализовать раскраску строк/ячеек грида (табличка со скроллом), в зависимости от находящихся в них значений ?
В джаве табличка со скроллом как Маркс и Энгельс - не муж и жена, а четыре разных человека :) У меня в частности есть скриншот, где заголовок таблицы разъехался с его колонками.

Терпимо просто. Если говорить о простой раскраске - посложнее чем в дельфе, если о сложной - может быть что и попроще.

Если говорить о таблицах, в java не так-то просто запихнуть в них данные :) И меня в свое время совершенно убил случай, когда мне потребовалось сделать табличку без скролла, и только от этого в ней исчезли заголовки :) Это, кстати, задокументированное поведение класса.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33374266
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUs
Хм. Осилил. К сожалению, меня несколько огорчило то, что начав издалека, Вы в итоге ответили совсем не на заданный вопрос, суть которого - в следующей процитированной фразе.

NotGonnaGetUsИсключения не идеал, но и говорить что в них нет ничего хорошего тоже нельзя.
Хм. Боюсь, что Вы неосознанно применили очень некрасивый подход - приписали мне (или тому, кому отвечали) не высказанную им и объективно идиотскую точку зрения, после чего с большим или меньшим успехом опровергли ее.

Думаю, Вы не сумеете отыскать место, где я бы говорил "в исключениях нет ничего хорошего" либо нечто подобное. Как факт - я сделал и использовал подобный механизм примерно в 90-91 годах; если не ошибаюсь, это было до того, как они появились в дельфе и других доступных компиляторах. Я высказал мнение о том, что реализация исключений в джаве далека от идеала, и мне очень интересна логическая цепочка, по которой Вы вывели из этого "в них нет ничего хорошего".

... На уровне базового окна есть метод refresh(), вызываемый по кнопке "обновить данные", ну и соответственно в зависимости от движка - в одном случае грозит SQLException, в другом - допустим, BIBeansException, итп. ...
В данном случае напрашивается добавление создание класса RefreshFailedException extends Exception и объявление его в методе refresh().
Угу. И потребуется упаковка в него SQLException, BIBeansException и прочих, которые от RefreshFailedException никак не унаследуешь. Потом, в коде обработки ошибок, потребуется "выпаковать" произошедшее исключение обратно, чтобы обработать его так же, как и "обычный", допустим, SQLException. Для этого потребуется одно из двух - либо та или иная форма switch/instanceof, либо повторно возбудить это исключение, дабы потом "честно" его поймать.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33374753
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerУгу. И потребуется упаковка в него SQLException, BIBeansException и прочих, которые от RefreshFailedException никак не унаследуешь. Потом, в коде обработки ошибок, потребуется "выпаковать" произошедшее исключение обратно, чтобы обработать его так же, как и "обычный", допустим, SQLException. Для этого потребуется одно из двух - либо та или иная форма switch/instanceof, либо повторно возбудить это исключение, дабы потом "честно" его поймать.

А зачем упаковывать-распаковывать исключения? Разве это не противоречит такому принципу ООП, как инкапсуляция? Вы написали метод рефреш и, в то же время, хотите так сделать, чтобы вызывающие методы знали о деталях реализации рефреша?!

Мне кажется, что это не совсем правильное решение. Разве не было бы лучше для всех, если бы метод рефреша работал сам-по себе, выбрасывая только исключеия связанные с рефрешом, но ни в коей мере не связанные с реализацией этого рефреша?
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33374803
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NotGonnaGetUs
Ну и что? Точно также существует прекрасно читаемый код написанный с кучей GOTO. Разве этот факт означает, что с goto проще и легче писать хороший код?


Это означает, что в Ваших высказываниях имеют место противоречия. То Вы обещали непременно либо нечитаемый либо плохо работающий код (" Если следовать этому принципу, то согласно п.1. сколько-нибудь сложный код станет вообще не подъёмный, если не следовать - это приведёт к сокрытию причин ошибок. "), то оказывается что это не страшно, код может быть хорошим и читаемым, просто нужно быть аккуратным:
NotGonnaGetUs
жить с этим[кодами возврата] конечно можно, но только очень аккуратным/педантичным людям
....
Точно также существует прекрасно читаемый код написанный с кучей GOTO


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

NotGonnaGetUs
Если вы считаете, что код ядра юниха писался дилетантами, способными без напряжения извилин креативить коды возврата и прочии хитросплетения операторов, то я так не думаю.


Я вроде такого нигде не говорил о дилетантах. А что, у Вас есть примеры хорошего джава-кода (или любого другого), написаного дилетантами?

Напряжение извилин нужно при чтении любого кода. Вы привыкли к ексепшинам, Вам кажется что их читать легко, а мне их читать не очень легко. Я привык к кодам возврата, мне с инми разбираться легче.

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

NotGonnaGetUs
Если бы такие программисты могли бы обеспечить все потребности индустрии, то этот разговор просто никогда не возник бы.


От плохих программ пользы все равно мало. Лучше иметь мало хороших, чем много плохих.

Не все определяется соображениями оптимальности программирования, часто делаются неоправданные действия, есть же еще маркетинг. Например появление C# с точки зрения технологий ИМХО неоправдано, чистый маркетинг.

NotGonnaGetUs
Архитектура приложения зависит, в том числе, и из методов обработки ошибок. Если код просто "переписывался", то такой результат в полне объясним. Очень странно пытаться применять старые приёмы в работе с новыми технологиями...

Я же специально написал, что код переписывался основательно .
NotGonnaGetUs
Кстати, чтобы переписывать работающий код должны быть веские причины... какие были в ваших случаях? :)

Пытались улучшить код, считали что получится короче и понятнее и что станет легче расширять программы.
NotGonnaGetUs
Не разобрался c тонкими намёками: кому нужно подучить матчасть? :)

Это Ваши проблемы.
NotGonnaGetUs
Почему fooC вернул -1?

Не знаю. У Вас он вернул -1 и у меня он вернул -1. Задача была построить код эквивалентный Вашему. Она решена.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33374805
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkSquid
#2062348


Что-то фигня какая-то... Пост с номером 2062348 можно смело игнорировать.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33374812
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
c127Эксепшины красивая и вроде бы правильная концепция, но на практике почему-то не работает так как ожидалось. Не знаю почему.
Не знаю, как в Java, а вот в Delphi и WatcomSQL замечательно работает. И наоборот - отсутствие в PB исключений (за вычетом работы с EAServer) иногда очень даже напрягает и превращает код в сплошные ветвления, особенно когда в ходе ошибки в любом операторе необходимо выполнить определенную последовательность действий перед выходом из процедуры по ошибке. Простейший пример - сохранение множества DW в пределах одной транзакции:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
IF dw_1.Update() =  1  THEN
  IF dw_2.Update() =  1  THEN
    IF dw_3.Update() =  1  THEN
      COMMIT;
      IF SQLCA.SQLCode =  0  THEN
        RETURN
      END IF;
    END IF
   END IF
END IF
ROLLBACK;
при поддержке исключений в методах update было бы гораздо читабельней как это выглядело бы на Delphi:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
TRY
  dw_1.Update()
  dw_2.Update()
  dw_3.Update()
  COMMIT;
EXCEPT
  ON Exception DO
    ROLLBACK;
    RAISE;
END;
По моему второй код гораздо читабельней первого и понятнее по логиге. Тоже самое можно привести в сравнение ASA WatcomSQL и MSSQL TSQL. У первого сервера можно на блок операторов повесить исключение и в одном месте обработать ошибку. У второго сервера после каждого оператора приходится монотонно писать IF @@ERROR <> 0. Так что насчет исключения я полностью не согласен
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33375001
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer NotGonnaGetUs
Хм. Осилил. К сожалению, меня несколько огорчило то, что начав издалека, Вы в итоге ответили совсем не на заданный вопрос, суть которого - в следующей процитированной фразе.

NotGonnaGetUsИсключения не идеал, но и говорить что в них нет ничего хорошего тоже нельзя.


Тоже - хм %)

Отвечал я на следующее:

Хм. В первую очередь, я не понял, что Вы имели в виду, и чтобы не задавать кучу поясняющих вопросов, попросил бы Вас переформулировать максимально однозначно , в частности выделив: цель exception-ов или директивы throws, оповещение или принуждение, оповещение кого....



softwarer
Думаю, Вы не сумеете отыскать место, где я бы говорил "в исключениях нет ничего хорошего" либо нечто подобное.

Каюсь, слегка заигрался в словах.

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


softwarer
NGGU
В данном случае напрашивается добавление создание класса RefreshFailedException extends Exception и объявление его в методе refresh().
Угу. И потребуется упаковка в него SQLException, BIBeansException и прочих, которые от RefreshFailedException никак не унаследуешь.


Нет, не так. SQLException, BIBeansException и т.д. - это просто cause для refreshFailed.
Например,
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
    public   void  refresh()  throws  RefreshFailedException {
         try  { 
             doSqlRefresh();
        }  catch (SQLException se) {
             doRepairOperation();
              throw   new  RefreshFailedException("Всё умерло.", se);
        }
   }

softwarerПотом, в коде обработки ошибок, потребуется "выпаковать" произошедшее исключение обратно, чтобы обработать его так же, как и "обычный", допустим, SQLException.
Не понял, зачем его нужно "выпаковывать"? Почему нельзя обойтись обработкой в методе refresh или добавлением в класс RefreshFailedException полей с необходимой информацией для обработчика этого исключения?
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33375053
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По порядку...

c127То Вы обещали непременно либо нечитаемый либо плохо работающий код (" Если следовать этому принципу, то согласно п.1. сколько-нибудь сложный код станет вообще не подъёмный, если не следовать - это приведёт к сокрытию причин ошибок. "), ...

Вы сами подтвердили этот тезис своим примером. Ваш код - скрывает причины ошибок.

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


Да, нужно быть аккуратным, нужно тратить массу времени на то, чтобы разрешать сложности перечисленные под пунктами 1-2-3 в посте выше, вместо того, чтобы тратить свою аккуратность на описание собственно логики приложения.

Вы приводили в пример код ядра бсд, который вылизан огромным количеством людей, и содержащий оттого чертовски мало ошибок.

Конечно, код в котором НЕТ ошибок не страдает от того, что их СКРЫВАЮТ.

Однако время затрачиваемое на устранение ошибок в ещё "не вылизаном" продукте существенно уменьшается при использовании технологии исключений, поскольку меньше времени уходит на выявление причин ошибок.
А экономия времени, в свою очередь, даёт конкурентное преимущество на рынке, для которого предназначен данный продукт.

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

Как следствие открывается ниша для "так себе программистов" и новые технологии служат для компенсации понижения "общего скила".
Пусть это кому-то и не нравится, но в нашем идотском мире решение остаётся за деньгами, поэтому армия формоклпателей будет жить на тех пор, пока их работа приносит реальную прибыль (отчего-то никто не пытается сэкономить кучу денег посадив 125 программистов за ассемблер, чтобы сделать GUI к БД столовой N5).

Одним словом, ситуация такова: "мастер якимыч сделал топором матрёшку за день", а "пьяный васька настрогал 100 матрёшек на станке за пол дня". Привсём не уважении к ваське и любви к якимычу, нельзя не признать, что матрёшки ваське делать проще и экономически выгоднее :)


c127
NotGonnaGetUs
жить с этим[кодами возврата] конечно можно, но только очень аккуратным/педантичным людям
....
Точно также существует прекрасно читаемый код написанный с кучей GOTO


А неаккуратных программистов вообще не бывает.

Угу, вопрос в том, кто на что тратить свою аккуратность и прочии умения.
Всё тот же якимыч и васька.


c127 В джаве создается впечатление, что можно программировать неаккуратно ... Особенно плохо когда на это покупаются при обучении. По этой причине относительное количество хороших программ на С по-моему больше чем на джаве.
Домохозяйки за уши к программированию на С не притягиваются.


Это отдельный вопрос, к исключениям отношения не имеющий, но всё равно интересный.

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

Но причём тут домохозяйки и С ?!
Всё, что верно при программировании на С, верно и при программировании на ассме, басике, паскале, джаве - только на практике приходится помимо трудностей "алгоритмических" вникать в трудности языка.
А кому нужны лишнии трудности? Грузинскому комсомолу?



c127
Я вроде такого нигде не говорил о дилетантах. А что, у Вас есть примеры хорошего джава-кода (или любого другого), написаного дилетантами?

Вот и я про тоже. Код ядра писали далеко не дилетанты, но есть уйма задач (которые рождает рынок), где можно использовать "уже не дилетантов, но ещё не профи (или уже никогда не профи? :))".

c127
Эксепшины красивая и вроде бы правильная концепция, но на практике почему-то не работает так как ожидалось. Не знаю почему.

Может быть сила привычки?

c127
От плохих программ пользы все равно мало. Лучше иметь мало хороших, чем много плохих.

Не все определяется соображениями оптимальности программирования, часто делаются неоправданные действия, есть же еще маркетинг. Например появление C# с точки зрения технологий ИМХО неоправдано, чистый маркетинг.

Если звезды зажигают, значит это кому-нибудь нужно? (с)по телевизору было.

Маркетинг... У C# есть очень агрессивные стронники, главным образом среди людей, которые достаточно долго писали на С++. Это получается жертвы рекламы? :)


c127
NotGonnaGetUs
Почему fooC вернул -1?

Не знаю. У Вас он вернул -1 и у меня он вернул -1. Задача была построить код эквивалентный Вашему. Она решена.
У меня было два *не* эквивалентых примера один с исключениями, другой без. Пример с кодами возврата и в вашем, и в моём варианте одинаково хорошо демонстрирует его не достатки перед кодом с исключениями, для которого вы не привели эквивалентна...
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33375099
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkSquidА зачем упаковывать-распаковывать исключения?
Затем, что иначе вряд ли удастся совместить предложенный метод с возвратом RefreshFailedException и то, что нужно получить в итоге.

DarkSquidРазве это не противоречит такому принципу ООП, как инкапсуляция? Вы написали метод рефреш и, в то же время, хотите так сделать, чтобы вызывающие методы знали о деталях реализации рефреша?!
Нет, я - не хочу. И, кстати, у refresh нет никаких "деталей реализации", это тривиальнейший брокер. И если бы не throws, не имел бы никаких проблем с реализацией этого нежелания. Так - приходится решать через throws Exception.

DarkSquidМне кажется, что это не совсем правильное решение. Разве не было бы лучше для всех, если бы метод рефреша работал сам-по себе, выбрасывая только исключеия связанные с рефрешом, но ни в коей мере не связанные с реализацией этого рефреша?
Для всех было бы лучше, если бы метод вообще не выбрасывал никаких исключений. Я в данном случае говорю про все исключения, без искусственного деления на группы.

Увы, это недостижимая идиллия. Этот метод может не отработать, причем список причин, по которым он может не отработать - будет пополняться со временем. Следовательно, у меня три выхода:

Выбрасывать эти исключения дальше

Выбрасывать эти исключения завернутыми в оболочку типа RefreshFailedException (частный вариант - выбрасывать его, теряя оригинальное исключение)

Писать их локальную обработку.

Последний вариант в данном случае отпадает потому, что ничего умного там не напишешь. Все, что можно было бы написать, должно быть написано в методе refresh соответствующего движка; если уж оттуда что-то выпало, локальные действия никакого эффекта не дадут. Из оставшихся двух imho надо выбирать по ситуации; мне удобнее первый.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33375109
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUsВесь текст был нацелен только на опровержения вашего утверждения о том, что дериктива Throws бесполезна и только заставляет тратить время впустую.
Так я и прошу отделять директиву throws от остальных деталей исключений в джаве и от концепции исключений вообще.

Исключения - замечательная штука. Исключения в джаве - можно выдвинуть какие-то претензии, но в целом даже "исключения вместе с throws" принципиально лучше, чем отсутствие оных. Что касается throws - это некий зачаток контрактного программирования, от которого лично я (пока что) не вижу пользы и вижу некоторые неудобства.

Нет, не так. SQLException, BIBeansException и т.д. - это просто cause для refreshFailed.
Именно это я и назвал "упаковать". Вся функция RefreshFailedException - транспортная; туннелинг - донести тот же SQLException до того, кто согласится его обработать.

Не понял, зачем его нужно "выпаковывать"? Почему нельзя обойтись обработкой в методе refresh или добавлением в класс RefreshFailedException полей с необходимой информацией для обработчика этого исключения?
Обработкой на месте - потому что вся обработка на месте, которая может быть сделана, должна быть сделана внутри того, что Вы в своем примере назвали doSqlRefresh(). Если уж этот метод выбрасывает исключение - значит, на месте ничего сделать нельзя.

Что касается "полей с необходимой информацией" - возникают сразу два возражения. Первое: это потеря информации. Получается, что метод refresh() начинает предполагать что-то о тех, кто его вызывает, о том, какие поля внешнему обработчику ошибок понадобятся, а какие - нет. Imho это просто принципиально идеологически криво. Это означает следующее: доработанный sql-движок научился возвращать дополнительную информацию, менеджер ошибок умеет ее обработать - а не сходится из-за того, что какой-то плюгавый местечковый refresh() слишком много о себе возомнил. Это нарушает принцип модульности, то, что сейчас называется инкапсуляцией. Второе: это тривиально менее удобно. Одно дело, в обработчике ошибок я пишу:

Код: plaintext
1.
2.
3.
4.
5.
6.
 catch  (SQLException e) {
  errorManager.processSqlException (e);}
 catch  (RefreshFailedException e) {
   if  (e.causeIsSqlException()) 
    errorManager.processSqlException (e.getSqlException());
  ...
}

Другое дело - там же я судорожно начинаю писать код, который в случае SQLException выдернет из него нужные поля (которые могут быть или не быть в зависимости от класса наследника SQLException) и передаст их на обработку в код, который по наличию или отсутствию значений в этих полях начнет гадать о том, каким же именно был класс ошибки.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33375264
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ASCRUS
Не знаю, как в Java, а вот в Delphi и WatcomSQL замечательно работает.


Не знаю как в джаве, а вот в С++ бывают большие проблемы при многопоточном программировании, особенно на всяких ВыньЦЕ устройствах. Приходится возвращаться к классике и использовать коды возврата.

ASCRUS
И наоборот - отсутствие в PB исключений (за вычетом работы с EAServer) иногда очень даже напрягает и превращает код в сплошные ветвления, особенно когда в ходе ошибки в любом операторе необходимо выполнить определенную последовательность действий перед выходом из процедуры по ошибке.


С этим я согласен, иногда ексепшины удобны, но очень иногда, а в среднем никакого существенного выигныша ИМХО нет. При программировании СКЛ серверов вполне хватает транзакций, необходимости в ексепшинах нет вообще, единственное что остается полезным от ексепшина это вызов ошибки в сохраненке оператором типа trow.




NotGonnaGetUs
Вы сами подтвердили этот тезис своим примером. Ваш код - скрывает причины ошибок.


Не нашим примером, а Вашим примером. Вы его придумали, реализовали на С, я только показал, как его можно упростить. Если бы Ваш код не скрывал ошибок, то мой бы тоже не скрывал. Нет ничего сложного в том, чтобы вернуть не просто -1, а -2, -3, ... в зависимости от ошибки.

NotGonnaGetUs
Да, нужно быть аккуратным, нужно тратить массу времени на то, чтобы разрешать сложности перечисленные под пунктами 1-2-3 в посте выше, вместо того, чтобы тратить свою аккуратность на описание собственно логики приложения.


Еще раз повторяю: при неаккуратном программировании Вы не тратите время на логику приложения, Вы все равно тратите время на борьбу со своей неаккуратностью (а не на логику), только в других местах программы. А услилий столько же.

Классический пример аналогичной ошибки. При возрождении объектно-ориентированного программирования в конце 80-х (С++) его сторонники говорили примерно следующее: объектно-ориентированная концепция сильно облегчает программирование и уменьшает количество проблем, ТОЛЬКО НУЖНО БОЛЬШЕ ВРЕМЕНИ ТРАТИТЬ НА ПРОДУМЫВАНИЕ ПРОГРАММЫ. Т.е. насколько сильно облегчает еще неизвестно, но уже нужно больше продумывать. И учить С++ намного сложнее чем С. Вот и получается что проблемы перетащили из одного места в другое и возможно добавили новых. Говорю сразу, что я не противник ОО в принципе, и сам считаю что программу нужно хорошо продумывать, но использование этих преимуществ не такое простое дело, это отдельная сложная задача.

То что Вы говорите аналогично, результаты неаккуратности остаются, просто сказываются в другом месте и еще неизвестно где их легче выловить и исправить.

NotGonnaGetUs
Вы приводили в пример код ядра бсд, который вылизан огромным количеством людей, и содержащий оттого чертовски мало ошибок.


На самом деле там не так много людей. К тому же они этот код постоянно изменяют, поэтому это не тот же код, который был 5-10 лет назад, так что тех разработчиков уже можно не учитывать.

NotGonnaGetUs
Конечно, код в котором НЕТ ошибок не страдает от того, что их СКРЫВАЮТ.


Насколько я понимаю ексепшины к ошибкам отношеня программирования практически не имеют, это обработка исключительных ситуаций. БСД я вспомнил чтоб в ответ на Ваше утверждение, что без ексепшинов код получится либо ненадежным, либо нечитаемым. А БСД надежна и читаема, хотя написана на С.

NotGonnaGetUs
Однако время затрачиваемое на устранение ошибок в ещё "не вылизаном" продукте существенно уменьшается при использовании технологии исключений, поскольку меньше времени уходит на выявление причин ошибок.


Тут я вообще не согласен. Устойчивые ошибки элементарно локализуются и другими средствами, а неустойчивые Вы не локализуете и с ексепшинами. Эксепшины теоретически облегчают обработку ошибок программы, данных (т.е. исключительных ситуаций), а не ошибок программиста при программировании.

NotGonnaGetUs
Ещё раз: если бы программистов не далающих ошибок хватало - не было бы этого обсуждения. Но рынок требует больше рабочик рук:


С каких это пор? Пару лет назад этих рук вроде был избыток, да и сейчас тоже избыток, причем в основном неопытных кодеров. Народ работал за 12 долларов в час, и еще не мог устроиться. Столько получает продавец на кассе.

Не нужно столько программистов на рынке.

NotGonnaGetUs
Пусть это кому-то и не нравится, но в нашем идотском мире решение остаётся за деньгами, поэтому армия формоклпателей будет жить на тех пор, пока их работа приносит реальную прибыль (отчего-то никто не пытается сэкономить кучу денег посадив 125 программистов за ассемблер, чтобы сделать GUI к БД столовой N5).


Асемблер это совсем другое дело, это машинно зависимый язык. А ГУЙ пишут и на С, например гном написан на сишной библиотеке GTK.

NotGonnaGetUs
Но причём тут домохозяйки и С ?!
Всё, что верно при программировании на С, верно и при программировании на ассме, басике, паскале, джаве - только на практике приходится помимо трудностей "алгоритмических" вникать в трудности языка.
А кому нужны лишнии трудности? Грузинскому комсомолу?


Формально C горадо проще С++ и джавы, так что вникать нужно меньше. Но сложнее паскаля. Посмотрите БНФ. Но дело не в простоте, а в отношении. Я согласен с Вами, что настоящее программирование от языка не зависит. Но реально сложилась такая ситуация, что для бейсика, иногда джавы посчитали возможным готовить неопытных программистов. Это потому, что КАЖЕТСЯ, что система простая, поэтому за 3 недели можно подготовить человека и он будет рисовать окошки и что-то там еще. Но потом оказывается, что с этими окошками, созданными таким программистом, столько мороки, что дешевле было бы их сразу заказать нормальному человеку. Одно спасение, если проект умрет, то об этих окошках никто не вспомнит. Так в основном и случается, кстати.

С в таком ключе никто не продвигал, пик его популярности пришелся на время, когда мысль о домохозяйках в программировании никому не могла прийти в голову.

NotGonnaGetUs
Вот и я про тоже. Код ядра писали далеко не дилетанты, но есть уйма задач (которые рождает рынок), где можно использовать "уже не дилетантов, но ещё не профи (или уже никогда не профи? :))".


Не согласен, я бы с дилетантами не связывался никогда ни при каких условиях, но это к делу не относится. Но дилетант и ескепшины так запутает, что три профессионала не разберутся. Немного утрирую.

NotGonnaGetUs
Может быть сила привычки?


Если бы только у меня, а то же у всех. В чужом С++ коде разбираться гораздо сложнее чем в чужом С коде. Опять же, не знаю почему, эмпирический факт. Одна радость, если внутрь лезть не нужно, но это редкость. И что интересно, знатоки С++ тоже боятся лазить в чужом С++ коде, хотя это не афишируют, и хорошо читаемые ексепшины не сильно помогают.

NotGonnaGetUs
c127
От плохих программ пользы все равно мало. Лучше иметь мало хороших, чем много плохих.

Не все определяется соображениями оптимальности программирования, часто делаются неоправданные действия, есть же еще маркетинг. Например появление C# с точки зрения технологий ИМХО неоправдано, чистый маркетинг.

Если звезды зажигают, значит это кому-нибудь нужно? (с)по телевизору было.


Это Маяковский, школьная программа, 10 класс, не помню откуда именно, лень искать.

Кстати совершенно неверно, если исходить из тогдашней (1920-1930 годы) официальной доктрины, вообще материалистической, то это никому не нужно.

NotGonnaGetUs
Маркетинг... У C# есть очень агрессивные стронники, главным образом среди людей, которые достаточно долго писали на С++. Это получается жертвы рекламы? :)


Не встречал таких. По моим наблюдениям опытные С++-сники его как раз сильно ругают, особенно те, которым приходится с ним работать.

NotGonnaGetUs
У меня было два *не* эквивалентых примера один с исключениями, другой без. Пример с кодами возврата и в вашем, и в моём варианте одинаково хорошо демонстрирует его не достатки перед кодом с исключениями, для которого вы не привели эквивалентна...

Еще раз: мой сишный пример эквивалентен Вашему. Я исходил из того, что Вы смогли построить сишный код, эквивалентный Вашему же джава коду. Если Вы построили неэквивалентные примеры на джаве и на С, то о чем мы тогда говорим вообще? Постройте эквивалентные, я попробую упростить сишный код, мы его сравним с джавой и посмотрим что окажется проще и понятнее.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33375411
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Глупо обсуждать код, структура которого не ясна, но всё-таки...

softwarer
Обработкой на месте - потому что вся обработка на месте, которая может быть сделана, должна быть сделана внутри того, что Вы в своем примере назвали doSqlRefresh(). Если уж этот метод выбрасывает исключение - значит, на месте ничего сделать нельзя.

Почему? Это может быть метод doSqlUpdate() или ещё какая-нибудь бредятина, смысловая нагрузка которого (refresh) возникает только в контексте вызвывающего метода. Следовательно корректно обработать SQLExpection из этого метода можно только в методе refresh(), но никак не в doSqlХХХ().



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

Любой метод, который хоть что-нибудь возвращает, не может не "предполагать что-то о тех, кто его вызывает" и что им потребуется.
Дополнительные методы в классах Exception просто детализируют описание ошибки.


Это означает следующее: доработанный sql-движок научился возвращать дополнительную информацию, менеджер ошибок умеет ее обработать - а не сходится из-за того, что какой-то плюгавый местечковый refresh() слишком много о себе возомнил. Это нарушает принцип модульности, то, что сейчас называется инкапсуляцией.


Во-первых, если дорабатоли sql-движок и менеджер ошибок, то почему не нужно доработать refresh()?

Во-вторых, если я правильно понимаю, то менеджер ошибок не делает ничего кроме регистрации ошибок. Какая тогда разница, будет вставлен вызов к нему в методе refresh или из метода рефреш будет выкинут SQLException, котоырй будет обработан тем же самым менеджером?

Более того, тут я согласен с DarkSquid, прокидывание SQLException и т.п. как раз таки и есть нарушение инкапсуляции, т.к. выводит на ружу внтуреннее устройсто метода refresh.


Второе: это тривиально менее удобно. Одно дело, в обработчике ошибок я пишу:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
//полагаю try был таким :)
 try {
   refresh();
}
 catch  (SQLException e) 
{
  errorManager.processSqlException (e); 
}
 catch  (RefreshFailedException e) 
{
   if  (e.causeIsSqlException()) 
    errorManager.processSqlException (e.getSqlException());
  ...
}


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
 public   void  refresh()  throws  RefreshFailedException {
     try  { ... }  catch (SQLException se) {
           errorManager.processSqlException (e); 
            throw   new  RefreshFailedException();        
    }
}

...somewhere...

 try {
   refresh();
}
 catch  (RefreshFailedException e) 
{ 
  /*
    во-первых логику 
    if (e.causeIsSqlException()) 
      errorManager.processSqlException (e.getSqlException());
    
    легко перенести в 
       errorManager.processRefreshFailedException(e);

    во-вторых, тут должна быть выполнена отмена текущей операции и   
    вывод информации о том, что она не состоялась или другое действие в 
    зависимости от конекста, в котором вызывается метод...
  */
  GUITools.showErrorMessage("У нас всё поломалось, если вера в вас сильна -  нажмите кнопку ещё раз, но попозже.", 
  e /* для показа детальной информации */);
   return ;
}
...

Единственная причина, которую я могу придумать, почему у вас выкидывалось по несколько исключений разных типов - это не обходимость разных восстановительных действий после "сбоя".
Но эти действия должны быть описаны там же где и реализация refresh (возможно в методе repair определённом в том же интерфейсе, что и refresh), иначе получается самое настоящее "спаггети" вместо года...


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

Когда мы создаём RefreshFailedException, мы указываем в качестве cause SQLException, если обработчику (и разработчику :)) не достаточно простого стек трейса, куда сам SQLException выведет всё, что знает, то можно добавить в класс RefreshFailedException дополнительную информацию. Зачем дублировать то, что и так известно (копировать данный из объекта SQLException в RefreshFailedException) - мне не ясно.

Может быть всё упирается в самописный фреймворк для работы с ошибками? Тогда, возможно, стоит посмотреть на архитектуры таких штук как log4j, чтобы понять, как можно жить по-другому :)
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33375454
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
c127
Не нашим примером, а Вашим примером. Вы его придумали, реализовали на С, я только показал, как его можно упростить. Если бы Ваш код не скрывал ошибок, то мой бы тоже не скрывал. Нет ничего сложного в том, чтобы вернуть не просто -1, а -2, -3, ... в зависимости от ошибки.
...
Постройте эквивалентные, я попробую упростить сишный код, мы его сравним с джавой и посмотрим что окажется проще и понятнее.


Неужели я так путанно выражаюсь?

Имеем пример с кодом возврата:
Код: plaintext
1.
2.
3.
4.
5.
6.
 if  (- 1  == fooC(fooB(fooA()))) {
     sout("Где-то ошибка!!!");
}  else  {
  /* ... код, который будет выполняться в случае успеха fooC(B(A())); ... */
}
sout("пока!");

Имеем пример с FooException
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 try {
  fooC(fooB(fooA()));
  /* ... код, который будет выполняться в случае успеха fooC(B(A())); ... */
}  catch (FooException fe){
  LOGGER.error("Ошибка тут, а не где-то!", fe);
}  finally  { //хочу быть уверенным, что все увидят эту надпись...
  sout("пока!");
}

В коде с исключением мы имеем значительно больше информации об ошибке.
Например, чтобы выяснить в каком именно методе возникла ошибка используя коды возврата нам придётся написать что-то вроде такого:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 int  value = fooA();
 if  (- 1 ==value) {
    sout("Ошибка в A");
}   else  {
   value = fooB();
    if  (- 1 ==value) {
        sout("Ошибка в B");
   }   else  {
        value = fooC();
         if  (- 1 ==value) {
              sout("Ошибка в C");
        }  else  {
              /* ... код, который будет выполняться в случае успеха fooC(B(A())); ... */
        }
   }
}
sout("пока!");

Но ведь FooException несёт информацию не только о методе в каком возникла ошибка, но и о строчке внутри метода, и т.д.
И говорить, что эта информация "бесползена", можно только если считать, что ошибок в приложении нет. В противном случае, существенно облегчается их нахождение (но не исправление :)).

с127
NotGonnaGetUs
Да, нужно быть аккуратным, нужно тратить массу времени на то, чтобы разрешать сложности перечисленные под пунктами 1-2-3 в посте выше, вместо того, чтобы тратить свою аккуратность на описание собственно логики приложения.


Еще раз повторяю: при неаккуратном программировании Вы не тратите время на логику приложения, Вы все равно тратите время на борьбу со своей неаккуратностью (а не на логику), только в других местах программы. А услилий столько же.

А у меня про неаккуратность ничего не написано, только про аккуратность.
Если взять двух "одинаково" аккуратных людей и одного заставить писать код с кодами возврата, а другого с эксепшинами, у второго останется больше "аккуратности" на написание кода, чем у первого :)


c127
Классический пример аналогичной ошибки. При возрождении объектно-ориентированного программирования в конце 80-х (С++) его сторонники говорили примерно следующее:

А кто в данном случае ошибался: тот кто НЕ ДУМАЛ, но писал, или тот кто говорил, что НУЖНО ПОДУМАТЬ и станет здорово? Имхо, первый.

c127
... но использование этих преимуществ не такое простое дело, это отдельная сложная задача.

Согласен. Поэтому в процессах разработки ПО фигурируют такие роли архитектор, старший программист и кодировщик. При разумной организации процесса разработки на программиста не возложат решение задач, для которых он ещё не готов.


c127
Насколько я понимаю ексепшины к ошибкам отношеня программирования практически не имеют, это обработка исключительных ситуаций.

Вполне возможно, что в С++ это и так. Но java не С++.

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

Остальные классы - RuntimeException и Error - служат именно для информирования об ошибках программирования и ошибок среды исполнения.

c127
Тут я вообще не согласен. Устойчивые ошибки элементарно локализуются и другими средствами, а неустойчивые Вы не локализуете и с ексепшинами. Эксепшины теоретически облегчают обработку ошибок программы, данных (т.е. исключительных ситуаций), а не ошибок программиста при программировании.


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

Код в 4000 классов, больше полсотни разработчиков часть из которых буржуи, т.е. код постоянно эволюционирует.
Приходит багрепорт с описанием ошибки. Какими другими средствами можно быстро найти точку позникновения ошибки, выявить причину и приступить к устранению? Информация из стек трейса + ремоут дебаг приложения = от 10 минут до часа в сложных случаях.


Народ работал за 12 долларов в час, и еще не мог устроиться. Столько получает продавец на кассе.

Не нужно столько программистов на рынке.

Спрос рождает предложение. Если бы программисты были не нужны, их бы столько не было.

Работодатель хочет платить меньше => меньше получать готов менее работник => нужны способы сделать работу таких сотрудников эффективнее => появляются технлогии и т.д.

Грустно. Но не идти же, как англичане когда-то, крушить станки?


c127
Если бы только у меня, а то же у всех. В чужом С++ коде разбираться гораздо сложнее чем в чужом С коде. Опять же, не знаю почему, эмпирический факт. Одна радость, если внутрь лезть не нужно, но это редкость. И что интересно, знатоки С++ тоже боятся лазить в чужом С++ коде, хотя это не афишируют, и хорошо читаемые ексепшины не сильно помогают.

За то разбираться в чужом java коде одно удовольствие :) Тоже утрирую.
БНФ может быть простой, но симантическая нагрузка поверх синтаксической может быть очень большой.

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

Если вы говорите, что были неудачи при переписывании кода (плохо читаемый, большой) - значит они были.
Вы полагаете причина в самих эксепшинах, я полагаю использование не эффективных приёмов работы с ними - без примеров злосчастного кода получается "имхо vs имхо". А потому каждый остаётся при своём :)


c127
Не встречал таких. По моим наблюдениям опытные С++-сники его как раз сильно ругают, особенно те, которым приходится с ним работать.

На форуме rsdn встречается некто Vlad2D сменивший ориентацию с C# на С++. Из его уст звучат достаточно убедительные доводы в пользу #.
Если интересно почитайте. Но это всё offtop.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33375867
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUs
На форуме rsdn встречается некто Vlad2D сменивший ориентацию с C# на С++. Из его уст звучат достаточно убедительные доводы в пользу #.
Если интересно почитайте. Но это всё offtop.
Еще один офтоп - читать этого некто я бы рекомендовал только тем, кто разбирается в предмете обсуждения. В моем присутствии он однажды участвовал в беседе, видимо на стыке того что знает, того что видел и того что не видел, и в результате перемежал интересные вещи откровенным бредом.

Если же говорить о доводах в пользу C#, известных мне (от людей, заслуживающих доверия) то они пожалуй скорее относятся к конкуренции с Delphi/Java, чем с C++.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33377838
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NotGonnaGetUs
Неужели я так путанно выражаюсь?


Нет, вполне нормально. Просто сначала Вы привели пример на С и пример на джаве для сравнения, насколько ексепшины упрощают код. А потом сказали, что эти примеры, оказывается, не эквивалентны. В таком случае их нельзя сравнивать, зачем же их было вообще приводить.
NotGonnaGetUs
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 int  value = fooA();
 if  (- 1 ==value) {
    sout("Ошибка в A");
}   else  {
   value = fooB();
    if  (- 1 ==value) {
        sout("Ошибка в B");
   }   else  {
        value = fooC();
         if  (- 1 ==value) {
              sout("Ошибка в C");
        }  else  {
              /* ... код, который будет выполняться в случае успеха fooC(B(A())); ... */
        }
   }
}
sout("пока!");


Но ведь можно и так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 int  value = fooС(fooB(fooA()));
 switch  (value) {
 case  ERROR_A:
.....
 case  ERROR_B:
...


 default :
  sout("пока!");
}
А функции fooX(y) начинать со строчки: if(y<0) return y;
Т.е. одна строчка, if(y<0) return y в функциях и switch. switch длинный, но это уже обработка ошибок, распечатка результатов, в примере на джаве этого тоже нет.

Этот метод в стандартнорм исполнении не позволяет достоверно определить в какой функции произошла ошибка, но если коды ошибок достаточно подробны, то локализаця ошибки не проблема. А если коды привязать к функциям, то тогда он позволяет определить и функцию, хотя так обычно не делают.

NotGonnaGetUs
Но ведь FooException несёт информацию не только о методе в каком возникла ошибка, но и о строчке внутри метода, и т.д.
И говорить, что эта информация "бесползена", можно только если считать, что ошибок в приложении нет. В противном случае, существенно облегчается их нахождение (но не исправление :)).


Это в джаве он несет информацию о строчке и пр., а в С++ такой информации нет, там же машинные коды. В джаве это возможно, поскольку это п-код со всей сопутсвующей информацией и выполняется в виртуальной машине, которая код компилирует. Хотя если извернуться, то и в С++ тоже можно это все впихнуть в екзешник, но этого никто не делает.

Я не говорю, что исключения совершенно бесполезны, я говорю что на практике программы с исключениями получаются В СРЕДНЕМ не проще и не более читаемые, чем с кодами возврата. По моим наблюдениям.

NotGonnaGetUs
c127
Насколько я понимаю ексепшины к ошибкам отношеня программирования практически не имеют, это обработка исключительных ситуаций.

Вполне возможно, что в С++ это и так. Но java не С++.

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

Остальные классы - RuntimeException и Error - служат именно для информирования об ошибках программирования и ошибок среды исполнения.


Да, я понял о чем Вы. Согласен, действительно, в джаве ексепшины можно так использовать, в С++ это практически ничего не дает, там максимум можно вытащить стек в виде адресов функций, потом смотреть служебную информацию линкера или лазить дебаггером по екзешнику и искать эти функции по адресам, что обычно не самый экономный способ. А для джавы наверняка работает, не спорю.

NotGonnaGetUs
c127
Народ работал за 12 долларов в час, и еще не мог устроиться. Столько получает продавец на кассе.

Не нужно столько программистов на рынке.

Спрос рождает предложение. Если бы программисты были не нужны, их бы столько не было.


Так их столько и нет. Одни программисты работают по специальности, другие развозят пиццу, причем далеко не всегда вторые хуже первых. Вопрос в том, называем ли мы программистом человека, развозящего пиццу, если он в прошлом закончил курсы по программированию.

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


NotGonnaGetUs
Работодатель хочет платить меньше => меньше получать готов менее работник => нужны способы сделать работу таких сотрудников эффективнее => появляются технлогии и т.д.

Грустно. Но не идти же, как англичане когда-то, крушить станки?


Не все так плохо. Далеко не все используемые технологии являются самыми эффективными из возможных. Так что дурная работа присутствует и требует рабочих рук.


NotGonnaGetUs
За то разбираться в чужом java коде одно удовольствие :) Тоже утрирую.
БНФ может быть простой, но симантическая нагрузка поверх синтаксической может быть очень большой.


Согласен. Но сложность обучения языку можно оценить по БНФ-у. Сравните размер книги Кернигана-Ричи, которая является хорошийм учебником, с любым учебником по С++ или джаве.

Что касается семантики, то я недавно столкнулся с независимо построенными кодами на С и С++, решающими одну и ту же довольно сложную задачу. С++ код использовать было просто невозможно, я уж не говорю разобраться. Там вообще непонятно с какой стороны к нему подойти и как подключить к нашей задаче, хотя код работающий. Сишный код сумели использовать через пару часов изучения, разобраться в алгоритмах тоже в случае необходимости проблем бы не возникло. Наверное сишные программисты были грамотнее. Но так почему-то получается постоянно.

NotGonnaGetUs
Вы полагаете причина в самих эксепшинах, я полагаю использование не эффективных приёмов работы с ними - без примеров злосчастного кода получается "имхо vs имхо". А потому каждый остаётся при своём :)


Нет, причина конечно же не в эксепшинах, я же говорил, что идея вроде правильная и должна работать. Точно так же как и ООП, очевидно что должно экономить силы программистов, уменьшать количество кода, но на практике обычно (не всегда), получается наоборот.

NotGonnaGetUs
c127
Не встречал таких. По моим наблюдениям опытные С++-сники его как раз сильно ругают, особенно те, которым приходится с ним работать.

На форуме rsdn встречается некто Vlad2D сменивший ориентацию с C# на С++. Из его уст звучат достаточно убедительные доводы в пользу #.
Если интересно почитайте. Но это всё offtop.

Не сомневаюсь что есть такие, которые добровольно забросили С++ и предпочитают использовать С#, но я лично их не встречал. К тому же я не такой знаток С++, чтоб оценить какие-то тонкости, в которых С# выигрывает. Вряд ли они окажутся для меня решающими, я из возможностей С++ использую процентов 20 и мне хватает с головой. Но вот некоторых нужных мне вещей в C# нет, например кроссплатформенности. Поэтому переходить на С# я не собираюсь и даже не смотрю в его сторону.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33378123
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
c127Наверное сишные программисты были грамотнее. Но так почему-то получается постоянно.
В хорошем случае - именно так. Си как язык мне весьма нравится, но с моей точки зрения его сгубила (с точки зрения качества, а не коммерческого успеха) мода на него, благодаря которой с начала девяностых (у нас) на него валили орды пионеров. Потом и еще большие орды валили на C++.

Насчет картины дел на западе не уверен, но не так давно был прикол: человек в форуме спросил "как перевести вот этот фрагмент C-кода на дельфи". Я показал ему, причем мой вариант был заметно короче оригинала, и намного более "сишным" (по подходу к кодированию), чем оригинал.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33380288
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer c127Наверное сишные программисты были грамотнее. Но так почему-то получается постоянно.
В хорошем случае - именно так. Си как язык мне весьма нравится, но с моей точки зрения его сгубила (с точки зрения качества, а не коммерческого успеха) мода на него, благодаря которой с начала девяностых (у нас) на него валили орды пионеров. Потом и еще большие орды валили на C++.

Согласен. Но все-таки С еще жив и неплохо себя чувствует, ИМХО его спасло то, что толпы потенциально опасных для него пионеров в основном пронеслись мимо и увалилили на С++, а С задели только самым краем. А вот С++ -у досталось по полной.

Может будет интересно посмотреть С++ подобный язык, компилируемый, со всеми наворотами в виде объектов, темплетов, но по-моему гораздо более удобный чем С++:
http://www.digitalmars.com/d
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33381642
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
c127
Cпасибо за ссылку. На досуге посмотрю поподробнее; comparision with others, к сожалению, не очень порадовал.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33382004
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрел ссылку по D
Автор таблицы сравнений сильно приврал в пользу D и принизил остальные языки.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33382855
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WorobjoffПосмотрел ссылку по D
Автор таблицы сравнений сильно приврал в пользу D и принизил остальные языки.

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

А например?


Тут дискуссия по D, может тоже кому интересно
http://gzip.rsdn.ru/Forum/Message.aspx?mid=1152810&all=1

На всякий случай: я в дискуссии не участвовал, D почти не знаю и всерьез не исползовал. Есть пара простых программок, в принципе очень понравилось, но в тонкости не вникал.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33384077
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
c127В таблице везде где "реализуется в библиотеке классов" стоит плюс для D и минус для остальных языков.
А это - дискриминация!
И как это, то что реализовано в библиотеке framework, не присуще языку C#? Абсурд.
Нет множественного наследования. Какой же это D?
Это C--
(си минус-минус)
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33384425
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--C
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33384432
Tov. Drujba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Множественное наследование - признак неправильного проектирования и вообще творение дьявола. Нет и хорошо.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33384455
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Множественное наследование - признак неправильного проектирования и вообще творение дьявола. Нет и хорошо.Не все так думают.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33384596
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WorobjoffЭто C--
(си минус-минус)

Это не C--. С-- это совсем другой язык

...
Рейтинг: 0 / 0
Delphi vs Java2
    #33384785
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tov. DrujbaМножественное наследование - признак неправильного проектирования и вообще творение дьявола. Нет и хорошо.
Это из серии "зелен виноград".
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33384818
Tov. Drujba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerЭто из серии "зелен виноград".
Приведите пример, когда множественное наследование единственно возможный или хотя бы лучший из возможных вариант для решения какой-либо задачи.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33384987
Фотография lisp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обратный пример:
в asm вообще нет наследования, но на нем можно решить любую задачу.
Все зависит от языка. Есть языки где наследование вообще не нужно.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33385084
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tov. Drujba softwarerЭто из серии "зелен виноград".
Приведите пример, когда множественное наследование единственно возможный или хотя бы лучший из возможных вариант для решения какой-либо задачи.
Ну в Джаве, например, без множественного наследования интерфейса не обходится ни одни серьезная программа.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33385189
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Ильич Tov. Drujba softwarerЭто из серии "зелен виноград".
Приведите пример, когда множественное наследование единственно возможный или хотя бы лучший из возможных вариант для решения какой-либо задачи.
Ну в Джаве, например, без множественного наследования интерфейса не обходится ни одни серьезная программа.
наследование класса != имплементация интерфейса
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33385209
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tov. DrujbaПриведите пример, когда множественное наследование единственно возможный
Как было справедливо указано, любую задачу можно решить вообще безо всякого наследования.

Tov. Drujba или хотя бы лучший из возможных вариант для решения какой-либо задачи.
Например, тривиальная иерархия элементов интерфейса. Типа

Component <= CheckBox, RadioGroup, Button
Button <= PressButton, ToolButton, MenuItem
ToolButton <= CheckToolButton, RadioGroupToolButton
MenuItem <= CheckMenuItem, RadioGroupMenuItem
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33385258
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timm Сергей Ильич Tov. Drujba softwarerЭто из серии "зелен виноград".
Приведите пример, когда множественное наследование единственно возможный или хотя бы лучший из возможных вариант для решения какой-либо задачи.
Ну в Джаве, например, без множественного наследования интерфейса не обходится ни одни серьезная программа.
наследование класса != имплементация интерфейса
На самом деле интерфейсы можно именно наследовать (extends), и наследовать именно множество.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33385278
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NaugНа самом деле интерфейсы можно именно наследовать (extends), и наследовать именно множество.
Это все же не столько наследование, сколько включение (include).

Интерфейсы же, решая свои задачи все же паллиатив именно там, где требуется наследование (наследование кода).

Кстати, попутный вопрос - реализовали ли в джаве возможность делегировать реализацию интерфейса? То есть если у меня есть класс A, реализующий интерфейс B, я создаю свой класс (C), делаю в нем поле класса A, и говорю, что класс C реализует интерфейс B, причем реализацию следует брать из A.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33385393
Tov. Drujba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Softwarer, понял Вас. Но на мой взгляд это не есть хорошо. Если начнем спорить - получится holy war. В данном вопросе (множественное наследование) даже классики расходятся. Поэтому пусть каждый решает для себя.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33385509
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Naug Timm Сергей Ильич Tov. Drujba softwarerЭто из серии "зелен виноград".
Приведите пример, когда множественное наследование единственно возможный или хотя бы лучший из возможных вариант для решения какой-либо задачи.
Ну в Джаве, например, без множественного наследования интерфейса не обходится ни одни серьезная программа.
наследование класса != имплементация интерфейса
На самом деле интерфейсы можно именно наследовать (extends), и наследовать именно множество.
я понял :-) да, так можно
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 public   interface  B
{
}
 public   interface  C
{
}
 public   interface  A  extends  B, C
{
}
это абсолютно логично. implements в этом случае выглядит просто бессмысленно.
Кстати, попутный вопрос - реализовали ли в джаве возможность делегировать реализацию интерфейса? То есть если у меня есть класс A, реализующий интерфейс B, я создаю свой класс (C), делаю в нем поле класса A, и говорю, что класс C реализует интерфейс B, причем реализацию следует брать из A.
не понял смысл. для чего это? abstract superclass по-моему должен помочь.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33385606
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Worobjoff c127В таблице везде где "реализуется в библиотеке классов" стоит плюс для D и минус для остальных языков.
А это - дискриминация!

Мир вообще несправедливая штука с точки зрения большей части населения планеты.

WorobjoffИ как это, то что реализовано в библиотеке framework, не присуще языку C#? Абсурд.


Но ведь по-существу автор прав, есть язык, есть библиотеки, это разные вещи. Можно спорить только о том, имеет ли смысл это различие подчеркивать, либо же оно практически неощутимо.


Worobjoff
Нет множественного наследования. Какой же это D?
Это C--
(си минус-минус)

Есть такое дело, нет его. Тут уже ответили, вопрос темный, я не специалист по ООП-у, ничего сказать не могу.

Зато там есть много чего другого.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33385637
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
предел вложения цитат уже достигнут
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33386421
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timm Кстати, попутный вопрос - реализовали ли в джаве возможность делегировать реализацию интерфейса?
не понял смысл. для чего это?
Это единственная возможность хоть как-то изобразить множественное наследование с помощью интерфейсов. Мы можем создать один класс и без тупого копирования кода использовать его для реализации нескольких интерфейсов в разных классах.

Timmabstract superclass по-моему должен помочь.
Чем? Допустим, я хочу добавить метод toXML() к классам BigDecimal, BigInteger, URL и JButton. Какой именно abstract superclass мне следует создать?
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33386478
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerЧем? Допустим, я хочу добавить метод toXML() к классам BigDecimal, BigInteger, URL и JButton. Какой именно abstract superclass мне следует создать?

И что, он со всеми типами одинаково работать будет что-ли? А чем тогда XML.toXML() хуже?
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33386510
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkSquidИ что, он со всеми типами одинаково работать будет что-ли?
Как раз нет. Обратите внимание на приведенный список классов - с BigDecimal и BigInteger он запросто может работать одинаково, а вот для JButton скорее всего потребуется отдельная реализация.

Разумеется, на уровне "методов в одну строку" разница невелика, но принцип вполне иллюстрируется. Без таких механизмов придется делать достаточно искусственную структуру либо таки копировать код.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33386515
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer Timm Кстати, попутный вопрос - реализовали ли в джаве возможность делегировать реализацию интерфейса?
не понял смысл. для чего это?
Это единственная возможность хоть как-то изобразить множественное наследование с помощью интерфейсов. Мы можем создать один класс и без тупого копирования кода использовать его для реализации нескольких интерфейсов в разных классах.

Timmabstract superclass по-моему должен помочь.
Чем? Допустим, я хочу добавить метод toXML() к классам BigDecimal, BigInteger, URL и JButton. Какой именно abstract superclass мне следует создать?
поточнее: как добавить? эти классы, в общем, принципиально отличны, и использование одной реализации метода toXML() для меня является загадкой.
какая может быть в этом методе логика, общая для всех выше перечисленных классов?

поможет, я думаю, adapter, wrapper, etc...
да, придется подписать. но не так уж и много.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33386562
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer DarkSquidИ что, он со всеми типами одинаково работать будет что-ли?
Как раз нет. Обратите внимание на приведенный список классов - с BigDecimal и BigInteger он запросто может работать одинаково, а вот для JButton скорее всего потребуется отдельная реализация.

Разумеется, на уровне "методов в одну строку" разница невелика, но принцип вполне иллюстрируется. Без таких механизмов придется делать достаточно искусственную структуру либо таки копировать код.
чем эта структура будет искусственной - я не понимаю...
можно сделать примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 public   interface  XMLizable
{
     public  Document toXML();
};

 public   abstract   class  XMLizableNumber  implements  XMLizable
{
     public  Document toXML()
    {
        //... дефолтная реализация преобразования число -> xml используя getNumberValue()
    }
     public   abstract  String getNumberValue();
    // этот метод переопределяем в классах XMLizableInt, XMLizableDecimal - и все
};
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33386691
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timmчем эта структура будет искусственной - я не понимаю...
"... либо копировать код". При такой структуре придется в каждом классе писать:

Код: plaintext
1.
2.
 public  Document toXML() {
   return  XMLizator.toXML ( this );
}

что, если интерфейс содержит десять-двадцать методов, начнет несколько напрягать.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33386768
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer Timmчем эта структура будет искусственной - я не понимаю...
"... либо копировать код". При такой структуре придется в каждом классе писать:

Код: plaintext
1.
2.
 public  Document toXML() {
   return  XMLizator.toXML ( this );
}

зачем???
вы не поняли меня: именно в этом методе должна быть логика преобразования сущностей типа "число" в Document. какая это будет логика - хрен знает. но факт: она будет использовать абстрактный(-ые) метод(ы), определенный(-е) в классе, расширяющем XMLizableNumber. и все.
если вы хотите сказать, что логика toXML в XMLizableNumber и XMLizableURL будет одинаковой... то для меня это выглядит просто нелогично. она может быть схожей, с этим я согласен. но в один прекрасный момент она может поменяться, причем кардинально. если уж очень хочется, чтобы в XMLizableURL использовалась логика toXML от XMLizableNumber - то, как я говорил выше, адаптер поможет. причем это будет не копирование кода. это будет дополнительный , весьма логичный код.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33386840
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timmзачем???
Для соответствия постановке задачи:

Код: plaintext
добавить метод toXML() к классам BigDecimal, BigInteger, URL и JButton.

Расшифрую: нужны классы MyBigDecimal, MyBigInteger, MyURL итп, обладающие интерфейсом XMLizable.

Timmвы не поняли меня:
Боюсь, Вы ошибаетесь. Я понял Вас; более того, Вы построили именно ту структуру классов, которая нужна для решения этой задачи. Остается сделать единственный шаг: сказать, что вот этот вот объект класса XMLizableNumber реализует интерфейс XMLizable в моем классе MyBigInteger. Если нет делегирования, придется писать тупые stub'ы типа приведенного выше.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33386923
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ок.
пойдем с другого конца :)
пример+небольшое описание семантики "делегирования реализации интерфейса" в Delphi можно? ну или ссылку (ничего внятного в гугле не нашел)...
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33386965
2 softwarer
прошу прощение за вторжение - маленькое замечание.

глупые стабы или нет - вопрос отчасти вкуса.
там где они однообразны - это действительно раздражает.
Но эта лишь малая часть проблемы. Настоящая проблема - требование стабильности интерфейса. Если сразу не додумал, а потом захотел добавить метод к объявлению интерфейса или поменять его сигнатуру - вот тут начинается настоящая проблема. В любом из вышеозначенных случаев.
Дописать или изменить реализацию требуется сразу во всех классах, реализующих интерфейс. В больших проектах это может быть физически неосуществимо за разумное время. А пока этой переписи/дозаписи не произойдет - проект не скомпилируется.

кстати, то, что Вы называете делегированием, на самом деле должно называться агрегированием, по смыслу вашего текста. По крайней мере так это назывется в COM
:)
Делегирование с "подкруткой", кстати, тоже может решить тему, в виде объявления внутреннего члена класса, ответственного за реализацию необходимого интерфейса, реализации этого интефейса в единственном классе, с последующей явной отдачей клиенту этого внутреннего члена публичным методом. Таким способом на языках "синтаксически" не поддерживающих COM-агрегирования (Visual Basic), может развязываться "интефейсный узел".


2Timm

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

Жесткость по отношению к изменениям, которую интерфейсы придают
проекту, необходимость внесения множественных изменений в код, заставляет
"сильно думать", прежде чем объявить тот или иной публичный интерфейс.
Тем самым ограничивая область его применения.
И уж совсем никак не связаны с повторным использованием кода реализации.

Тут и приходится придумывать Adapter-ы. Это, однако, "общепрограммисткий образец", который нет способа притянуть к разговору - кто кого лучше, и
Adapter, в данном случае, всего лишь способ заметания пыли под ковер.
Своеобразная попытка ограничения волны распространения измений в пректе.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33386984
jdev333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Ваша задача добавления метода к классам BigDecimal, BigInteger и даже 'Big*' (!!!) и т.д. может элегантно решиться с помощью AspectJ (использование аспектно-ориентированного программирования - просто объявляется что с данного момента все классы jaba.*.Big* являются наследниками интерфейса A (код самих классов не меняется))


Интересно, можно ли в Delphi добавить метод к классам 'Big*' ?
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33387016
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timmпример+небольшое описание семантики "делегирования реализации интерфейса" в Delphi можно?
Я, кстати, нигде не говорил, что в дельфе оно есть :)) Набросаю извращенный пример, просто чтобы коротко уместить возможности.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
 type 
   { Собственно интерфейс } 
  IInterface =  interface  
     procedure  Proc1 ;
     procedure  Proc2 ;
     procedure  Proc3 ;
   end  ;

   { Некая реализация интерфейса или его части } 
  TImplementator =  class  ( TSomeAncestor )
     procedure  Proc1 ;
   end  ;

   { Класс, который хочет воспользоваться реализацией } 
  TTarget =  class  ( TOtherAncestor, IInterface )
   private 
    FImplementator : TImplementator ;
     procedure  Proc2 ;
     procedure  OtherProc3 ;
   protected 
     {1} 
     property  Implementator : TImplementator 
             read FImplementator implements IInterface ;
     {2} 
     procedure  IInterface.Proc3 = OtherProc3 ;
   end  ;

...

 var  
  I : IInterface ;
 begin 
  I := TTarget.Create ;
  I.Proc1 ;  // благодаря (1) вызывается TImplementator.Proc1  
  I.Proc2 ;  // обычным образом вызывается TTarget.Proc2  
  I.Proc3 ;  // благодаря (2) вызывается TTarget.OtherProc3  
 end  ;

По сути, конечно, та же самая генерация stub-ов, но компилятор любезно берет ее на себя.

Интересно, когда Алекс таки сделает нормальную синтаксическую раскраску. Я ему показывал проблемы и кидал необходимый код еще год назад. Кстати, если здесь в комментариях внизу заменить круглые скобки на фигурные, будет еще один давным-давно сообщенный Алексу глюк форума :)
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33387063
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jdev333 Ваша задача добавления метода к классам BigDecimal, BigInteger и даже 'Big*' (!!!) и т.д. может элегантно решиться с помощью AspectJ (использование аспектно-ориентированного программирования - просто объявляется что с данного момента все классы jaba.*.Big* являются наследниками интерфейса A (код самих классов не меняется))
Угу. Я потихоньку делаю для себя компилятор, где запланирована похожая возможность. Правда, звездочек поддерживать не собираюсь.

Но задача собственно не в этом - меня не столь удручает необходимость явно унаследоваться, особенно в дельфе, где для этого не надо городить огород с файлами. Задача в том, чтобы можно было наследовать реализацию методов пользуясь обычным механизмом. Если названная технология это решает - спасибо, является определенным ответом на вопрос.

jdev333 Интересно, можно ли в Delphi добавить метод к классам 'Big*' ?
В дельфе или в дельфеподобных поделках? :)

Я бы сказал, в нормально компилируемых языках это не особо нужная возможность, поскольку не удастся нормально реализовать этот механизм для виртуальных методов. Для статических - sugar-ок, хотя иногда полезный. Например, в той же яве часто хочется поправить String или Vector.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33387123
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
глупыйглупыйглупые стабы или нет - вопрос отчасти вкуса.
Имхо, stub-ы - глупы по определению.

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

Например, в коде

Код: plaintext
1.
2.
   property  ... implements ISomeInterface ;
   procedure  SomeProcFromInterface ;

я в двух строках вижу всю необходимую информацию. В коде типа

Код: plaintext
1.
2.
3.
4.
 public   int  intfFunc1() { return  impl.intfFunc1();}
 public   double  intfFunc2 ( int  param) { return  impl.intfFunc2 (param);}
 public   void  intfFunc3() {}
 public  BigInteger intFunc4() { return  impl.intfFunc4();}

я эту "пикантную подробность" запросто могу элементарно не заметить.

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

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

глупыйглупыйкстати, то, что Вы называете делегированием, на самом деле должно называться агрегированием, по смыслу вашего текста. По крайней мере так это назывется в COM
Я не в курсе COM, но если создатели этой технологии решили переобозвать по-своему то, что в дельфе называлось делегированием.... Собственно, слововольности - известная претензия к MS, как с тем же кластером. После чего оказывается, что то ли у них есть то, чего на самом деле нет (тот же кластер), то ли оказывается, что они изобрели что-то новое (как здесь :)

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

Код: plaintext
 public   class  MyBigInteger  extends  BigInteger  implements  XMLizable

другое - когда есть

Код: plaintext
1.
2.
3.
 public   class  MyBigInteger  extends  BigInteger {
  
   public  XMLizable getXMLizator() { ...}
}
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33387211
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
глупыйглупый2 softwarer
прошу прощение за вторжение - маленькое замечание.

глупые стабы или нет - вопрос отчасти вкуса.
там где они однообразны - это действительно раздражает.
Но эта лишь малая часть проблемы. Настоящая проблема - требование стабильности интерфейса. Если сразу не додумал, а потом захотел добавить метод к объявлению интерфейса или поменять его сигнатуру - вот тут начинается настоящая проблема. В любом из вышеозначенных случаев.
Дописать или изменить реализацию требуется сразу во всех классах, реализующих интерфейс. В больших проектах это может быть физически неосуществимо за разумное время. А пока этой переписи/дозаписи не произойдет - проект не скомпилируется.

кстати, то, что Вы называете делегированием, на самом деле должно называться агрегированием, по смыслу вашего текста. По крайней мере так это назывется в COM
:)
Делегирование с "подкруткой", кстати, тоже может решить тему, в виде объявления внутреннего члена класса, ответственного за реализацию необходимого интерфейса, реализации этого интефейса в единственном классе, с последующей явной отдачей клиенту этого внутреннего члена публичным методом. Таким способом на языках "синтаксически" не поддерживающих COM-агрегирования (Visual Basic), может развязываться "интефейсный узел".


2Timm

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

Жесткость по отношению к изменениям, которую интерфейсы придают
проекту, необходимость внесения множественных изменений в код, заставляет
"сильно думать", прежде чем объявить тот или иной публичный интерфейс.
Тем самым ограничивая область его применения.
И уж совсем никак не связаны с повторным использованием кода реализации.

Тут и приходится придумывать Adapter-ы. Это, однако, "общепрограммисткий образец", который нет способа притянуть к разговору - кто кого лучше, и
Adapter, в данном случае, всего лишь способ заметания пыли под ковер.
Своеобразная попытка ограничения волны распространения измений в пректе.
1) использование интерфейсов в базовых классах.
это просто смешно. их можно (и нужно в соответствующих случаях) использовать где угодно, на любом уровне приложения.
2) "сильно думать" - а куда ж без этого?
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33387300
по части синтаксической выразительности до "пикантных подробностей" - согласен. Вообще-то среда разработки может помогать "перечислять" методы реализации, но это – детали, и, в целом - не сильно чего меняет.

по поводу агрегации.
Именно так называется в COM техника, смысл которой Вы изобразили в посте
< сегодня, 14:46 >


речь идет о том, что TTarget в своей виртуальной таблице методов напрямую размещает адреса функций (полностью или частично), принадлежащих классу TImplementator (если частично, то вперемежку с методами собственной реализации.
В MSDN есть статьи, как это делать на C++. Про Delphi z не знаю ничего, практически, а любимый мною Classic VB этого в своем синтаксисе точно не держит. Однако, описаны в тырнете и реализуемы искусственные конструкты, рождающие такого сорта объекты кодом. Правда, с ограничениями, и, строго говоря, как правило с нарушением COM-соглашений по доступности получения указателя любого «объявленного» интерфейса объекта от любого указателя на любой интерфейс этого объекта. Но тем не менее это технически возможно.
С учетом того, что Delphi автоматизацию поддерживает – подобного сорта техника кем-нибудь да была выписана для Delphi.

Это да, но это уже искусственный метод, разрушающий пользователю класса взгляд на этот класс, да и практически часто неудобный. Одно дело, когда у пользователя есть класс
Я бы сказал – что это «зависимо от ситуации». Какая такая целостность в использующем коде разрушается от того, что класс, вместо того, чтобы непосредственно на себе реализовывать всякие там Итератор, Компаратор и далее по фантазии, хранит в своих нутрях специально для этого предназначенный класс. В каких-то ситуациях – просто единственный экземпляр на проект. В любом случае это явный способ локализации «каскадно-интерфейсных проблем» и пресловутой модуляризации (повторного использования) кода. В данном случае – кода реализации. Ну не универсален и не в 100% случаев применим.
В общем, тут начинает напрашиваться шизофренический интерфейс с методом гетИтератор. Но большей частью это обходится.

ЗЫ
Еще раз извините за не планировавшееся вторжение. Как бы не моего глупого ума дело столь высокие полеты мысли.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33387397
2 Timm
базовых в данном случае не в смысле иерархии наследования, а в смысле "классов проектов любого уровня", так или иначе отображающих специфику проекта. Бизнес-классов - тоже вроде занятый термин.
Не знаю как назвать - пользовательских классов, используемых в универсальных утилитарных кодах проекта, как правило, в виде стандартных интерфейсов.

Как не назови - а тему повторного использования кода реализации они (интерфейсы) сами по себе не решают, потому что не предназначены для ее решения. По определению отсутствия реализации в базовом интерфейсном классе.
Плюс повторного применения кода, использующего интерфейсы (типа Итератор, Компаратор, Компарабле) для реализации универсального алгоритма (типа поиска элемента) всегда стоит против минуса множественного изменения кода в реализующих классах.
Хорошо, когда библиотеку писали, отлаживали и использовали 10-15 лет. Можно надеяться на устойчивость таких, выверенных временем и практикой интерфейсов.
Если же Вы творите интерфейсы для своего проекта сами, то они будут меняться вместе с Вами.
Не знаю, почему здесь не видно проблемы. Которая частично решается методом применения как раз не везде, а в специально отведенных для такой реализации классов. С последующим делегированием им во всех прочих("рабочих", "бизнес", "пользовательских" или любой удачно подобранное слово ) классах работы по представлению интерфейсов для утилитарного кода.

:)

ушел
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33387456
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
глупыйглупыйпо части синтаксической выразительности до "пикантных подробностей" - согласен. Вообще-то среда разработки может помогать "перечислять" методы реализации, но это – детали, и, в целом - не сильно чего меняет.
Имхо, лучше решать эту задачу языком, а не средой разработки. IDE же, предлагая инструменты для облегчения генерации тупого кода, потом для сворачивания тупого кода, в чем-то поощряет то, что лучше подавить в зародыше.

глупыйглупыйречь идет о том, что TTarget в своей виртуальной таблице методов напрямую размещает адреса функций (полностью или частично), принадлежащих классу TImplementator (если частично, то вперемежку с методами собственной реализации.
Честно говоря, я не задавался вопросом, как именно дельфа реализует описанный механизм, но подозреваю, что именно с помощью потайных stub-ов. Причина этого - в двух деталях, которые осложняют реализацию, особенно если не делать виртуальную таблицу методом конкретного объекта. Первая причина - в вызванный таким образом метод нужно передать корректный указатель Self/this (используемого объекта, а не TTarget). Вторая - в том, что используемый для делегации объект или интерфейс можно переприсвоить в любой момент времени, и придется отлавливать этот момент и на ходу менять виртуальную таблицу.

глупыйглупыйЯ бы сказал – что это «зависимо от ситуации». Какая такая целостность в использующем коде разрушается от того, что класс, вместо того, чтобы непосредственно на себе реализовывать всякие там Итератор, Компаратор и далее по фантазии, хранит в своих нутрях специально для этого предназначенный класс.
Никаких, если он "хранит в нутрях". Если же "отдает наружу методом" - согласен, зависит от; для итератора и подобных классов, которые могут существовать в разных вариантах в одном классе это удобно и естественно; отдавать же наружу ИксЭмЭлизатор вряд ли будет удобно и красиво.

В целом - мою формулировку, безусловно, следует поправить на "может разрушить".
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33390493
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
глупыйглупыйХорошо, когда библиотеку писали, отлаживали и использовали 10-15 лет. Можно надеяться на устойчивость таких, выверенных временем и практикой интерфейсов.
Если же Вы творите интерфейсы для своего проекта сами, то они будут меняться вместе с Вами.Очень даже согласен! Ведь Мартинами Фаулерами не рождаются. С первого самоучителя. А пока таким станешь...
Ну не странно ли?
Программисты VB чаще задумываются о качестве повторного использования кода.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33421059
gsi___
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Delphi перешла на net, которая суть - что-то вроде мелкософтовая java?
Delphi - net
JBuilder - java
а вы спорите...
Мне кажется время решило.
Сейчас - это противостояние net и java.

ps imho
1. Delphi imho очень многое взяло из java (pascal+идеи java = delphi)
2. Net - это неудача MS с Java.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33421095
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gsi___ps imho
1. Delphi imho очень многое взяло из java (pascal+идеи java = delphi)
2. Net - это неудача MS с Java.
ObjectPascal вообще то был взят с паскаля Вирта. Java была взята с Оберона Вирта. ObjectPascal - это язык + компоненты. Java и .NET - это платформа + язык + компоненты. Вы бы хоть историю ради интереса почитали, когда появилось Delphi и когда появилась Java, перед тем, как делать глубокомысленные выводы
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33421670
историк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще как ни странно если почитать историю -

Borland Delphi 1 в феврале 1995 появился
Жаба тоже где - то в начале 1995 вышла в свет (а как исследоательский проект - 94)

Хотя конечно вряд ли что-то с java брали при создании Delphi.

Object Pascal - вообще украденный trademark, ибо Object Pascal был у Apple еще до Багланда :-)
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33423310
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИсторикBorland Delphi 1 в феврале 1995 появился
Жаба тоже где - то в начале 1995 вышла в свет (а как исследоательский проект - 94)
Хм. А дельфу начали писать в феврале 95-го и тогда же завершили? Я не знаю точной даты начала этого проекта, но говорили о ней (до выхода) сколь помнится года полтора-два.

Хотя конечно вряд ли что-то с java брали при создании Delphi.
Если говорить про историю развития обоих проектов - наверняка на уровне подсмотренных относительно мелких идей найдется достаточно много, как и у любых параллельно развивающихся вещей. Из концептуальных вещей - лично я не назову какой-либо идеи, которая именно в Delphi & Java реализована "особенно похоже" - более похоже, чем в Delphi & что-нибудь другое либо Java & что-нибудь другое.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33423374
историк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гениалогию Delphi можно конечно возводить к Turbo Pascal 7.0 (или когда там объекты появились у Борланда, хотя в Delphi переделали всю объектную модель)
А Java восходит к проекту OAK, начат в 1991 году.

Но все-таки наверное Delphi делали в основном с оглядкой на C++. Imho.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33423443
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИсторикГениалогию Delphi можно конечно возводить к Turbo Pascal 7.0 (или когда там объекты появились у Борланда, хотя в Delphi переделали всю объектную модель)
Cкорее дополнили. Поскольку старая продолжает поддерживаться.

ИсторикНо все-таки наверное Delphi делали в основном с оглядкой на C++. Imho.
IMHO это очень странная и маловероятная версия.

"Похожей на C++" является старая объектная модель дельфы - та, которая существует начиная с пятого Turbo Pascal. Новая объектная модель - та, которая существует с Delphi 1.0 - собственно, отказывается от модели C++ как от древнего страшного сна :))

Если говорить о яве, ее объектная модель похожа на новую дельфовую концепцией объектов-указателей, но во всем остальном сделана максимально похожей на модель C++, со всеми ее недостатками и без ее преимуществ.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33423696
историк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объектная модель может и хороша, но базовые библиотеки в delphi - откровенно убогие.
В Java гораздо мощнее, ну а С++ STL - вообще шедевр инженерной мысли по сравнению с тем, что delphi предлагает в "стандартной поставке".

Можно конечно натаскать в Delphi всяких более или менее вменяемых компонентов и развести очередной зоопарк, но это все не то по сравнению со _стандартными_ инструментами
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33423808
gsi___
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ASCRUS
ObjectPascal вообще то был взят с паскаля Вирта. Java была взята с Оберона Вирта. ObjectPascal - это язык + компоненты. Java и .NET - это платформа + язык + компоненты. Вы бы хоть историю ради интереса почитали, когда появилось Delphi и когда появилась Java, перед тем, как делать глубокомысленные выводы
В принципе, я не совсем правильно сформулирвал мысль.
Я не могу сказать кто откудаи куда черпал идеи, но у меня сложилось такое чувство, когда мне пришлось написать модуль для delphi, уже после ухода на java. Т.е. сродни дежавю: "Где-то я это уже видел"! Но конкретно сказать что я сейчас не смогу..
Delphi, даже первые, как бы там ни было совсем не object pascal..
А что-то совместимое. Те, согласитесь, писать как на OP там никто не писал,
разве временно для перехода..
Потом, Delphi такая классная штучка.. В каждой новой версии, что-то новенькое почти совместимое со старой! Ну очень удобно!!!
Плюс система компонент. У нас на работе программеры до сих пор на 4 работают!.. Компоненты! Ах сколько в этом слове!..

Тут, кстати, можно сравнить программы написанные в 90-х годах..
Как их перенести из прошлого в наши дни.. На java и на Delphi..

ps
Вот, кстати, от delphi у меня сложилось впечатление, как от дешового вина:
вначале вкусно, но чем больше глотаешь, тем хуже, а потом вообще охото выплюнуть гадость.
У java наооборот. ;)
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33427379
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gsi___
Delphi, даже первые, как бы там ни было совсем не object pascal..
А что-то совместимое. Те, согласитесь, писать как на OP там никто не писал,
разве временно для перехода..
Вы сказали что-то очень странное. Пожалуй, интересно посмотреть, как можно ухитриться писать на дельфи не так, как на OP.

gsi___Вот, кстати, от delphi у меня сложилось впечатление, как от дешового вина: вначале вкусно, но чем больше глотаешь, тем хуже, а потом вообще охото выплюнуть гадость. У java наооборот. ;)
Вина я не употребляю, может быть поэтому и впечатления другие. В случае java - сначала гадость, чем больше работаешь, тем большая гадость оказывается.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33427402
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИсторикОбъектная модель может и хороша,
Хм. Простите, таки Вы историк или кто? Давайте придерживаться одной мысли и явно переключаться на другие. Такое впечатление, что вместо объективного анализа Вы пытаетесь доказать некую мысль сначала так, потом когда не вышло - этак, потом с третьей стороны..

Историк но базовые библиотеки в delphi - откровенно убогие.
Факт. Собственно, они и не были особо предназначены быть мощными - сообщество программистов сделает больше и лучше, нежели хорошая, но ограниченная команда борландеров.

Историк В Java гораздо мощнее,
Факт. И, к сожалению, гораздо дурнее и глюкавее - что тоже факт.

Историк ну а С++ STL - вообще шедевр инженерной мысли по сравнению с тем, что delphi предлагает в "стандартной поставке".
Да. И кстати обратите внимание, что "стандартным" он стал по факту, а разработан был абсолютно независимо. Всей разницы - борландеры не стали делать каких-то ритуалов.

Историк Можно конечно натаскать в Delphi всяких более или менее вменяемых компонентов и развести очередной зоопарк, но это все не то по сравнению со _стандартными_ инструментами
Если удержаться в рамках сравнения с явой, то первое, что в ней стоит сделать - развести зоопарк под названием "исправленные и более-менее нормально работащие наследники стандартных инструментов".
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33428654
историк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerХм. Простите, таки Вы историк или кто? Давайте придерживаться одной мысли и явно переключаться на другие. Такое впечатление, что вместо объективного анализа Вы пытаетесь доказать некую мысль сначала так, потом когда не вышло - этак, потом с третьей стороны..
Видимо, я - субъективный историк. Каюсь. У всех свои недостатки :-)

Но кстати, совсем не собирался хаять Delphi, да и другие средства (они пока что доказывают свою конкурентоспособность, даже столь не любимая Вами Java :-))

Мысль на самам деле хотел донести о том, что стандартный инструмент всегда лучше нестандартного. Здорово получилось с этой STL (и надеюсь так же будет и с Boost). И не повезло Delphi.
Как получилось, что в С++ такие вещи постепенно "врастают" в стандарт?
Тут что-то есть :-)
И в той же Java стандартные библиотеки "обрастают мускулами" в каждой версии.

Все-таки, согласитесь - если надо решить некую задачу - сначала смотрим на стандартные средства, а потом привлекаем сторонние.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33428884
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Историк(они пока что доказывают свою конкурентоспособность, даже столь не любимая Вами Java :-))
Я бы куда лучше относился к Java, если бы мне не приходилось на ней работать. Когда тратишь пару дней на поиск плавающей ошибки, а в итоге выясняется, что JButton.setAction реально работает как JButton.addAction (не затирает старый listener), начинаешь испытывать очень теплые и дружественные чувства к "стандартным инструментам".

ИсторикМысль на самам деле хотел донести о том, что стандартный инструмент всегда лучше нестандартного.
Только с маркетинговой точки зрения. В этой области, безусловно, борландеры очень слабы.

А насчет лучше... подойдите к ораклоидам и спросите, на чем лучше программировать клиентов под Oracle: на "стандартном" JDBC, на "стандартном" ADO, на "нестандартном" ODAC или на "нестандартном" DOA. Я вполне верю, что кто-то назовет один из первых двух вариантов, но почти уверен, что это будет человек, не видевший вторых.

ИсторикЗдорово получилось с этой STL (и надеюсь так же будет и с Boost).
Boost, кстати, хороший пример как раз на эту тему. Стандарт де-факто куда удачнее стандарта де-юре, поэтому незачем сравнивать эти понятия.

ИсторикИ не повезло Delphi.
Угу. Видимо, слишком многим людям нужно "шашечки", а не "ехать". Наверное, и boost кто-то не использует только потому, что "стандартные инструменты всегда лучше" :)

ИсторикКак получилось, что в С++ такие вещи постепенно "врастают" в стандарт?
Тут что-то есть :-)
И в той же Java стандартные библиотеки "обрастают мускулами" в каждой версии.
Угу. Если бы из стандартной библиотеки Java выкинуть AWT, выкинуть Swing и сделать вместо них что-то приличное, хотя бы на уровне визуальной части VCL, она стала бы куда симпатичнее :)

ИсторикВсе-таки, согласитесь - если надо решить некую задачу - сначала смотрим на стандартные средства, а потом привлекаем сторонние.
Если мы берем для работы инструмент, в котором ни фига не смыслим - наверное, так. В противном случае - берем хорошее и работающее.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33428950
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerКогда тратишь пару дней на поиск плавающей ошибки, а в итоге выясняется, что JButton.setAction реально работает как JButton.addAction (не затирает старый listener), начинаешь испытывать очень теплые и дружественные чувства к "стандартным инструментам".


И при чём тут Java? Это же в доке написано?
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33428997
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И где же, позвольте полюбопытствовать, там написано, что в результате кода

Код: plaintext
1.
2.
3.
4.
JButton btn =  new  JButton();
btn.setAction (aSomething1);
btn.setAction (aSomething2);
btn.setAction (aSomething3);

нажатие на btn будет вызывать срабатывание всех трех обработчиков разом? То, что эти идиоты запутались в собственных концепциях, и реализовали setAction через addActionListener, который не очищается следующим вызовом setAction, это, уж извините, в доке не написано, ну или я не умею читать.

P.S. У меня дома нет JDK, так что не могу точно сказать, в какой версии был этот эффект. Я исправил его точно до пятой; в четвертой или в третьей - не уверен.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33429004
историк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Boost войдет в стандартную библиотеку C++, надо верить :-)
Так же как шаблоны появились в Java. Это - развитие и мы его наблюдаем.

И только Delphi не "впитывает" в себя новое, только давая возможность использовать сторонние компоненты. В "развитии" Delphi впрочем есть оригинальная черта - несовместимость версий как сверху вниз, так и снизу вверх. Тут он революционен, ничего не скажешь :-)
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33429020
Фотография DarkSquid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerТо, что эти идиоты запутались в собственных концепциях, и реализовали setAction через addActionListener.....

Ну опечатались.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33429021
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИсторикВ "развитии" Delphi впрочем есть оригинальная черта - несовместимость версий как сверху вниз, так и снизу вверх.
Да, борландеры отличаются тем, что не лелеют ранее допущенные ошибки, а исправляют их. Это довольно приятно. Впрочем, несовместимость эта скорее теоретическая, чем практическая - я однажды замерил скорость перевода проекта с Delphi 2 на Delphi 5, получилось что-то порядка 150.000 строк в день.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33429046
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkSquidНу опечатались.
А тестировать, простите, будет Вася Пупкин?

Да и на самом деле не столько "опечатались", сколько "криво спроектировали реализацию". Там, сколь помнится, довольно сложный код, который можно было бы заменить на выбор примерно следующим:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
// 1.
 protected   void  mouseClick (MouseEvent e) {
  ...
   if  (action !=  null ) action.actionPerformed (event);
  ... вызов actionlistener-ов 
}

// 2.
 private  lsnrAction =  new  ActionListener() {
   public   void  actionPerformed (ActionEvent e) {
     if  (action !=  null ) action.actionPerformed (e);
  }};

 public  AbstractButton() {
  ...
  addActionListener (lsnrAction);
}

Первый подход лучше, так как не нужно заботиться, например, о варианте, когда программист взял у кнопки список listener-ов и пытается удалить action-овский с помощью removeActionListener либо пытается привести его к типу своего листенера и получает InvalidClassCast итп.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33467378
superclass
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чем? Допустим, я хочу добавить метод toXML() к классам BigDecimal, BigInteger, URL и JButton. Какой именно abstract superclass мне следует создать?Обычно в таких тяжелых случаях либо звонят «03», либо предлагают четать букварь.

Ибо, как уже сказали, И что, он со всеми типами одинаково работать будет что-ли? А чем тогда XML.toXML() хуже? если надо задекларировать общий метод, то его можно хоть в Object задекларировать, а если нужна реализация, то она в каждом из классов BigDecimal, BigInteger, URL и JButton будет своя и ее надо имплементировать ручками по-любому. И чем тут поможет какой-то abstract superclass ? Чем?
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33493121
Фотография grexhide
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа. Вот почитал это все, честно говоря, сильно задумался
о том, стоило ли так распостраняться о особенностях именно языков.

И Java и Delphi держат позиции благодаря не только языковым средствам, а
скорее благодаря наличию некий библиотек/фреймворков, которые и
есть суть ценность.
Ну и конечно же - сред разработчиков.

Может быть сравнить их? В общих чертах? А не методы отлова исключений?
И присущие этим фреймворкам стили и идеалогии разработки ?

К примеру - типовую связку

мощь, простоту и отточенность
DevExpress+ODAC|FIB+FastReports|Crystall Reports

против, к примеру

JSP|JSF|ADF Faces+EJB|Hibernate|ADF BC+Struts|???
и вот вебсервисы еще обсудить, к примеру.

Именно в сфере бизнес приложений?

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

Как по мне - так Java и пр. иже вместе с ними - это
огромные и неповоротливые монстры, затраты - на порядок
больше, про RAD и XP можно сразу забыть, только
RUP и прочие каскадоподобные методы.
Т.е. технология - совсем не массовая.
И не такая уж и надежная. Про ресурсоемкость -
тоже можно поговорить.

И про надежность сред, к примеру сред Delphi против
JBuilder, JDeveloper, IDEA?
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33495439
Дельф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
grexhideИ про надежность сред, к примеру сред Delphi против
JBuilder, JDeveloper, IDEA?Да-да, вот про Delphi хотелось бы услышать. Говорят, 2005-я падает постоянно, как подкошенная и жрет память, как лошадь воду. А IDEA наоборот, считается лучшей средой разработчика, даже лучше Delphi
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33497353
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
delphi и java я думаю нельзя сравнивать потому что это инструменты для разных задач

писать гуй на java имхо неэффективно
писать серверные приложения на дельфях имхо неэффективно

ну и т.д.

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

каждой задаче свой гаечный ключ

offtop
вот java с dotnet еще можно сравнивать но тоже с натяжкой
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33699128
chernolyas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-моему, Паскаль это уже пережиток прошлого ... Последний раз писал на нем на 4 курсе ВУЗа (1999 год). Да и вообще .... ездивший на мерседесе вряд ли без особой нужды седет за Запорожец!!!
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33699436
Фотография Михаил Михайлович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дельф grexhideИ про надежность сред, к примеру сред Delphi против
JBuilder, JDeveloper, IDEA?Да-да, вот про Delphi хотелось бы услышать. Говорят, 2005-я падает постоянно, как подкошенная и жрет память, как лошадь воду. А IDEA наоборот, считается лучшей средой разработчика, даже лучше Delphi

Не знаю как 2005-я (в ней тоже раюотать было невозможно) а 2006-я жрёт , скотина!
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33699441
Фотография Михаил Михайлович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chernolyasПо-моему, Паскаль это уже пережиток прошлого ... Последний раз писал на нем на 4 курсе ВУЗа (1999 год). Да и вообще .... ездивший на мерседесе вряд ли без особой нужды седет за Запорожец!!!

Последний раз когда я писал на сях было в старших классах школы и что теперь? Да, крутой универсальный языкЪ, но кормит меня не C++ а Object Pascal или как щас принято DELPHI. Больше того, сердце основного проекта так и осталось под пятёркой - Delphi5, 1999 :) . Хотя начинал проект не я.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33699575
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chernolyasПо-моему, Паскаль это уже пережиток прошлого ... Последний раз писал на нем на 4 курсе ВУЗа (1999 год). Да и вообще .... ездивший на мерседесе вряд ли без особой нужды седет за Запорожец!!!

Понеслась.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33699611
Сергей Фролов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sarin chernolyasПо-моему, Паскаль это уже пережиток прошлого ... Последний раз писал на нем на 4 курсе ВУЗа (1999 год). Да и вообще .... ездивший на мерседесе вряд ли без особой нужды седет за Запорожец!!!

Понеслась.

Ну почему же сразу "понеслась"? :)
По высказыванию человек как-то не похож на почти тридцатилетнего. Так что тут не все так просто :) :) :)
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33699788
Фотография grexhide
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Фролов
По высказыванию человек как-то не похож на почти тридцатилетнего. Так что тут не все так просто :) :) :)

некоторые и к 40-ка годам не выходят из состояния счастливого детства.
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33699805
Фотография Михаил Михайлович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grexhide Сергей Фролов
По высказыванию человек как-то не похож на почти тридцатилетнего. Так что тут не все так просто :) :) :)

некоторые и к 40-ка годам не выходят из состояния счастливого детства.


Это форум "Здрасте доктор?" :)
...
Рейтинг: 0 / 0
Delphi vs Java2
    #33699806
Сергей Фролов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Михаил МихайловичЭто форум "Здрасте доктор?" :)
Неа, "Прощай, здоровье!" :)
...
Рейтинг: 0 / 0
201 сообщений из 201, показаны все 9 страниц
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Delphi vs Java2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]