SlideShare a Scribd company logo
Рефакторинг и анализ
  Ruby и Rails кода
       Андрей Вокин
         JetBrains
Принцип 80-20

        • 20% времени – написание
          нового кода
        • 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
Инспекции кода в RubyMine
Интеграция тестовых фреймворков в
                    RubyMine

•   Графический интерфейс
•   Симуляция autotest
•   Навигация по стэктрейсу
•   Отлаживание тестов
Инспекции кода в RubyMine
Интеграция SimpleCov в RubyMine

• Отображение покрытия в Project Tree View
• Возможность переключения между разными прогонами
Интеграция SimpleCov в RubyMine
Рефакторинг с RubyMine

• Рефакторинги «понимают» Rails
• Можно откатить результат рефакторинга, минуя контроллер
  версий
Rename с RubyMine

• Rename локальной или глобальной переменной – это просто!
• Как насчет переименования Rails модели?
Rename с RubyMine
Rename с RubyMine
Rename с RubyMine
Резюме

• Используйте следующие статические инструменты для
  проверки вашего кода:
      Reek, Flay, Flog, Roodi, Saikuro, Metrics_fu

• Не забывайте про тесты:
       Heckle, RSpec, Cucumber, Autotest, RCov, SimpleCov

• Попробуйте RubyMine:
      http://jetbrains.com/ruby
Вопросы?

More Related Content

PDF
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
PPTX
Aspect-Oriented Programming in PHP
PPTX
TMPA-2015: The Application of Static Analysis to Optimize the Dynamic Detecti...
PDF
«Пуленепробиваемый фронтенд: разработка под React на TypeScript», Станислав П...
PDF
TMPA-2015: Multi-Module Application Tracing in z/OS Environment
PPTX
TMPA-2015: Standards and Standartization in Program Engineering. Why Would Yo...
PPTX
Dynamic Language Runtime
PPTX
Postman тестирование api v1.0 (1)
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
Aspect-Oriented Programming in PHP
TMPA-2015: The Application of Static Analysis to Optimize the Dynamic Detecti...
«Пуленепробиваемый фронтенд: разработка под React на TypeScript», Станислав П...
TMPA-2015: Multi-Module Application Tracing in z/OS Environment
TMPA-2015: Standards and Standartization in Program Engineering. Why Would Yo...
Dynamic Language Runtime
Postman тестирование api v1.0 (1)

What's hot (20)

PPTX
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
PPTX
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
PDF
Github Flow. Тестировщики против тестирования
PPTX
TypeScript
PDF
Rust: история языка и контекст применения
PPT
Внедрение аспектов в PHP с помощью библиотеки GO! AOP
PDF
Debbug Rails Application For Dummies
PPTX
неприятная правда про язык go
PDF
Keynote on JavaDay Omsk 2014 about new features in Java 8
PPTX
Аспектно ориентированное программирование для Java автоматизаторов
PPT
Cтатический анализ кода (на примере DDD-фреймворка)
PDF
Akka: как я перестал бояться и полюбил асинхронный код
PDF
2014-02-01 02 Дмитрий Малиновский. Почему нужно читать исходный код инстру...
PDF
Scala performance под капотом
PDF
TeaVM: dead code elimination and devirtualization
PDF
использование Ci на практике
ODP
PDF
20100321 virtualization igotti_lecture08
PDF
C# Desktop. Занятие 14.
PPT
Юнит тестирование в Web. Как получать пользу и удовольствие.
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
Github Flow. Тестировщики против тестирования
TypeScript
Rust: история языка и контекст применения
Внедрение аспектов в PHP с помощью библиотеки GO! AOP
Debbug Rails Application For Dummies
неприятная правда про язык go
Keynote on JavaDay Omsk 2014 about new features in Java 8
Аспектно ориентированное программирование для Java автоматизаторов
Cтатический анализ кода (на примере DDD-фреймворка)
Akka: как я перестал бояться и полюбил асинхронный код
2014-02-01 02 Дмитрий Малиновский. Почему нужно читать исходный код инстру...
Scala performance под капотом
TeaVM: dead code elimination and devirtualization
использование Ci на практике
20100321 virtualization igotti_lecture08
C# Desktop. Занятие 14.
Юнит тестирование в Web. Как получать пользу и удовольствие.
Ad

Viewers also liked (20)

PPTX
Rails for dummies
PPTX
Cпецкурс 2014, занятие 7. Web-приложения
PDF
10 reasons I love RubyOnRails
PDF
Фронтенд для рубиста
PDF
Assets Pipeline
PDF
PDF
RSpec. Part 2
PDF
Deploy.rb, Ilya Zykin, Rails club2016
PDF
RSpec. Part 3
PPTX
Rails Concerns
PPTX
Призма24 - Маркетплейсы.
ODP
I18n ruby-приложений
PPTX
развертывание среды Rails (антон веснин, Locum Ru)
PDF
Как сделать контрибут в Ruby on Rails
PPT
Александр Тищенко - "Антикризисная презентация"
ODP
Ruby on Rails for noobs
ODP
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
PDF
RSpec. Part 1
PDF
Когда технологий много - iForum 2013
PPTX
Why does code style matter?
Rails for dummies
Cпецкурс 2014, занятие 7. Web-приложения
10 reasons I love RubyOnRails
Фронтенд для рубиста
Assets Pipeline
RSpec. Part 2
Deploy.rb, Ilya Zykin, Rails club2016
RSpec. Part 3
Rails Concerns
Призма24 - Маркетплейсы.
I18n ruby-приложений
развертывание среды Rails (антон веснин, Locum Ru)
Как сделать контрибут в Ruby on Rails
Александр Тищенко - "Антикризисная презентация"
Ruby on Rails for noobs
Alexander Dymo - IT Jam 2009 - Ruby: Beaty Or The Beast
RSpec. Part 1
Когда технологий много - iForum 2013
Why does code style matter?
Ad

Similar to Refactorings with RubyMine (20)

PDF
PPTX
Code review как средство обеспечения качества программного обеспечения
ODP
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
PDF
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
PDF
Контроль за качеством кода
PDF
Why Ruby?
PDF
Корпоративное приложение на Rails
PDF
Покрываем тестами взрослый RoR проект / Николай Шебанов (Evrone)
PPTX
Ruby - или зачем мне еще один язык программирования?
PDF
Api devconf 2013
PPTX
разработка бизнес приложений (7)
PDF
A polyglot's view of Ruby on Rails – Leonid Shevtsov
PPT
JavaTalks.Unit Testing.Part 1
ODP
Top10 доводов против языка Ruby
KEY
Ruby basics
PPT
Ruby On Rails: Web-разработка по-другому!
PDF
Работа с унаследованным кодом. Есть ли жизнь после коммита.
PPTX
разработка бизнес приложений (8)
ODP
анализ кода: от проверки стиля до автоматического тестирования
PDF
Доклад Ильи Кудинова на DevConf 2013. "Организация автоматизированного тестир...
Code review как средство обеспечения качества программного обеспечения
Alexander Dymo - IT-клуб Николаева - April 2011 - Ruby: Beaty and the Beast
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
Контроль за качеством кода
Why Ruby?
Корпоративное приложение на Rails
Покрываем тестами взрослый RoR проект / Николай Шебанов (Evrone)
Ruby - или зачем мне еще один язык программирования?
Api devconf 2013
разработка бизнес приложений (7)
A polyglot's view of Ruby on Rails – Leonid Shevtsov
JavaTalks.Unit Testing.Part 1
Top10 доводов против языка Ruby
Ruby basics
Ruby On Rails: Web-разработка по-другому!
Работа с унаследованным кодом. Есть ли жизнь после коммита.
разработка бизнес приложений (8)
анализ кода: от проверки стиля до автоматического тестирования
Доклад Ильи Кудинова на DevConf 2013. "Организация автоматизированного тестир...

Refactorings with RubyMine

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