Семинар по RoR

Apr 01, 2007 20:22

Вчера был на лекции-семинаре по Ruby on Rails. Мероприятие длилось добрых 7 часов (+ около часа на перерывы). Честно говоря, я не ожидал, что презентация займет весь почти день, но я ни капли не жалею: этот день был самым интересным для меня за последнее время.

Презентация состояла из трех частей:
1. Ruby
2. Ruby on Rails (RoR)
3. Демонстрация RoR

Итак, по порядку.
Вначале у меня отношение к Ruby было весьма скептическое. В духе: ну вот, еще один язык с извращенным синтаксисом. Что еще можно подумать видя строку кода вроде вот этой?
5.times { print "Chunky Bacon" }
Что она делает? Да вот же, написано: "пять раз напечатай Chunky Bacon".

Как я уже сказал, вначале конструкции Ruby у меня вызывали усмешку.
Однако постепенно стали мелькать мысли "Хм, а вот это довольно интересно..."
Затем: "Черт! Да ведь это удобно!"
Потом осталась только одна мысль: "Хочу! Хочу! Хочу!"
К концу второй части презентации я был преисполнен черной завсти к тем кто работает с Ruby.
Вот так вот.

Теперь немного конкретики про Ruby (из того, что мне запомнилось):
1. Замыкания, регулярные выражения, интервалы, хэши - "родные" элементы языка Ruby.
Comment: в Ruby замыкания используются повсеместно и это действительно очень удобно.
2. Если вы хотите что-то сделать, вы просто делаете это - почти наверняка это будет правильно.
Comment: так называемый "принцип наименьшего удивления Ruby" - вы можете писать как вам нравиться - вас почти наверняка поймут, причем поймут правильно.
3. Вы можете в любой момент в любой класс или в любой объект добавить новую фунциональность (новые поля и методы).
Comment: вот это как раз самая ненормальная вещь в Ruby. "Что за бред? Добавлять методы в уже декларированные классы? Добавить десяток методов в конкретный объект, а сам класс оставить без изменений? Вы вообще в своем уме? Как же можно?" - вот приблизительно такие мысли у меня и были. Дело в том, что я привык к подходу из тех языков на которых писал раньше (Pascal/Delphi, PHP, C++, C#, Java) - там есть классы и есть объекты: классы никогда не изменяются в процессе работы программы, а все объекты одного класса по функциональности и структуре идентичны между собой. В Ruby это не обязательно. А вот теперь тупой пример.

Тупой пример (под впечатлениями о Ruby):
Пусть у меня есть класс Двери. Пусть я создал объект Дверь. Пусть я хочу иметь возможность нарисовать эту дверь где-нибудь. На стене, например. Нет, я не буду реализовывать для класса двери интерфейс Рисовабельность. Зачем? Ведь весьма вероятно, что когда я думал о Дверях, я даже и не планировал, что мне понадобится их еще и рисовать. В место этого, я могу подключить к классу Дверей модуль Рисование непосредственно там, где мне понадобилось озаботиться проблемой рисования дверей на стенах. Итак, я подключил Рисование и описал пару методов, которые определяют общий принцип рисования дверей. При этом модуль Рисование сразу же обеспечил меня широким набором дополнительного функционала. Например у меня появилась возможность рисовать двери, повернутые под углом. Или возможность определить цвет в конкретной точке двери. И так далее. Теперь предположим, что в мою безумную голову взбрело желание сделать мою Дверь волосатой (так смешнее). Причем волосатой я хочу сделать только одну дверь (я не псих, и не хочу чтобы все Двери были волосатыми). Я просто беру и подключаю к моей конкретной Двери набор функциональности Волосатость. После этого у мой Двери сразу появляются новые поля длина_волос, цвет_волос, густота_волос, чистота_волос и методы подстричь, помыть, высушить, причесать и взъерошить. А все остальные двери останутся "лысыми" и у меня не возникнет необходимости следить за их внешним видом. Вот такие вот дела.

Подобный подход вначале кажется чистым безумием. Но на примере RoR я понял, что подобные возможности могу быть просто невероятно удобными. Более того, они могут быть до жути удобными. Пример. У вас есть класс Books. Парой простых строчек (количество зависит от того, насколько вы привередливы) вы задаете связь между классом Books и таблицой в БД (тот самый ORM). Теперь вы можете написать book.save - и ваш объект сохранится в БД (подключения, соединения, транзакции, SQL - вы этого вообще не касаетесь). Ну, в Java через аннотации Hibernate я почти так тоже могу. Но это еще не всё. Пусть я хочу найти книги по автору и году. Я просто пишу Books.find_by_author_and_year{:author => "Йа!", :year => (2002..2008)}. Всё! Больше ни-че-го. Возможно синтаксис немного неверный - но идея именно такая. То есть я даже не занимаюсь реализацией метода find_by_author_and_year. Я просто его использую. При первом использовании этого метода, модуль, который я подключил, когда заявил, что мой объект отображается в БД, проанализирует имя метода который я захотел использовать (find_by_author_and_year) и на на основе этого добавит в мой объект этот метод. SQL, подстановка параметров, разбор результата - это не мое дело. Я пишу book_list = Books.find_all - я получу все книги. И чтобы это работало, мне понадобится просто написать Books.find_all. Возможно кого-то это не проняло, но я например мог только сидеть и тупо ухмыляться от смеси дикой зависти и адского восторга. Возможно я просто что-то упустил в этой жизни, возможно это где-то давно было и я просто жил в каменной пещере, ничего не зная.

Или еще одна вещь из RoR. Scaffolding. Вот вы добавили в свой веб-приложение какой-то новый класс. Хотя бы тот же Book. Вам еще предстоит сделать чтобы книги можно было редактировать, сохранять, отображать, покупать, отправлять и так далее. Много чего. А теперь вы берете и пишете одну строку, которая включает "леса" для работы вашими книгами. Теперь вы получаете 1) страницу, на которой вы видите список всех ваших книг, откуда вы можете вызвать 2) страницу для просмотра и редактирования каждого объекта 3) страницу для создания новых экземпляров. То есть вы уже можете оперировать через веб-интерфейс своего приложения с объектами, которые только что ввели. И это - одной строчкой.

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

Кроме упомянутых "фич" на семинаре рассказано про множество других - я перечислил только те, которые наиболее запомнились и которые я в состоянии более-менее описать. "Если я что-то не упомянул - это не значит, что этого нет" (c)

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

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

impressions, languages, chunky bacon, programming, ruby on rails, ruby

Previous post Next post
Up