Download - Refactorings with RubyMine
![Page 1: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/1.jpg)
Рефакторинг и анализ Ruby и Rails кода
Андрей Вокин
JetBrains
![Page 2: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/2.jpg)
Принцип 80-20
• 20% времени – написание нового кода
• 80% времени – поддержание существующего кода
![Page 3: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/3.jpg)
Code that smells
• Runtime errors• Runtime warnings• Неиспользуемый код• Дублированный код• Большие и сложные методы• Нарушение code-style соглашений• Нарушение паттернов фреймворка
![Page 4: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/4.jpg)
Два подхода к оценке качества кода
• Статические инструменты:Reek, Flay, Flog, Roodi, Saikuro, Metrics_fu
• Инструменты времени выполнения:Heckle, RSpec, Cucumber, Autotest, RCov,
SimpleCov
![Page 5: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/5.jpg)
Статические инструменты
• Проверяют код без его исполнения• Отсутствуют side-эффекты• Просты в использовании
При этом:• Их достаточно сложно реализовать• Много ложных срабатываний• Неполное понимании «магии» Rails
![Page 6: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/6.jpg)
Reek
• Имена классов, методов, переменных, модулей• Использование instance_of?, kind_of?, is_a? вместо
полиморфизма• Дублированный код• Большие классы, методы• Большое количество параметров метода• Вложенные итераторы
![Page 7: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/7.jpg)
Flog
• Присваивания• Ветвления• Вызовы
• Балловая система• На методы с наибольшим количеством баллов стоит
взглянуть повнимательнее
![Page 8: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/8.jpg)
Flay
• Ищет дублирование кода• Анализирует структуру• Игнорирует разницу в наименовании переменных,
констант и пробелах
• Фрагменты кода, указанные Flay - кандидаты на рефакторинг
![Page 9: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/9.jpg)
Roodi
• Присваивание в условиях• Блоки case без использования else• Большие модули, классы и методы• Неправильные имена модулей, классов и методов• Цикломатическая сложность
![Page 10: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/10.jpg)
Saikuro, Metric_fu
• SaikuroЦикломатическая сложность
• Metric_fuСоздает отчет по результатам работы Saikuro,
Flay, Flog, Reek, Roodi
![Page 11: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/11.jpg)
Что такое цикломатическая сложность?
• M = E – N + 2P• E - количество
переходов• N – количество
элементов• P – количество
компонент связности
![Page 12: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/12.jpg)
Runtime инструменты
• Проверяют код, исполнив его• Учитывают «магию» Rails и все тонкости Ruby
При этом:• Могут иметь side-эффекты• Каждый тест работают до первого падения
![Page 13: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/13.jpg)
Runtime инструменты
• Тестирование кодаRSpec, Cucumber, Autotest
• Оценка покрытия кода тестамиRCov, SimpleCov, Heckle
![Page 14: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/14.jpg)
RCov, SimpleCov
• Встраиваются в запуск тестов• Запоминают строки, исполненные во время работы
тестов• После работы создают отчет о покрытии кода тестами
• Понимают структуру Rails приложения (пропускают config, envoronment…)
![Page 15: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/15.jpg)
Heckle
• Любое логическое изменение кода, полностью покрытого тестами, должно вызывать падение теста
Подход Heckle• Внести изменение в код• Запустить тесты• Проверить, что упал как минимум один тест
![Page 16: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/16.jpg)
Интеграция инструментов оценки качества кода в RubyMine
Моментальные инспекции кода
Интеграция тестовых фреймворков (с графическим интерфейсом)
Графическая интеграция SimpleCov
![Page 17: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/17.jpg)
Инспекции кода в RubyMine
• Учитывают межфайловое взаимодействие• Понимают DSL Rails• Не требуют отдельного запуска – работают на лету
![Page 18: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/18.jpg)
Инспекции кода в RubyMine
![Page 19: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/19.jpg)
Инспекции кода в RubyMine
![Page 20: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/20.jpg)
Если программно можно искать проблемы в коде…
то можно автоматически и исправлять их
![Page 21: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/21.jpg)
Инспекции кода в RubyMine
![Page 22: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/22.jpg)
Инспекции кода в RubyMine
![Page 23: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/23.jpg)
Интеграция тестовых фреймворков в RubyMine
• Графический интерфейс• Симуляция autotest• Навигация по стэктрейсу• Отлаживание тестов
![Page 24: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/24.jpg)
Инспекции кода в RubyMine
![Page 25: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/25.jpg)
Интеграция SimpleCov в RubyMine
• Отображение покрытия в Project Tree View• Возможность переключения между разными прогонами
![Page 26: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/26.jpg)
Интеграция SimpleCov в RubyMine
![Page 27: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/27.jpg)
Рефакторинг с RubyMine
• Рефакторинги «понимают» Rails• Можно откатить результат рефакторинга, минуя
контроллер версий
![Page 28: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/28.jpg)
Rename с RubyMine
• Rename локальной или глобальной переменной – это просто!
• Как насчет переименования Rails модели?
![Page 29: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/29.jpg)
Rename с RubyMine
![Page 30: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/30.jpg)
Rename с RubyMine
![Page 31: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/31.jpg)
Rename с RubyMine
![Page 32: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/32.jpg)
Резюме
• Используйте следующие статические инструменты для проверки вашего кода:
Reek, Flay, Flog, Roodi, Saikuro, Metrics_fu
• Не забывайте про тесты:Heckle, RSpec, Cucumber, Autotest, RCov, SimpleCov
• Попробуйте RubyMine:http://jetbrains.com/ruby
![Page 33: Refactorings with RubyMine](https://reader035.vdocuments.pub/reader035/viewer/2022062510/54b61bc34a795998448b4638/html5/thumbnails/33.jpg)
Вопросы?