Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Постигая Rails (ну, и Ruby)

Anna | 20.06.2014 | нет комментариев

Я знаю PHP. Не легко знаю, а подлинно знаю. Не только синтаксис, либо идиомы и особенности, но еще и отчего — отчего что-то работает именно так как оно работает, понимаете, под капотом. И скорее каждого я тем либо другим образом принимал участие в принятии того либо другого решения. Все таки, тринадцать лет с языком — это длинный срок. Но я работал не только с PHP.


Позже 2-х лет своих занятий с PHP, я взял себе маленький отпуск и выучил ColdFusion, тот, что вертелся поверх Java EE платформы. Собственно, следственно я также поковырался в Java, так как ColdFusion дозволено расширять, применяя Java компоненты.

Потом, безусловно, было неминуемое погружение в JavaScript, приправленное добропорядочной долей CSS, семантических Веб-спецтехнологий (RDFOWL и SPARQL), XML, XPath и XSL (XSL:FO и XSLT), и не будем забывать про SQL. Черт, да я могу написать (и писал) DTD (Document Type Definition — прим. переводчика)!

Не так давным-давно, позже того как я начал трудиться в EngineYard над платформой Orchestra PHP, я выучил Python. (Да, мы используем Python, для некоторых частей нашего PHP стека. Отчего? Потому что это наилучший инструмент для решения некоторых задач.)

Я не стал добавлять кучу ключевых слов в свое резюме, Дабы оно выглядело клево. Я решил так, потому что на данный момент, я считаю себя полиглотом.

Я неизменно постигал новые инструменты (будь это демоны, утилиты, библиотеки, языки либо сервисы) и судил их по нескольким критериям:

  • Насколько отлично инструмент написан?
  • Что у него с безопасностью?
  • Сколько в нем открытых багов?
  • Как реагировало сообщество на предыдущие задачи (были ли они [члены сообщества] отрыты, дружелюбны, почтительны, оперативны)?
  • Доволен ли функционал для решения моих задач?
  • Не слишком ли избыточен функционал для решения моих задач?

В конце концов, все сводится к тому, верный ли это инструмент для решения поставленной задачи?

Именно следственно, когда в финальном счете дело доходит до написания веб-сайтов, я выбираю именно PHP.Да познай свой инструмент отлично, и да окупится тебе это сторицей!

Потом я пришел в EngineYard и познакомился с кучей ошеломляющих инженеров, которые предпочли для себя Ruby.

Даже теперь, через больше чем год работы в EngineYard, я узнаю что-то о Ruby либо Rails. Безусловно, я прочитал много кода на Ruby, в процессе code review, либо легко из интереса, как что-то было реализовано. Я даже немножко похачил Rails, но это было в основном скопировать-вставить-чуть_чуть_подкрутить.

Потом подоспел Distill, и нам потребовался сайт. Приблизительно 3 недели, Дабы все сделать, причем без отрыва от основных задач и без какой-либо спецификации на используемые спецтехнологии; в обыкновенной обстановки я бы предпочел PHP и, видимо, Zend Framework 2, и сделал бы все за пару дней.

Взамен этого, рассматривая мои обсуждения Distill и чего мы хотим достичь (с прицелом на решения, а не спецтехнологии) на ближайшие месяцы, я решил уцепиться за предоставившуюся вероятность испробовать Rails (ну, и Ruby). Это был маленький план с ограниченным функционалом, к тому же я мог стремительно откатиться к PHP, если бы встретил слишком много задач с RoR. К счастью, окруженный, дословно, десятками ошеломляющих опытных разработчиков, я неизменно мог обнаружить человека, которому, я бы мог задать вопросы. Но, как Вы увидите дальше, поддержка мне не исключительно и потребовалась.

Детали реализации

Толк данной статьи не в том, как я выучил Ruby либо Rails, но в том, что я перенес из полученного навыка. Правда, кое-что касательно RoR, тоже хотелось бы сказать.

Позже PHP, я определенно столкнулся с вещами, вызывающими WTF! реакцию:

  • Скобки опциональны при вызове способа и Зачастую не применяются, впрочем в некоторыхслучаях (скажем, вложенные вызовы) они необходимы.
  • Дюже много вариантов «if not». Скажем: if !<condition>if not <condition> и unless <condition>.
  • Имена способов могут содержать ? и !, и есть соглашения, что способы с ? на конце возвращают булево значение. Это не оператор. Это часть имени, скажем, foo.empty?. Способы заканчивающиеся на ! обыкновенно изменяют целевой объект, т.е. foo.downcase! изменяет foo, в то время какfoo.downcase легко возвращает итог, по этой причине такие способы в некотором смысле деструктивны.
  • Неявное возвращаемое значение: в качестве итога выполнения способа возвращается итог выполнения последнего выражения из тела способа.

В результате, получаешь что-то как бы этого (настоящий код на некотором этапе разработки сайта Distill, тот, что допустимо изменился к моменту запуска):

class Speaker < ActiveRecord::Base
  belongs_to :user
  has_many :proposals

  attr_accessible :user, :bio, :email, :name, :id, :website,  :photo

  has_attached_file :photo, :styles => { :medium => "300x300>", :thumb => "120x120>" }
  validates_attachment_content_type :photo, :content_type => /^image/(png|gif|jpeg)/

  validates :bio, :email, :name, :photo, :presence => true
  validates :email, :format => {
      :with => /A[A-Za-z0-9._% -] @[A-Za-z0-9.-] .[A-Za-z] z/,
      :message => "Must be a valid email address"
  }
end

Пройдемся подробно:

  • Строка 1: Мы определяем класс Speaker, тот, что наследуется (<) от класса Base в (::) модулеActiveRecord.
  • Строки 2, 3, 5, 7, 8, 9, 10: все это вызовы способов.
  • Строка 15: закрываем определение класса (end).

«Подожди, вызовы способов, говоришь?»
Именно так!
«Это безумство! Мы же все еще в определении класса!»
(Нет, это Руби! ^_^ — прим. переводчика)

Во первых, значимо подметить, что в Ruby неявный self, тот, что, как и self:: в PHP, вызывает способы статически (это самая простая сходство). Это обозначает, что belongs_to :user эквивалентноself.belongs_to :user. Что здесь необычно, так это то, что эти способы (которые, вообще говоря, наследованы) вызываются в процессе определения класса. Эти способы могут быть определены (скажем, def self.foo) и вызваны (позже определения) внутри определения того же самого класса, либо унаследованы от его прародителя. Эти способы изменяют сам объект класса.

Ремарка: пока я писал данный пост, я наконец-то сам в полной мере понял, что написано в предыдущем абзаце, и потвиттился с коллегой по EngineYard mkb, тот, что помог каждому этому уложится в голове; можете посмотреть здесь — лаконично: классы определяются в процессе исполнения кода, это обозначает, что дозволено программно определять классы, и даже трудиться с ними в процессе определения.

Таким образом, то, что я думал, является свойством (validates), которое магически было определено двукратно, на самом деле вызов способа — припомните, я ранее упоминал про опциональность скобок при вызове способа. (Poetry mode это подлинно дюже комфортно и прекрасно, но припоминайте все же время от времени последние слова дяди Человека-Паука — «Огромная сила — огромная ответственность!» — прим. переводчика)

И что получилось?

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

 

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB