• Авторизация


почему я не могу вернуть void? 31-10-2008 21:37 к комментариям - к полной версии - понравилось!


В джаве, оказывается, нельзя вернуть значение типа void! То есть, на приведенную ниже конструкцию компилятор злобно ругается. Кантора на них нет!
code:
private void myLovelyFunc (String input) { if (Utils.isTooBad(input)) { return sendError("Фуфло на входе!"); } // полезный код buyIt(input); } private void sendError(String message) { // придумать, как рассказать // заказчику об ошибке figureOutHowToTellCustomerAboutTheProblem(message); }
вверх^ к полной версии понравилось! в evernote
Комментарии (12):
Компиль ругается, потому что в MyLovelyFunc не хватает двух скобок. А возвращать войды из функций - это порочная манера C-программеров до-оопэшной эпохи. Нужно хотя бы для плезиру вернуть код ошибки. Желательно нулевой. :)
ujeen 31-10-2008-22:30 удалить
Скобки поправил - они потерялись в процессе борьбы с лирушным движком, который рендерит моноширинные строчки с двойным интервалом, если установлена галка "сохранять переводы строк", спасибо что заметили! Прототипная myLovelyFunc обречена возвращать void, потому что такая сигнатура у метода внешнего интерфейса, который она реализует. Но это как раз доисторизм - возвращать код ошибки: тем самым вызывая какой-то код, мы вынуждены интересоваться - че он там вернул. Более современно бросать ислючения - это позволяет сосредоточить код обработки ошибок на том уровне, где этими ошибками действительно интересуются :)
О, возвращение ошибкообъектов или эксепшнов - это уже третья степень созерцания, я ушел из большого программирования еще до этого. :)
Прототипная myLovelyFunc обречена возвращать void, потому что такая сигнатура у метода внешнего интерфейса, который она реализует.
Так проблема-то, как мне представляется, не с ней, а с "return sendError();". Просто замените на "sendError(); return;", и дело с концом.
ujeen 31-10-2008-22:47 удалить
Я именно не хочу писать "sendError(); return;", потому что немедленно найдется умник, который между этими двумя операторами впишет еще какой-нибудь код; в то время как код из примера четко говорит: если ошибка - сообщи куда следует и вали вон из тела метода! :) Конечно, я могу сделать "try/finally" или "break :error" с похожим эффектом, но это намного менее наглядно и понятно, чем естественный джавский return. Ну и пафос заметки, собственно: с чего вдруг архитекторы джавы решили не считать void обычным типом?
с чего вдруг архитекторы джавы решили не считать void обычным типом?
Я подозреваю, что корни ответа на этот вопрос кроются в ранних 90х, когда в Швеции с чисто игровыми целями создавался язык LPC, который впоследствии стал своего рода предтечей Джавы. Так вот, универсальный тип mixed в LPC может быть чем угодно, но не войдом.
ujeen 01-11-2008-00:06 удалить
Альтернативное предположение - что в Си как предтече и джавы и LPC тоже нельзя вернуть void - но там это (если я правильно помню) было из-за тотальной завязки синтаксиса на работу с указателями (плюс, во времена разработки Си еще не умели пользоваться эксепшенами). Разработчики джавы, купировавшие указатели до роли ссылок, вполне могли упростить теорию типов. Но что взять с людей, которые не предусмотрели даже функлет как параметр! :)
C является предтечей LPC только по синтаксису - LPC изначально задумывался как модульно-объектный язык с встроенными массивами, векторами и мэпами, с гарбидж-коллекторами и прочей кофейной атрибутикой.
ujeen 01-11-2008-06:12 удалить
Глядя на синтаксис LPC, я бы скорее назвал его предтечей Питона: mixed * stuff = ({ 1, "green", 48.2 }); В дневниках Ногтона про мадистов нет ни слова, да и представляя себе обстановку MIT и Меллона тех лет (эйфория от X11 и Апранет, Лисп, Смоллток, Схема) трудно поверить, чтобы местная звезда Гослинг всерьез интересовался европейскими разработками :)
ujeen, Питон я не знаю, но не могу исключить и этого. Поразительное же сходство конструкций Джавы и LPC всегда меня занимало. А в MUD'ы народ начал играть еще в 90-ом, и подозреваю, что и "великие" тоже не брезговали.
ujeen 01-11-2008-16:44 удалить
Да, я видел таймлайн, и Objective C и Smalltalk были очень популярны в американских университетах уже больше десятка лет, к моменту начала работы джавской команды. Скорее, я бы предположил, что ровно те же Objective C и Smalltalk были взяты за базу и в Европе при написании MUD. Но источников, что MUD был кому-то интересен в университетских кругах Америки, гугл как-то сходу не вывалил, и я склонен предполагать, что не случайно :) Думаю, что вектора и прочие коллекции переродились из сишных библиотек макросов, которые были на слуху чуть ли не с момента создания первого промышленного приложения на Си. Пакеты, сборщик мусора, по официальной версии, пришли из Ады. Объектные парадигмы они все (lpc, java, python, ruby) без сомнения, развивали, отталкиваясь от Смоллтока - второго подарка миру от ксерокса :)
Насчет популярности MUD'ов в Штатах - это Вы пошутили - они же тут, в университетах, и появились. Ларс Пенсьо, разработчик LPMUD, просто попытался сочетать существующую функциональность MUD'ов и принципы ООП, наверняка позаимствованные из Смаллтолка. Поэтому драйвер ("инфраструктурная" часть LPMUD) до сих считается piece of art, а mudlib (объектная библиотека), который подражал уродливым университетским пиндонаработкам на C, оказался полным дерьмом.
ujeen 01-11-2008-22:27 удалить
ок, про mud я и правда знаю очень мало - только то, что вываливается на первой странице гуглопоиска, а это, по совести говоря, практически ничего.


Комментарии (12): вверх^

Вы сейчас не можете прокомментировать это сообщение.

Дневник почему я не могу вернуть void? | ujeen - Аутливинг | Лента друзей ujeen / Полная версия Добавить в друзья Страницы: раньше»