LINUX.ORG.RU

Да бимерам просто обидно. :-)

anonymous
()

Статья из разряда:
 "Чем Ruby лучше чем Java? Правильно - Ruby лучше чем Java"

Один мой знакомый утверждал, что Sun изобретая Java
сделал одну хорошую вещ и одну плохую. 
Хорошая - разработал и воплатил Java API.
Плохая - разработал язык и vm java.

Он же утверждал, что Sun сделало бы великое благо,
если бы разработало и воплатило тот же API для C++.

Для Java есть Groovy, его синтаксис заметно компактнее и
тоже включает замыкания и лямбды

ezhikov
()
Ответ на: комментарий от ezhikov

> Плохая - разработал язык и vm java.

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

Насчет VM - простите, эту идею сейчас все кому не лень тащат у сантехников, начиная от .NET кончая Супер-Пупер Пайтоном.

anonymous
()

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

anonymous
()
Ответ на: комментарий от anonymous

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

Брюс ввергает кодеров в ужас, показывая как бедные жабобыдлокодеры итерируют массив:

for(i=0;i<array.size();i++) {
  System.out.println(array[i]);
}

Поздравляю вас, гражданин соврамши, в жабе сейчас это пишется так:

for (String s: array) {
  System.out.println(s);
}

anonymous
()

Ух какая тема хорошая, к вечеру будет лидером по комментариям... ;-)

Вопрос к упомянувшим автора, как "известного": а чем Б.Тейт так уж известен? Bitter Java? Better, Faster, Lighter Java? Так ведь ничего особенного, кроме описаний того, как "мы с друзьями на наших каяках по порогам 5-й категории...". Много идей, мало смысла.

И кстати, тут товарищ был, ИМХО, абсолютно прав насчет "калаша". Кто использует такой хороший и мощный Руби?

onz
()
Ответ на: комментарий от anonymous

>Конечно можно найти обходные пути через задницу, но проще выбрать лучший язык. Например - ruby.

Язык для написания чего?!

Lisp - очень неплохой язык, но что на нём написано?

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

PS. IMHO для написания систем масштаба предприятия альтернатив JAVA нету.

А язык java, да, не самый краткий. Русский тоже не самый краткий, why don't you flame in english?

Yilativs ★★★★
()
Ответ на: комментарий от anonymous

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

Присоединяюсь. Кстати, у массивов в Яве нет метода size(), зато есть свойство length. Автор явно не прогонял примеры... ;-)

И еще хотелось бы знать, как после

> In Ruby, you'd type something like this: > array.each {|element| puts element}

счастливый кодер обработает NullPointerException на неинициализированном массиве? Или у настоящих программистов эксепшнов не бывает? Или в этом и состоит стиль "lightweight" от герра Тейта?

В Яве это делается так (да-да, долго и некрасиво):

int size = (array != null ? array.length : 0); for(i=0;i<size;i++) { System.out.println(array[i]); }

onz
()
Ответ на: комментарий от onz

Блин... Переносы не развесил.

В Яве это делается так (да-да, долго и некрасиво):

int size = (array != null ? array.length : 0); for (i=0;i<size;i++) { System.out.println(array[i]); }

onz
()
Ответ на: комментарий от anonymous

> Насчет VM - простите, эту идею сейчас все кому не лень тащат у сантехников,

Ты что, всерьез думаешь, что VM - это их изобретение?

AFAIR, первая рабочая VM сравнимого размера была как раз у Smalltalk.

Жалко его, кстати. Хорошая платформа была. Мой препод по жабке когда-то на ней писал, сейчас если его спросить, что он думает про жабку по сравнении со Smalltalk - можно весьма витиеватые матерные обороты услышать =)

int19h ★★★★
()
Ответ на: комментарий от onz

>В Яве это делается так (да-да, долго и некрасиво):

>int size = (array != null ? array.length : 0); for (i=0;i<size;i++) { System.out.println(array[i]); }

зачем нужна ваша джава???

вот то же на пых-пых, на выбор:

1) var_dump ($array);

2) print_r ($array);

theserg ★★★
()
Ответ на: комментарий от anonymous

> ну ладно, давай я тебе по статье скажу чего-нить

Если хочешь сказать по делу - распиши лучше пример с транзакцией.

Что забавно - в C# для подобных вещей сделали оператор using, и оно действительно очень помогает. RAII - великая вещь! А в жабке все, как всегда, ручками от и до...

int19h ★★★★
()
Ответ на: комментарий от onz

> счастливый кодер обработает NullPointerException на неинициализированном массиве?

Что за бред? Если переменной array ничего не присвоено, то ее просто нет, какой null pointer? это не плюсово-жабские бредни... Если там не массив (а, например, явно присвоенный nil) - то у него просто не будет метода each.

Что касается передачи null функции, которая ждет массив... во-первых, возможность делать такие вещи - по сути своей дурацкая идея, показывающая степень проверки типов в строготипизированном языке (сравнить с ML). Во-вторых, для отлова таких вещей есть Design by Contract, которого в жабке... правильно, нет. И не предвидится, по причине невозможности расширять семантику программно.

int19h ★★★★
()
Ответ на: комментарий от int19h

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

ну да, ну да, конечно... давайте все в рантайме ловить, и будет нам всеобщее динамическое счастье

>Во-вторых, для отлова таких вещей есть Design by Contract, которого в жабке... правильно, нет. И не предвидится, по причине невозможности расширять семантику программно.

не надо гнать, для таких вещей есть Aspect Java, которая не только предвидится, но и нормально работает у тех же бимеров.

anonymous
()
Ответ на: комментарий от theserg

> зачем нужна ваша джава???

> вот то же на пых-пых, на выбор:

> 1) var_dump ($array); > 2) print_r ($array);

> кстати, perl:

> print @array;

Ок, принято. В Перле и "пых-пых" (PHP?) больше встроенных функций для работы со строками и массивами и они мощнее (кто бы спорил ;-)). Ява нужна НЕ для этого. Интерпретатор Перла можно впихнуть в мобильник? На нем (без С) можно сделать приличного толстого клиента? Есть аналоги Java Web Start? Про J2EE тихо умолчу... А для строк один раз пишется статический класс StringUtils с недостающими функциями. Или берется готовый из Apache Commons.

Кстати, вопрос был не про длину кода, а про то, что счастливый кодер на Руби/Перле/PHP будет делать с исключениями при передаче null в качестве массива: писать die "Sam durak"??

onz
()
Ответ на: комментарий от Yilativs

> А язык java, да, не самый краткий. Русский тоже не самый краткий, why don't you flame in english?

Because it's not my native language. Is jaba your native language? :)
And, besides, comparison for native languages in thread about programming languages is not honest isn't it?

anonymous
()
Ответ на: комментарий от onz

> Кстати, вопрос был не про длину кода, а про то, что счастливый кодер на Руби/Перле/PHP будет делать с исключениями при передаче null в качестве массива: писать die "Sam durak"??

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

anonymous
()
Ответ на: комментарий от anonymous

> Между тем Брюс абсолютно прав

Он абсолютно неправ. Если юы он хотел показать отличия похвастался рубином и пожалел джаву его бы поняли. Но он на основании пары более продвинутых фич (closures/continuation) делает глобальный вывод что рубин продуктивнее java. Это бред.

Тем более что он скатывается вконце в фанатскую фигню про динамические и статические языки при чем фразой: "Static typing: You must declare every variable and every parameter which requires more time for much less benefit than you think" говорит о том что он не знает о чем говорит, да еще приводит необходимость декларировать типы как основной недостаток статической типизации, что вообще говоря бред сивой кобылы.

r ★★★★★
()
Ответ на: комментарий от int19h

>> счастливый кодер обработает NullPointerException на неинициализированном массиве?

> Что за бред? Если переменной array ничего не присвоено, то ее просто нет, какой null pointer? это не плюсово-жабские бредни... Если там не массив (а, например, явно присвоенный nil) - то у него просто не будет метода each.

"Бред", "бредни"... Давайте, что ли, _наш_ язык поднимем на более высокий уровень, коль уж взялись обсуждать _высокоуровневые_ ЯП.

Объясните, пож-ста, что будет, если данный код из статьи:

array.each {|element| puts element}

вставить в метод, куда переменная array передается параметром? И передается null, nil или как оно там зовется в Руби. Ошибка в рантайме? Какая? Как ее отловить? Где найти информацию о ней (в Яве - @throws в комментарии к методу).

Если Руби настолько высокоуровневый, что все переменные в нем - глобальны, все программы - состоят из одной функции main() а 3-rd party библиотеки не используются, то я вопрос, конечно, снимаю.

onz
()
Ответ на: комментарий от onz

Маргиналы используют Руби. Отморозки всякие. Типа, весь мир идёт не в ногу, а они, шибко умные, в ногу.

anonymous
()
Ответ на: комментарий от int19h

Smalltalk слишком динамический. RTTI на каждом шагу. Так что для его VM создание таких замечательных, супер-эффективных JIT-ов, как для JVM, было бы просто нереально. Smalltalk - хорош, но уже и он - удел маргиналов. Java - рулит, за ней будущее!

anonymous
()
Ответ на: комментарий от anonymous

>> Кстати, вопрос был не про длину кода, а про то, что счастливый кодер на Руби/Перле/PHP будет делать с исключениями при передаче null в качестве массива: писать die "Sam durak"??

> А что сделаешь ты? Скорее всего твой обработчик тоже сводится к выводу на экран сообщения о смерти и скоропостижной кончине приложения.

Зачем??? Я могу сделать все, что угодно. Для примера: отобразить пустой listbox в форме, пробросить исключение дальше, снабдив его локализованным сообщением для юзера и продолжить работу. Наконец, просто могу НИЧЕГО не делать: привел же пример, где цикл для null выполнится 0 раз - без исключений. Если бы Ява-приложения дохли от каждого NPE, Ява бы действительно была никому не нужна ;-)

onz
()
Ответ на: комментарий от onz

До чего же убогий флейм. АСКСИОМА: пионерам не нужны дебагеры, обработчики исключений и документация. Если че-то работает не так - виноват пользователь требующий от программы странного.

set
()
Ответ на: комментарий от onz

>Зачем??? Я могу сделать все, что угодно. Для примера: отобразить пустой listbox в форме, пробросить исключение дальше, снабдив его локализованным сообщением для юзера и продолжить работу. Наконец, просто могу НИЧЕГО не делать: привел же пример, где цикл для null выполнится 0 раз - без исключений. Если бы Ява-приложения дохли от каждого NPE, Ява бы действительно была никому не нужна ;-)

Похоже, чел считает, что обработка исключений есть уникальное свойство Жабы. Ну-ну...

anonymous
()
Ответ на: комментарий от set

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

Хорошо хоть OSNEWS быстро пришел к постулату выбор средства зависит от задачи.

set
()
Ответ на: комментарий от anonymous

> А давайте затолкаем J2EE в анус тем, кто её придумал? Spring мегарулит!!!

А что вы имеете против Stateless Session Beans, сервлетов, JavaMail и JMS, например? Не все йогурты одинаково полезны...

Гляньте, скажем, пакеты org.springframework.transaction, org.springframework.mail и org.springframework.web в упомянутом мегарулезном фрейворке.

onz
()
Ответ на: комментарий от set

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

anonymous
()
Ответ на: комментарий от anonymous

> Похоже, чел считает, что обработка исключений есть уникальное свойство Жабы. Ну-ну...

Отнюдь! Я искренне хочу увидеть пример, как это делается в Руби. Вот только подозреваю, что код уже не будет столь прозрачен и 3-4 раза короче явского.

Иначе говоря, давайте сравнивать _реальные_ приложения, а не очередную демку в две строки. Кстати, гневынх реплик вида "Вот могучее приложение XXX, писанное на Руби!" на свой вопрос, кто же его пользует, я тоже не вижу...

onz
()
Ответ на: комментарий от Sun-ch

Sun-ch как всегда прав, просто здается мне что если в блоке операций над каждым елементом массива много кода + обработка исключений выигрыша мы не получим. На крайня в том же ИДЕ типа ДЖейДевелопера мошно на мышачить цикл в стиле 1.5.

set
()
Ответ на: комментарий от anonymous

>А что сделаешь ты? Скорее всего твой обработчик тоже сводится к выводу на экран сообщения о смерти и скоропостижной кончине приложения.

Гы! А он сбацает что-то вроде "void printArray( T[] array not null )" ... но только похоже что это будет в следующем тысячелетии ...

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

Забавно, теперь все говорят о замыканиях, аспектах, метапрограммировании, ДСЛ-ах ... похоже движемся назад, к 50-м, к Lisp - у? Ась?

anonymous
()
Ответ на: комментарий от Sun-ch

> Чё тупим? Для объекта null метода each не существует. > Поймаем исключение > rescue SystemCallError ....

А-а-а! В рантайме, естественно...

А теперь давайте сравним код на Руби, перебирающий массив (из статьи) и _устойчивый_ к null, с приведенным кодом на Яве? Что, код на Руби по прежнему в разы проще и интуитивнее, как всех пытается убедить Тейт?

onz
()
Ответ на: комментарий от anonymous

>Так что для его VM создание таких замечательных, супер-эффективных JIT-ов, как для JVM, было бы просто нереально.

Брехня - StepStone например медленнее сишного кода ~10-15% (компилятор к стати).

anonymous
()
Ответ на: комментарий от onz

>Если бы Ява-приложения дохли от каждого NPE, Ява бы действительно была никому не нужна ;-)

О!!! ВОТ ТАКИЕ МНЕ НРАВЯТСЯ!!! ЭТО НАСТОЯЩИЙ ПРОДУКТ ЖАБА-КУЛЬТУРЫ! Ну что жабщики поняли какие вы есть?!

anonymous
()
Ответ на: комментарий от anonymous

А создать свой класс с перегрузкой метода toString() религия не позволяет. Или вас смущает что он будет проверять массив на NPE и выводить информацию сошласно вашему представлению + локализация? Я уже молчу про сортировку вашик елементов этого массива.

set
()
Ответ на: комментарий от onz

class RetryException < RuntimeError
attr :ok_to_retry
def initialize(ok_to_retry)
@ok_to_retry = ok_to_retry
end
end

def read_data(socket)
data = socket.read(512)
if data.nil?
raise RetryException.new(true), "transient read error"
end
# .. normal processing
end


begin
stuff = read_data(socket)
# .. process stuff
rescue RetryException => detail
retry if detail.ok_to_retry
raise
end

Sun-ch
()
Ответ на: комментарий от Sun-ch

>Чё тупим?

Сам тупишь! Даже самые хреновые жабщики ЗНАЮТ, что? кроме жабы исключений нету НИГДЕ!!!

anonymous
()
Ответ на: комментарий от onz

>А-а-а! В рантайме, естественно...

А при жабе ессно в компайл-тайме?

anonymous
()
Ответ на: комментарий от onz

> Кстати, вопрос был не про длину кода, а про то, что счастливый кодер на Руби/Перле/PHP будет делать с исключениями при передаче null в качестве массива: писать die "Sam durak"??

На Perl с use strict; null-массивов как таковых не бывает. Бывают, разве что, пустые, и еще может быть undef в том месте, где мы ожидали arrayref. Но это все ловится влет. Да, эксепшены-в-стиле-явы к перлу прикручиваются (но через задницу, конечно - ну а вы чего хотели? ;)

Можно смело писать

try { somefunc(undef) } catch Error::WrongArgs with {my $ex = shift; recover_from_error()};

и

sub somefunc($) {my $arr = shift; throw Error::WrongArgs -text => "need array ref here!" unless ref $arr eq 'ARRAY'; ... }

anonymous
()
Ответ на: комментарий от anonymous

Лично я хочу четкого ответа на вопрос "А зачем?" и пока его не получил.

set
()

По-моему очень поверхностная статья. Все примеры разбирать не буду, но по первому - в Java есть куча способов правильно организовать цикл. И если его организовать правильно через Iterator, то синтаксис будет много понятнее. Вообще говоря код не должен быть очень коротким. Он должен быть непротиворечивым. Я не знаю Ruby, но мне по первому примеру с циклом не совсем понятно, куда здесь ставить тело цикла.

anonymous
()
Ответ на: комментарий от onz

> счастливый кодер обработает NullPointerException на неинициализированном массиве? Или у настоящих программистов эксепшнов не бывает? Или в этом и состоит стиль "lightweight" от герра Тейта?

Кажется так можно: array.each {|element| puts element} if array

чтобы ничего не печаталось если array.nil? (вопрос относится к методу, а не к предложению)

alnsn
()
Ответ на: комментарий от anonymous

> в Java есть куча способов правильно организовать цикл

От циклов вообще нужно по взоможности отказываться. Есть же рекурсия, она и понятнее и противоречеустойчивее.

anonymous
()
Ответ на: комментарий от anonymous

>в Java есть куча способов правильно организовать цикл. И если его организовать правильно через Iterator, то синтаксис будет много понятнее...

... но все равно хуже чем в ...(тут длинный перечень менее популярных языков). И это касается не только перебора элементов структуры. Об этом и статья.

DonkeyHot ★★★★★
()

Странно - такой резкий контраст между этой статьей и его книгой "Горький вкус Java" по уровню профессионализма... Может это подстава какая-нибудь? Типа первоапрельского розыгрыша? Особенно впечатлили сентенции про итерацию массивов... По книге ощущение, что он, мягко говоря, не первый год знает Java; читаешь статью - очередной журналюга с учебником для студентов на коленках... Нет, наверное розыгрыш :)

prasthita
()
Ответ на: комментарий от alebu

> Bruce Tate - весьма даже известная личность и к его критики стоит прислушаться.

Он сильно головой во время катания на каноэ, наверное, приложился.

Про "авторитеты" - спроси у Луговского. "Авторитеты" есть только в особых не столь отдаленных местах, в Науке авторитетов нет.

А у меня есть критика его книги Bitter Java - и что?

Бимики (из компании Idiots Become Managers) как-то народ хотели заставить на Java SP и UDF для DB2 писАть - дурная голова рукам покоя не даёт.

Java - это cool-язычок для мидлетов на маленьких телефончиках (без "Симбиана") и раньше ещё был для апплетов.

Что-то "хардкодеры" на PL/SQL и DB2 ANSI SQL99 снова появились после провала супер-пупер EJB-проектов вслед за провалом RMI/CORBA-"энтузазизма". Вот "кГрысы" типа Тэйта и начали метания.

Давно пора даже бимерам понять простую истину - НЕТ УНИВЕРСАЛЬНОГО ЯЗЫКА ПРОГРАММИРОВАНИЯ!

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.