Компьютерное программирование — это то, что можно изучить только путем практики. Чтобы хорошо и быстро изучить язык программирования, необходимо использовать его как можно чаще. Раз вы читаете эту статью, то вы уже для себя решили, что изучение программирования — это полезная для вас инвестиция в будущее. Я попробую помочь вам начать работать с Ruby, используя фреймворк Rails.
Ruby и Rails
Rails настолько тесно связан с самим Ruby, что порой сложно отличить одно от другого. Но разница велика: Ruby — это язык программирования, в то время как Rails — всего лишь фреймворк, написанный для Ruby. Часто из-за уравнивания этих вещей происходят конфликты, особенно часты случаи, когда разработчиков, специализирующихся на разработке на Ruby, хантят, как разработчиков специализирующихся на Ruby on Rails. Важно понимать, что Ruby — это не Rails. Документация Ruby дополняется документаций Rails.
Фреймворк Rails внёс огромный вклад в развитие языка Ruby, и именно в последнее время, вместе с появлением Rails, интерес к Ruby стал стремительно возрастать. Так что, если у вас есть желание научиться создавать различные web-приложения и не только на Rails, то можно одновременно изучать и Ruby, и Rails.
На просторах интернета существуют тысячи статей, в которых описано создание RoR блога за 15 минут (признаюсь честно: когда я начинал, уложиться в 15 минут ни разу не получалось). Вы можете использовать любой гайд, который вам понравится. В своей статье я приведу некоторые наблюдения, рекомендации и список основных гемов (или gems — так в руби называются библиотеки), которые желательно иметь в своём пет-проекте и которыми нужно уметь пользоваться, если вы планируете работать на RoR.
Для начала, хочу поделиться двумя источниками, которые я применяю в работе:
Настройка окружения
Первым делом нужно настроить окружение. Лучшими операционными системами будут Linux (например, Ubuntu) и Mac OS. Ситуация с Windows на данный момент обстоит не лучшим образом, и я бы не рекомендовал тратить своё время и нервы, хотя в будущем все может измениться. Недавно компания Microsoft выпустила обновление для Windows 10, которое позволяет установить «Bash on Ubuntu on Windows Linux Subsystem». Но даже сама формулировка звучит жутко, и пока что всё работает нестабильно, так что остается надеяться и ждать.
Хороший ресурс для настройки окружения — Go Rails. Тут описаны настройки для Ubuntu, Mac OS и для Windows. Ресурс в целом полезен и достоин места в копилке полезных ссылок RoR-разработчика.
Интересное наблюдение.Первые несколько раз настройки окружения редко заканчиваются успехом, может потребоваться не одна попытка. В то же время все те ошибки, которые вы совершите в начале необходимы, чтобы никогда больше к ним не возвращаться. Зачастую эти ошибки происходят из-за пропуска одного из пунктов. Также, если вы используете RVM, советую использовать файлы .ruby-version и .ruby-gemset. По завершении настройки, вы сможете создавать новые Rails-приложения и запускать сервер.
Полезная информация.По умолчанию rails сервер использует
Установка Ruby Gems в проект
Ниже я приведу список гемов, умение работать с которыми обязательно для RoR-разработчика любого уровня. Они позволят создать своё первое приложение, обладающее достаточным функционалом для того, чтобы можно было удовлетворить до 80% требований заказчиков.
Для установки Ruby Gems (или гемов) в Rails-проект вам понадобится утилита Bundler. Она управляет версиями гемов и их зависимостями. Список гемов, которые применяются в проекте, находится в файле gemfile.
Полезные Ruby Gems
Gem Devise — отличный гем для создания аутентификации в вашем приложении. После установки и некоторых махинаций у вас появится возможность регистрироваться в системе, логиниться и т. д.
Gem PaperClip — гем для загрузки файлов и картинок. У пользователей, которые зарегистрировались через гем Devise, должна быть возможность добавить аватарки.
Gem Kaminari —позволит добавить пагинацию в приложение, что очень полезно. Согласитесь, что одновременная загрузка тысяч комментариев под статьей сделает бегунок скролла тонкой полоской, а поиск нужного комментария — затруднительной задачей.
Gem twitter-bootstrap-rails — подключает инструментарий, разработанный компанией Twitter. Включает в себя различные стили и верстку, применение которых сделает ваше приложение более приятным глазу.
Gem jquery-rails — JavaScript — это хорошо, но работодатели требуют знание фреймворков, например, jQuery. Использование его упростит работу с JavaScript и позволит сделать приложение более динамичным.
Gem cancancan — руководит правами доступа к различным ресурсам на сайте, вместо того, чтобы писать проверки в каждом методе. Логика, контролирующая доступ, выносится в отдельный файл.
Gems byebug’/ ‘pry-rails — гемы для отладки и дебаггинга. Позволяют создавать брейкпоинты в приложении, добавляя в вызов метода, где это необходимо.
Gem rspec — мощный инструмент для написания автоматических тестов.
Gem capistrano — инструмент для деплоя.
Gem mina — гемы для деплоя. Локальный сервер — это хорошо, но толку от него мало, нужно, чтобы вашим ресурсом пользовались другие люди. Также ссылку на свой продукт можно будет указать в резюме, что значительно повысит вашу ценность.
Gem rubocop — один из важнейших гемов. У каждого языка — свой style guide (предпочтения к форматированию текста кода). В Ruby это rubocop. Он поможет вам писать код так, чтобы в вас не кидались камнями люди, которые будут работать с вашим кодом. Несмотря на то, что rubocop — всего лишь набор пожеланий к оформлению, на начальных стадиях он может научить многому. Анализируя код, он выделяет те места, которые оформлены неверно, а также предлагает рекомендации по его улучшению. Именно эти рекомендации помогут вам лучше изучить Ruby. Также некоторые правила можно отредактировать.
Рекомендации к написанию кода
В rubocop указана максимальная длина строки 80 символов, однако для современной веб-разработки этого недостаточно. Для большинства случаев 120 символов должно хватить.
Может возникнуть вопрос (особенно у людей, имеющих опыт работы с другими языками программирования): почему отступ — это два пробела, а не табуляция? Вокруг этого вопроса часто разгораются горячие дискуссии. Мой совет: просто примите этот факт и не тратьте время на размышления и споры.
Существует ограничение количества строк в методе, и для этого есть веская причина. Нужно соблюдать принцип единственной ответственности (первая буква акронима SOLID). Если метод слишком большой — он выполняет лишнюю работу и требует рефакторинга.
Хороший пример указан в книге Сэнди Метц «Ruby. Объектно-ориентированное проектирование»:
def diameters wheels.collect do |wheel| wheel.rim + (wheel.tire * 2) end end
Данный метод не превышает ограничение по количеству строк, однако нарушает принцип единственной ответственности. У него две обязанности: он осуществляет обход всех элементов wheels и вычисляет диаметр каждого колеса. Если разделить этот метод на два, каждый из которых будет выполнять лишь одно действие, то получится:
# обход всех элементов массива def diameters wheels.collect { |wheel| diameter(wheel) } end # вычисление диаметра одного колеса def diameter(wheel) wheel.rim + (wheel.tire * 2) end
Подобное разделение методов не только будет соответствовать принципу единственной ответственности, а также будет проще поддерживать такой код и не выходить за ограничения, наложенные рубокопом.
Подобное ограничение существует и касательно классов. Смысл тот же, однако бывают ситуации, когда класс выходит за рамки без возможности логического разделения его на подклассы.
В реальной жизни существуют немного иные ситуации. Например:
class Gear # . . . # Передаточное отношение в дюймах def gear_inches ratio * diameter # Диаметр колеса def diameter wheel.rim + (wheel.tire * 2) end # . . . end
В данном классе велосипедной передачи вычисляется передаточное отношение, которое используется для сравнения велосипедов, отличающихся как передачами, так и размерами колес. Также в нём присутствует метод, высчитывающий диаметр колеса, — логичнее было бы его вынести в класс Wheel. Однако стоит ли создавать отдельный класс ради одного метода, который используется в единственном случае? Окупятся ли силы на это пользой, которую принесет подобное изменение?
В реальной работе подобные вопросы часто встают перед разработчиком. Лучшим решением будет подождать поступления дополнительной информации. Возможно, придется вообще убрать расчёт диаметра и заменить его готовым значением, которое будет вводить пользователь. Также могут появиться дополнительные требования, для которых будут необходимы не только вычисления диаметра колеса, а и других функций, касающихся колеса. Когда будущие потери от бездействия равны стоимости приложенных усилий сегодня, отложите решение. Принимайте его только тогда, когда поступившая к вам информация требует сделать это незамедлительно.
Итого
Если хороший способ учиться программированию — это практика, то лучший состоит в том, чтобы найти решение проблемы. Если у вас есть идея приложения, с помощью которого вы можете решить эту проблему, вы будете гораздо более успешны. Как только вы начнете изучать основы, разберитесь, что именно нужно делать и просто примените это на деле. Все хорошие программисты учатся путем проб и ошибок.