Crazy, вопрос!

Ямерт

The Old One
Crazy, вопрос!

Читая сейчас трэд про private functions в PHP , наткнулся на твоё утверждение:
Java must die. Но уже поздно. Вообще, Java сыграла в программировании ту же роль, что и инквизиция в истории человечества. Но это уже совсем другая история...
Можно ли услышать эту историю, мсье? :)
 

confguru

ExAdmin
Команда форума
Зануда
ты дату глядел?

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

Ямерт

The Old One
Да, дату видел.
Желания устраивать чат нету абсолютно :)
Если хошь, могу закрыть обсуждение.
 

Crazy

Developer
Ближе к вечеру будет время -- расскажу. :) Ибо я хорошо помню, почему так сказал и мое мнение пока не изменилось. :)
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Ваще-то я бы с большим удовольствием почитал эту тему, чем очередной флейм на тему "у миня ничево неработает!!!".

Выношу из корзины в оффтопик...
 

Crazy

Developer
Извиняюсь перед общественностью за задержку. :) Все переносится на сегодняшний вечер -- я написанный текст дома оставил. :D
 

Crazy

Developer
Вот и текст. Я не стал доводить его до красивого вида -- пусть будет таким, как я его вчера набросал. Даже перечитывать не стал из принципа. :)

Люблю:

1. Значительный шаг в сторону кроссплатформености, которую при программировании на Java значительно легче обеспечить, чем например, на C++.

2. J2EE.

3. Мне за платят за то, что я этим занимаюсь. :)

Ненавижу:

1. Агрессивным маркетингом были задавлены конкурирующие технологии, которые по техническим характеристикам превосходили Java. Так, в области создания applet'ов был плагин для Tcl, были разработки по использованию Forth. В области представления переносимого кода был задавлен Juice, идеи которого живут сейчас в хороших JIT'ах и даже с .NET.

2. Уродливость языка, полученного нелепым копированием C++ "чтобы программистам было" проще переучиваться. При этом наплевали на крайне полезные наработки других языков: контракты, документирование, пред- и постусловия, инварианты в Eiifel, шаблоны с C++ и Ada, множественная диспетчеризация a la CLOS или Sather, множественное наследования, которое сделано даже в надстройках над Java (Kiev, к примеру), полноценная раздельная компиляция (Ada, Modula-2,3), отсутствие которой, на мой взгляд, и объясняет многие уродства J2EE. За один уродский switch, тупо копирующий C, нужно зажарить авторов языка в тостере. При наличии "instanceof" нет аналога typecase из третьей модулы или оберона, который явно удобнее и безопаснее.

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

3. Отказ от препроцессора. Кто писал свой логгер или использовал log4j -- поймет. :)

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

5. В языке нет итераторов -- хотя бы la foreach в PHP. Лучше -- в стиле всеми забытого CLU.

6. Понимаю, почему нет перечислимых типов. Но все равно тоскую по ним. К примеру, приватный перечислимый тип в final-классе абсолютно безопасен. :)

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

8. Те же притензии к AWT, который при первой возможности был заменен на swing. Кроме того, неудачность и тормознутость гуев едва не поставила крест на самой концепции переносимого пользовательского софта.
 

Ямерт

The Old One
Снимаю шляпу перед твоей эрудицией...

Теперь я понял сравнение с инквизицией :)
Сам я по причине ничтожного опыта программирования на Java (около полугода) смог бы выделить только такие раздражающие факторы, как отсутствие множественного наследования и тормознутость гуи.
Только почему же нет итераторов? А java.util.Iterator на что?
 

Crazy

Developer
Автор оригинала: Зануда
Теперь я понял сравнение с инквизицией :)
Для остальных поясню: аналогия здесь в том, что инквизиция сыграла и определенную положительную роль в сплачивании церкви, предотвратив возникновение религиозных войн. Но, увы, за это приглось заплатить некоторыми потерями в искусстве, науке, экономике.

Только почему же нет итераторов? А java.util.Iterator на что?
Это не языковая конструкция, а просто один из классов системной библиотеки. Соответственно, он не имеет -- не может иметь -- никакой поддержки со стороны языка. Это приводит к тому, что его использования как правило выглядит неуклюже. Пусть у нас есть коллекция объектов класса Foo и мы хотим выполнить над каждым операцию bar(). Как это выглядит на PHP:

PHP:
foreach($items as $item)
  $item->bar();
Обращаю внимание: даже если бы в PHP была строгая типизация, то код был бы таким же, ибо компилятору известно, какой тип имеют компоненты коллекции $items. В худшем случае было бы примерно так:

Код:
foreach($items as $item:Foo)
  $item->bar();
А вот, что мы имеем в Java:

Код:
for(Iterator iter=items.iterator(); iter.hasNext(); ) {
  Foo item = (Foo)iter.next();
  item.bar();
}
Разберем, в чем этот код хуже:

1. Мы вынуждены завести отдельную переменнуж для итератора. При вложенных итераторах уже не получается бездумно писать "iter".

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

Код:
for(Iterator iter=items.iterator(); iter.hasNext(); iter.next())
3. Мы дважды заявляем об использовании класса Foo: при объявлении переменной и при приведении типа. Причем корректность этого будет проверена только в рантайме, что снижает эффективность Java как языка с жесткой типизацией.
 
Сверху