Продолжаю копаться в Ruby. Сейчас правда, что приятно уже по оплачиваемому проекту.
И есть пару вещей, которые меня активно раздражают.
а) Функции можно вызывать без скобок.
То есть func() и func сработают одинаково. Все было бы ничего, но вот когда вызов пишут без скобок, то приходится каждый раз смотреть — это у нас переменная с таким названием или вызов функции без скобок.
Честно говоря, экономия на двух байтах (открывающая и закрывающая скобка) не так велика, а вот напряг конкретный.
б) Не понравились Symbols.
Может я конечно их не до конца понимаю. Но честно говоря, как по мне легкий перебор вводить отдельное понятие для константных строк.
в) Черезмерная любовь к возвращению объектов.
Это болезнь всех скриптовых языков. Когда появляются констукции типа [A::b().c()].d { |x| x+x }.e
Согласен, такая форма читается проще, чем тоже самое развернутое на целую страницу с переносами
строк.
Однако, когда весь язык заточен под это, то люди частенько увлекаются этой возможность и код становится таки хуже читаем, чем при разбиении на несколько строк.
г) Convention over Configuration (это уже насчет Rails)
Идея в том, что по default’у нужно очень мало кода для делания стандартных действий (а-ля взять html template, впихнуть в него переменные и выплюнуть его). И только если что-то нужно делать нестандартное, то тогда нужно вносить изменения.
Нельзя сказать, что это плохо. В целом это конечно хорошо.
Однако у этой методики большой недостаток, что такой код легко писать, но сложно читать/понимать.
Условно говоря, сгенерировать HelloWorld c кучей возможностей можно одной строкой (rails HelloWolrd).
Но в результате мы получаем директорию с 280Kb нагенерированного content’а. Плюс еще несколько метров кода который лежит под ними в виде rails, rake и т.п.
Одна моя особенность состоит в том, что я предпочитаю понимать, что происходит и как оно работает. А тут хорошее понимает внутренностей этого hello world (включая те самые gem’ы которые он использует) может занять достаточно больше время.
Скажите, Виктор, вы когда на обычном языке разговариваете часто говорите «открывается скобка» и «закрывается скобка»? Руби тем и отличается от других языков что заточен под пользователя (разработчика) а не под компилятор/интерпретатор.
Например, вполне валидный Rails код Blogger.find_by_name «Victor Ronin» вы можете читать как почти обычный английский текст. Это дает возможность переводить бизнес логику в код без лишнего напряга.
Как противоположность можете вспомнить Java где в конце каждой строки кода нужно ставить точку с запятой. Этот символ не несет никакой смысловой нагрузки но захламляет код. Согласитесь бип что бип глупо бип смешивать бип полезную бип информацию бип с какой-то бип непонятной бип фигней? 🙂
В том же Python при чтении строки задающей цикл глаза скачут по строке назад-вперед несколько раз. Сравните с тем как пишется и читается код на Ruby. Я уже не вcпоминаю про загадочный self который нужно указывать при определении метода но не передавать при его вызове.
Вобщем, помните о том, что «язык программирования» состоит не только из «программирования» но и из «языка».
> Например, вполне валидный Rails код Blogger.find_by_name “Victor Ronin” вы можете читать как почти обычный английский текст. Это дает возможность переводить бизнес логику в код без лишнего напряга.
О каких лишних напрягах речь, я что-то не понял 🙂
Кстати, пара скобок в данном случае могут быть даже более понятны человеку (в скобочах часто пишут уточнения).
Раньше я писал на Delphi и меня не напрягало, что в функциях без параметров скобки ставить не обязательно. Теперь (после нескольких лет c# и java) для меня это выглядит странно, по коду сложно понять — это вызов функции или обращение к переменной. Я думаю Виктор имел ввиду именно функции без параметров.
> Этот символ не несет никакой смысловой нагрузки но захламляет код. Согласитесь бип что бип глупо бип смешивать бип полезную бип информацию бип с какой-то бип непонятной бип фигней?
Он несет смысловую нагрузку вообще-то, он разделяет операторы 🙂 Знаки препинания и в обычной же письменности используются. Конечно, можно и без них, но с ними проще понять интонацию (а иногда и смысл: казнить нельзя помиловать).
> Вобщем, помните о том, что “язык программирования” состоит не только из “программирования” но и из “языка”.
В общем-то, язык не только для общения с компьютером, но и чтобы всем понятнее было (не только рубистам) 🙂
Ну, все таки язык программирование — это не обычный человеческий язык. Я например редко говорю употребляя процедуры, классы и переменные класса 😉
Да, я понимаю зачем скобки убрали. Но тем не менее решив одну проблему, была введена другая (неотличимость переменных от функций).
Про рельсы чет вы перегнули. Рельсы это офигенный инструмент для создания сложных, навороченных RESTful сайтов. А вы на нем «hello world» решили сделать 🙂 Это как микроскопом гвозди забивать, и жаловаться что слишком много всяких ненужных кнопочек есть на микроскопе, которые не помогают гвозди забивать. Для приложений типа «hello world» есть куча других легких быстрых фреймворков.
Про скобки тоже не согласен, читаемость кода выше без лишних символов. Blogger.find_by_name “Victor Ronin” из предыдущего примера гораздо лучше выглядит, чем Blogger.find_by_name(“Victor Ronin”), а то что это вызов метода (а не переменная) — очевидно, так две переменных подряд (без символов операций) не имеют смысла.
И вообще, вы приподнесли сильные стороны Ruby как недостатки, что довольно странно 🙂
В целом это нормально, когда сильные стороны явлюятся недостатками.
Язык C хорош тем, что позволяет очень точно указать компу, что и как делать. С другой стороны, его недостаток именно в том, что приходится работать слишком большим количеством деталей и легко сделать что-то не так.
Java хорошая для больших приложений. А с другой стороны, как начинаешь писать на ней, мгновенно приложение становится большим (даже если функциональности мало).
Насчет скобок. Blogger.find_by_name «Victor Ronin» действительно без скобок логичнее.
А как насчет Blogger.find newblogger ? Обявил кто-то переменную newblogger выше по тексту, или это название функции/метода. Скобки я вообще могу не замечать, а вот каждый раз смотря на такой код, мне нужно искать что такое newblogger.
Пару лет пишу на рельсах. Хм, действительно не понять переменная это или функция 🙂 Задумался.
На самом деле комментировать тут нечего. Все упомянутые особенности по три тысячи раз перетирались во флеймах «ruby vs python». Ко всему это проще привыкнуть, подойдя к руби с т.з. идеологии руби, а не питона 🙂
Кстати, меня в руби больше всего раздражают ненастоящие константы:
ruby-1.8.7-p249 > ASD = 1
=> 1
ruby-1.8.7-p249 > ASD = 2
(irb):2: warning: already initialized constant ASD
=> 2
ruby-1.8.7-p249 > p ASD
2
=> nil
Само собой, нового материка я тут не открыл 🙂
Правда, я скорее подхожу к Ruby с точки зрения C++/Java/PHP. Отчасти поэтому скобки сразу в глаза бросились.
Recently started to use Ruby and have a bad feeling:
* the lack of documentation ( you can compare it with Python)
* the quality of documentation: (what ruby version added Array.length and Array.count function — this information doesn’t exist in documentation)
* the lack of modules (for example .ini file parser)
* almost all existing modules are targeting rails platform
* the lack of simple functions in a STD library ( endswith, startswith and etc. Why the hell I should write and understand regular expression for such simple things )
* the quality of existing std modules (logging module by default doesn’t flash a record to disk, ability to execute an external process ( compare with Python.subprocess …) )
* the lack of deployment functionality — «gem» is not what I need/want to see in production. I need the ability to «freeze» my program and deploy only it. Instead I force everyone to install a huge chain of dependencies (for example ruby-mysql)
* the syntax also has few surprises like spaces between function name and its arguments.
I can continue the list. May be Rails is a nice framework, but Ruby is still a young language and it have to grow, meanwhile I will continue to work in another language 🙂
It’s hard for me to comment this, because I used Ruby for a week or so.
I have seen only the quality of documentation and syntax problems for right now. However, I think that RoR is immature platform too.
Насчет символов — вы немного неверно описали их смысл. Их основное отличие от строк не в деталях реализации, а в семантике. Символ — это «строка как идентификатор», предназначенная для компьютера. Обычная строка — «строка как текст», предназначенная для человека. Так что правильное использование символов способствует читаемости программы.
А насчет скобок — согласен, что в этом есть свои минусы. Главный — в том, что пропадает простой синтаксис для передачи функции как параметра (или как возвращаемого значения). Например, если есть функция doSomething, то в языках, где скобки обязательны, можно писать print(doSomething()), и это будет означать вызов функции, а можно executeInAnotherThread(doSomething), и здесь передастся ссылка на функцию. А как это делать в ruby? Заворачивать в лямбда-выражения или договариваться об использовании символов? Как-то неэлегантно. Но, конечно, это дело вкуса.
Да, безусловно, мое понимает символов ограниченое. И в них есть положителье вещи. Просто я не чувствую, что их положительная роль окупает дополнительную сущность.