Рефакторинг и анализ Ruby и Rails кода Андрей Вокин JetBrains
Принцип % времени – написание нового кода 80% времени – поддержание существующего кода
Code that smells Runtime errors Runtime warnings Неиспользуемый код Дублированный код Большие и сложные методы Нарушение code-style соглашений Нарушение паттернов фреймворка
Два подхода к оценке качества кода Статические инструменты: Reek, Flay, Flog, Roodi, Saikuro, Metrics_fu Инструменты времени выполнения: Heckle, RSpec, Cucumber, Autotest, RCov, SimpleCov
Статические инструменты Проверяют код без его исполнения Отсутствуют side-эффекты Просты в использовании При этом: Их достаточно сложно реализовать Много ложных срабатываний Неполное понимании «магии» Rails
Reek Имена классов, методов, переменных, модулей Использование instance_of?, kind_of?, is_a? вместо полиморфизма Дублированный код Большие классы, методы Большое количество параметров метода Вложенные итераторы
Flog Присваивания Ветвления Вызовы Балловая система На методы с наибольшим количеством баллов стоит взглянуть повнимательнее
Flay Ищет дублирование кода Анализирует структуру Игнорирует разницу в наименовании переменных, констант и пробелах Фрагменты кода, указанные Flay - кандидаты на рефакторинг
Roodi Присваивание в условиях Блоки case без использования else Большие модули, классы и методы Неправильные имена модулей, классов и методов Цикломатическая сложность
Saikuro, Metric_fu Saikuro Цикломатическая сложность Metric_fu Создает отчет по результатам работы Saikuro, Flay, Flog, Reek, Roodi
Что такое цикломатическая сложность? M = E – N + 2P E - количество переходов N – количество элементов P – количество компонент связности
Runtime инструменты Проверяют код, исполнив его Учитывают «магию» Rails и все тонкости Ruby При этом: Могут иметь side-эффекты Каждый тест работают до первого падения
Runtime инструменты Тестирование кода RSpec, Cucumber, Autotest Оценка покрытия кода тестами RCov, SimpleCov, Heckle
RCov, SimpleCov Встраиваются в запуск тестов Запоминают строки, исполненные во время работы тестов После работы создают отчет о покрытии кода тестами Понимают структуру Rails приложения (пропускают config, envoronment…)
Heckle Любое логическое изменение кода, полностью покрытого тестами, должно вызывать падение теста Подход Heckle Внести изменение в код Запустить тесты Проверить, что упал как минимум один тест
Интеграция инструментов оценки качества кода в RubyMine Моментальные инспекции кода Интеграция тестовых фреймворков (с графическим интерфейсом) Графическая интеграция SimpleCov
Инспекции кода в RubyMine Учитывают межфайловое взаимодействие Понимают DSL Rails Не требуют отдельного запуска – работают на лету
Инспекции кода в RubyMine
Если программно можно искать проблемы в коде… то можно автоматически и исправлять их
Инспекции кода в RubyMine
Интеграция тестовых фреймворков в RubyMine Графический интерфейс Симуляция autotest Навигация по стэктрейсу Отлаживание тестов
Инспекции кода в RubyMine
Интеграция SimpleCov в RubyMine Отображение покрытия в Project Tree View Возможность переключения между разными прогонами
Интеграция SimpleCov в RubyMine
Рефакторинг с RubyMine Рефакторинги «понимают» Rails Можно откатить результат рефакторинга, минуя контроллер версий
Rename с RubyMine Rename локальной или глобальной переменной – это просто! Как насчет переименования Rails модели?
Rename с RubyMine
Резюме Используйте следующие статические инструменты для проверки вашего кода: Reek, Flay, Flog, Roodi, Saikuro, Metrics_fu Не забывайте про тесты: Heckle, RSpec, Cucumber, Autotest, RCov, SimpleCov Попробуйте RubyMine:
Вопросы?