RubyMine: IDE для Ruby (часть 1).Автор: Виктор Деревянко Опубликовано: 30.07.2009 Источник: SoftKey.info Язык программирования Ruby активно набирает популярность. Мощный объектно-ориентированный интерпретируемый язык высокого уровня, грамотно спроектированный и весьма удобный. Основной недостаток Ruby - сравнительно низкая скорость работы, - уже устранен в его следующей версии (Ruby 1.9). Все больше программистов интересуются Ruby, все больше компаний начинают применять его в свой работе. Популярности Ruby способствует наличие веб-ориентированной среды разработки Ruby on Rails, предоставляющей простой, быстрый и удобный способ разработки веб-приложений любого уровня сложности. А ведь все идет к тому, что будущее за веб-приложениями. Так что рост популярности Ruby вполне закономерен.
Хотя часть Ruby-разработчиков по-прежнему работают в обычных текстовых редакторах, типа TextMate, Vim и Emacs, многие предпочитают интегрированные среды разработки (IDE). Это не удивительно. Современные IDE обеспечивают программисту массу удобных возможностей, исключая рутину и способствуя значительному ускорению процесса разработки. Трудно переоценить возможности хорошего рефакторинга, автозавершения кода и удобного отладчика. Беда только, что IDE для Ruby еще весьма не совершенны. Правда, в последнее время ситуация стремительно меняется.
Совсем недавно появилась новая среда разработки для Ruby - RubyMine от компании JetBrains. Это кроссплатформенная IDE, построенная на платформе IntelliJ IDEA, одним из флагманских продуктов компании. Платформа IntelliJ IDEA разрабатывается с 2001 года. К настоящему времени, это мощнейшая IDE, обеспечивающая разработчиков наиболее полным комплектом средств разработки. Рефакторинг и анализ кода, полноценный отладчик, мощный редактор, встроенная поддержка систем контроля верстки и тестирования кода и т.д. и т.п.
IntelliJ IDEA позволяет вести разработку на множестве различных языков программирования. В 2007 году для IntelliJ IDEA был выпущен плагин, реализующий возможности вести разработку и на Ruby. А теперь вот появилась отдельная IDE RubyMine. Зачем - понятно. RubyMine - это отдельный продукт, который можно использовать не покупая IntelliJ IDEA.
Функциональность RubyMine и Ruby-плагина для IntelliJ IDEA практически схожа. Разница в том, что RubyMine использует более новую версию IntelliJ IDEA, чем так, которая доступна в настоящий момент на сайте компании. После выхода IntelliJ IDEA 9, возможности RubyMine и плагина для IntelliJ IDEA сравняются.
По замыслу разработчиков, RubyMine - это первая в серии легковесных IDE, построенных на платформе IntelliJ IDEA. Планируются и другие версии IDE - для веб-разработки (HTML/CSS/JS/PHP), Python и т.п.
RubyMine выгодно отличается от других IDE для Ruby по ряду параметров. Во-первых, RubyMine проводит глубокий анализ кода и способна выводить типы локальных переменных и типы возвращаемых методами значений. За счет этого обеспечивается высокое качество механизмов рефакторинга, автозавершения и валидации кода. Во-вторых, RubyMine поддерживает Ruby On Rails. Причем поддержка Rails встроена на самом низком уровне. Средства рефакторинга учитывающие структуру Rails приложения, отдельный вид для просмотра структуры Rails-проекта, специальные средства навигации, Rail-консоль, поддержка RHTML и YAML и т.д. Кроме того, RubyMine поддерживает множество технологий, напрямую связанных с Ruby-разработкой: RSpec, Cucumber, Rake, Test::Unit, Test-Spec. Наконец, RubyMine поддерживает не только Ruby, но и другие языки используемые при разработки веб-приложений - HTML, CSS, JavaScript, XML. Поддерживает на хорошем уровне, со средствами рефакторинга и анализа кода. Другими словами, для Rails-разработчика RubyMine - ценнейший инструмент.
В первой части статьи мы рассмотрим возможности RubyMine по редактированию, навигации и отладки кода. Вторая часть будет посвящена "тяжелой артиллерии" - поддержке Rails, систем контроля версий и автоматизации тестирования.
Интерфейс, средства редактирования и навигации
В RubyMine можно создавать проекты двух типов - для Ruby-разработки и для разработки Rails-приложения. В последнем случае для приложения создается готовая инфраструктура. Чтобы создать новый проект для уже готового приложения, достаточно указать RubyMine директорию с исходными кодами.
Расположение окон в RubyMine соответствует общепринятым стандартам. Слева расположен менеджер проекта, справа - окно редактора, снизу - панель, отображающая разнообразные дополнительные окна - список TODO, окно предварительного просмотра, результаты инспекции кода, список зависимостей и т.д.
В менеджере проекта две вкладки - Project и Structure. На вкладке "Structure" показывается структура классов, объявленных в текущем файле. На вкладке "Project" - структура файлов проекта и список используемых джемов. Вкладка позволят просматривать структуру файлов в двух режимах: "Project" (структура директорий) и "Rails" (структура Rails-приложения, с разделением файлов по моделям, контроллерам и видам).
Редактор в RubyMine просто отличный. В нем есть все. Подсветка синтаксиса, возможности схлапывания частей кода, форматирования кода в соответствии с параметрами стиля кодирования, автоматическое закрывание и подсветка скобочек, команды быстрого комментирования кода и т.д.
Средства навигации по коду очень мощные. Можно найти буквально все и везде. В Ruby-коде можно искать вхождения методов, классов, переменных, параметров, полей и т.п. В файлах CSS, XML и HTML - вхождения стилей, классов, тэгов и атрибутов. Причем имеется три варианта поиска вхождений идентификаторов. Найденные вхождения могут быть показаны на отдельной панели (с детальной информацией), представлены в виде контекстного меню (для быстрого перехода к выбранному участку кода) или же подсвечены прямо в тексте программы.
 | | Интерфейс RubyMine. Показаны три варианта поиска вхождения идентификатора Image2Controller | RubyMine поддерживает шаблоны кода ("live templates", то же самое что "code snippets"). Для каждого шаблона определен короткий идентификатор, по которому шаблон удобно находить в общем списке шаблонов.
В редакторе очень удобно работать с клавиатуры. Во-первых, все без исключения списки в RubyMine имеют возможность быстрой фильтрации. Это просто шикарная возможность. Во-вторых, с клавиатуры можно подать абсолютно любую команду. Даже если вы не помните требуемое клавиатурное сокращение, вы можете открыть полный список команд, найти и вызвать нужную команду. Редактор поддерживает несколько стандартных клавиатурных схем, в том числе, для Visual Studio, Emacs и TextMate - выбирай привычную.
Анализ кода и рефакторинг
RubyMine умеет анализировать код программы. На этом базируется несколько возможностей IDE: автозавершение кода, подсветка ошибок, рефакторинг, отслеживание зависимостей и отслеживание намерений ("intention actions").
В IntelliJ IDEA имеется несколько режимов автозавершения кода. RubyMine поддерживает лишь базовый, когда среда анализирует контекст и предлагает все варианты, достижимые для текущей позиции курсора. Другие типы автозаполнения (SmartType и ClassName) в RubyMine пока не поддерживаются, хотя эти команды и присутствуют в главном меню.
 | | Переименование идентификатора средствами рефакторинга | Рефакторинг в RubyMine - на высоте. Поддерживаются следующие методы рефакторинга:
- переименование ("Rename refactoring");
- выделение кода в отдельный метод ("Extract Method"), в том числе метод, возвращающий сразу несколько значений;
- введение переменной ("Introduce Variable");
- замещение метода ("Override Method");
- извлечение части кода ("extract partial"; выделяет выбранную часть HTML в отдельный файл и создает соответствующую Rails-конструкцию "render:partial" вместо исходного HTML-кода).
RubyMine поддерживает пока существенно меньше методов рефакторинга, чем IntelliJ IDEA, однако уже в ближайших версиях RubyMine их количество увеличится. RubyMine позволяет предварительно просматривать список изменений, которые будут внесены при рефакторинге, и запрещать ненужные изменения. Все внесенные изменения можно отменять все сразу. Средства рефакторинга работают во всех поддерживаемых языках, в том числе в случаях, когда языки смешаны. Например, при рефакторинге будет корректно отредактирован Ruby-код, входящий в HTML-файлы.
 | | Инспекция кода и функция "Intention actions" | Отдельно следует отметить наличие функции отслеживания намерений ("Intention actions"). В процессе работы пользователя над кодом, RubyMine анализирует код, находит синтаксические ошибки и определят места в коде, которые можно улучшить или оптимизировать. В случае обнаружения подобного проблемного кода, RubyMine не просто сообщает об ошибке подчеркиванием кода, но и определяет, что именно пользователь намеревался сделать. И предлагает один или несколько способов исправления кода. Рядом с проблемным местом в коде появляется значок лампочки, сигнализирующий о проблеме. Нажав на него, можно посмотреть список предлагаемых решений. Использовать или не использовать предлагаемое решение - решать вам. Но если вы решаете его использовать, то RubyMine вносит соответствующие исправления в код автоматически. Типичные примеры ошибок, которые отслеживаются и корректируются таким образом, это нарушение стиля кодирования, неразрешимая Ruby-ссылка, неиспользуемая локальная переменная, недостижимый код и т.д. RubyMine поддерживает отслеживание намерений, не только для Ruby, но и для HTML, XML, CSS, JavaScript и т.п.
Намерения определяются налету, в процессе фонового анализа кода. Помимо этого, RubyMine позволяет провести анализ кода по требованию, при котором анализируется весь код проект в целом ("Inspection"). В процессе такого анализа RubyMine найдет все проблемные места в коде и выведет полный список с детальными пояснениями. Любую найденную проблему можно исправить вручную или через механизм отслеживания намерений.
 | | Просмотр зависимостей с помощью Dependency Viewer | Еще один полезный инструмент - Dependency Viewer. С его помощью можно отслеживать наличие зависимостей между различными файлами проекта. Dependency Viewer позволяет выбрать два зависящих друг от друга файла, после чего показывает детальный список найденных зависимостей.
Запуск и отладка приложения
RubyMine позволяет запускать различные типы приложений: Rails, Rake, Ruby, RSpec, Cucumber, Ruby remote debug, Test-Spec, Test::Unit. Для каждого варианта запуска создается отдельная конфигурация, причем "Release" и "Debug" конфигурации задаются отдельно.
 | | Настройка параметров конфигурации запуска | Отладчик в RubyMine построен на том же движке, что и отладчики в других IDE и, по большому счету, имеет те же самые возможности. Поддерживаются точки прерывания, в том числе, условные точки прерывания. Можно просматривать стек вызовов, значения локальных переменных, список потоков. Есть возможность пошаговой отладки и вычисления выражений. Есть возможность удаленной отладки и анализ стека.
 | | Отладка в RubyMine | RubyMine позволяет, так же, запускать консоли IRB и Rails, в которых команды можно подавать в интерактивном режиме.
Технологии и версии Ruby
Текущая версия RubyMine - 1.1.1. Программа поддерживает MRI Ruby 1.8.x, JRuby, IronRuby и MacRuby. Поддержки Ruby 1.9 пока нет (она планируется в RubyMine 1.5). Начиная с RubyMine 1.1. поддерживается Cucumber. Помимо Ruby, RubyMine позволяет работать с языками RHTML, JavaScript, HTML/XHTML/CSS, XML и HAML.
Выводы
Первая версия RubyMine появилась совсем недавно, однако она производит впечатление зрелого и мощного продукта. Сказывается наследие IntelliJ IDEA. Шикарный редактор, мощные средства навигации и анализа кода. Работать удобно - все команды можно подавать прямо с клавиатуры, мышка практически не требуется. Во всех списка есть быстрый фильтр, позволяющий мгновенно находить нужный элемент списка. RubyMine хорошо настраивается - можно выбрать удобную клавиатурную схему, цветовую схему, настроить правила форматирования кода.
Несмотря на то, что RubyMine может быть использована для разработки любого Ruby-приложения, больше всего преимуществ от ее использования получат Rails-разработчики. Именно они - целевая аудитория данной IDE. В следующей части статьи речь пойдет о функционале RubyMine, направленном на оптимизацию работы с Rails-приложениями, поддержке систем автоматического тестирования и интеграции с системами контроля версий. |