Рефакторинг как положено. Часть 3 — важнейшие шаги

Дата публикации:

И снова рефакторинг. Наконец, мы подобрались к самому главному.

Быстрые результаты

Перед началом написания тестов мы поправили стиль кода, но не трогали логику. С этим все более менее ясно. А одной из главных проблем, с которой мы столкнулись, стал код, написанный на Ruby, но без использования Ruby. Поэтому нашим первым шагом будет избавление от таких конструкций.

Поехали. С помощью Rubocop и Rubycritic или codeclimate мы ищем самые явные косяки в коде, относящиеся к логике, которую мы рефакторим. Далее мы переключаемся на поиски мини-костылей. Локальные имплементации «map», «select», «detect» и т.д. После этого — убираем код, логику которого следует реализовывать на уровне базы данных.

->

Тесты проходят, и мы движемся дальше.

Поиск явных дублей в коде

Эту часть работы также можно бы было отнести к быстрым результатам. Однако на данном этапе код еще недостаточно знаком, для того чтобы найти все неявные дубли и ошибки в проектировании. А вот избавиться от явных дублей — самое то. Для этого мы используем Flay gem, который, кстати, входит в состав «rubycritic».

Первые шаги рефакторинга

Рефакторим контроллеры

Начинаем с контроллеров. Первым делом выносим из контроллеров то, что должно быть в модели: скоупы, валидации и все операции с данными. В общем, в контроллере должна быть только та логика, которая относится к управлению.

Небольшой чеклист:

  • В контроллере нет бизнес-логики.
  • В контроллере нет управляющих конструкций, отличных от if success? then respond_with_success else respond_with_error end.
  • Контроллер ничего не знает об устройстве данных. Чтобы сделать пользователя активным, нужно вызвать current_user.activate! а не current_user.update(status: ‘active’).
  • У нас нет дублирующейся логики для new, create, edit, update actions. Записи строятся/находятся в before_action.
  • Если в action методах у нас отсутствует возможность проверки выполнения этого экшна — выносим в before_filter.

После того, как мы вынесли из методов контроллера всю логику, в нем все еще остается неправильная структура. Rails контроллеры должны быть REST контроллерами, то есть — работать только с одним ресурсом. Однако мы часто наблюдаем картину, когда разработчики не различают понятия ресурс и модель. И в результате приходится получать на рефакторинг контроллеры в несколько сотен строк.

Давайте рассмотрим реальный пример процесса чекаута:

Этот пример описывает процесс оплаты покупки. Если пользователь не зарегистрирован, он имеет возможность зарегистрироваться или моментально восстановить пароль. Далее юзер подтверждает заказ, выбирает форму оплаты (карта или PayPal) и после зачисления средств видит success экран.

Что же мы видим? Мы видим довольно много методов в одном контроллере. Их код не всегда говорит о том, зачем они нужны, в каком порядке вызываются и т.д. То есть методы вообще ничего не говорят о процессе рефакторинга. За исключением шагов, которые он в себя включает. Кроме того, здесь могут присутствовать  legacy методы. Они знамениты тем, что больше не используются, но вводят программистов в заблуждение. Нам же вполне очевидно, что вспомогательные методы cart и redirect_to paypal не нужны во всех экшенах.

И что мы сделали? С помощью логов Rails сервера составили диаграмму процесса оплаты и следующую структуру:

“select_conf” внезапно оказался не экшеном, а вспомогательным методом. Кроме того, мы добавили корзину в базовый контроллер (она нужна не всем потокам и это не есть идеально). Но так мы можем наблюдать баланс между читаемостью, надежностью кода и потраченным временем.

Контроллер корзины — начало процесса оплаты:

Авторизация и регистрация, если пользователь еще не авторизован:

Собственно, оплата. Если выбрана карта — показываем экран подтверждения. В противном случаем — отправляем платить на PayPal.

Со страницы подтверждения или из PayPal данные попадают на “OrderController”, который проводит данные о заказе и отображает его пользователю.

Если у нас все получилось, отправляем пользователя на метод “show” этого же контроллера. Если нет — на страницу оплаты. И отображаем ошибки.

Как видите, у нас получилось разделить один контроллер на пять маленьких, легко читаемых и, что самое главное — отвечающих только за одну конкретную задачу. Бинго!

Рефакторим представления

С представлениями все довольно просто, поэтому ограничимся чеклистом.

  • Используем haml или slim.
  • Повторяющиеся куски выносим в партиалы.
  • Во вью не должно быть логики. Выносим ее в хелперы.
  • Инстанс переменные контроллера должны быть только непосредственно в текущем представлении. Во все паршиалы и хелперы передаются через параметры. Иногда от инстанс переменных можно уйти в пользу “helper_method” контроллера.

Вывод

Главный посыл этой статьи заключается в том, что вам следует найти баланс между качеством кода и временем, которое вы тратите на задачу. Рефакторинг — это процесс, который зависит от последовательности выполняемых действий. Упустили всего одну деталь, и результат может оказаться плачевным. Ключом же к успеху является грамотный план и список контрольных точек. В качестве примера вы можете использовать наши статьи. В следующей публикации мы поговорим о рефакторинге моделей. Она обязательно поможет вам сделать код еще чище. Не переключайтесь!

Мы Крым Диджитал

С 2015 года мы предоставляем полный цикл услуг мобильной и веб-разработки клиентам из различных отраслей и разных стран.

Подпишись
на наши новости

Контакты пресс-службы

+ 7 (926) 118-80-32

WhatsApp, Viber, Telegram

Давайте обсудим Ваш проект

или свяжитесь с нами по почте projects@crimeadigital.ru

Нажимая кнопку «Отправить», вы даете согласие на обработку персональных данных

Заполните форму или свяжитесь
удобным для Вас способом

Контакты

г. Севастополь, ул. Руднева, д.41, 4 этаж технопарк ИТ-Крым +7 978 679-76-353 agro@crimeadigital.ru

Социальные сети

Нажимая на кнопку, вы даете согласие на обработку персональных данных и соглашаетесь c политикой конфиденциальности

Крым Диджитал приняла участие в стратегической сессии

Руководители Крым Диджитал приняли участие в стратегической сессии, которая прошла на базе СевГУ 10 июня. Вместе с Правительством Севастополя, Институтом информационных технологий и управления в технических системах СевГУ и приглашенными ИТ-компаниями города обсудили перспективу развития системы высшего образования в Севастополе.Представители бизнеса, власти и образовательной системы выступали со своим видением будущих потребностей региона в кадрах, поднимали насущные вопросы обучения студентов, прохождения практики и дальнейшего трудоустройства. Крым Диджитал является амбассадором идеи образования и взращивания молодых кадров, развивает образовательные проекты и на протяжении 5 последних лет ведет активную работу в направлении поддержки и развития молодых специалистов ИТ-отрасли Крыма.

Руководители Крым Диджитал приняли участие в стратегической сессии, которая прошла на базе СевГУ 10 июня.

Вместе с Правительством Севастополя, Институтом информационных технологий и управления в технических системах СевГУ и приглашенными ИТ-компаниями города обсудили перспективу развития системы высшего образования в Севастополе.
Представители бизнеса, власти и образовательной системы выступали со своим видением будущих потребностей региона в кадрах, поднимали насущные вопросы обучения студентов, прохождения практики и дальнейшего трудоустройства.

Крым Диджитал является амбассадором идеи образования и взращивания молодых кадров, развивает образовательные проекты и на протяжении 5 последних лет ведет активную работу в направлении поддержки и развития молодых специалистов ИТ-отрасли Крыма.

Выпуск курса Software Testing

Мы поздравляем выпускников нашего первого в этом году курса Крым Диджитал Академии по Software Testing! Всего курс успешно завершили 13 человек. В течение 2 месяцев несмотря на теплую погоду и манящее море ребята ответственно посещали занятия 2 раза в неделю, делали домашние задания и проверочные работы. Трое начинающих специалистов теперь стажеры нашей компании. Следующий курс намечен на август. Не пропусти анонс записи!

Мы поздравляем выпускников нашего первого в этом году курса Крым Диджитал Академии по Software Testing!

Всего курс успешно завершили 13 человек. В течение 2 месяцев несмотря на теплую погоду и манящее море ребята ответственно посещали занятия 2 раза в неделю, делали домашние задания и проверочные работы. Трое начинающих специалистов теперь стажеры нашей компании.

Следующий курс намечен на август. Не пропусти анонс записи!

Лицензия на образовательную деятельность

В 2022 году мы получили лицензию на образовательную деятельность по программам дополнительного профессионального образования! Теперь мы можем обучать специалистов по направлениям Ruby on Rails, ReactJS и Software Testing и выдавать удостоверения о повышении квалификации государственного образца.
В 2022 году мы получили лицензию на образовательную деятельность по программам дополнительного профессионального образования! Теперь мы можем обучать специалистов по направлениям Ruby on Rails, ReactJS и Software Testing и выдавать удостоверения о повышении квалификации государственного образца.

Мы вошли в Реестр эффективно и социально значимых предприятий.

По результатам ежегодной финансово-экономической аналитики Межотраслевой рейтинговой компании Крым Диджитал включена в Реестр эффективных и социально значимых предприятий. По итогу аналитики, в рамках отрасли (ОКВЭД 62.01) и региона Крым, CDG вошло в 4% лучших компаний страны, с результатом – 92 балла!
По результатам ежегодной финансово-экономической аналитики Межотраслевой рейтинговой компании Крым Диджитал включена в Реестр эффективных и социально значимых предприятий. По итогу аналитики, в рамках отрасли (ОКВЭД 62.01) и региона Крым, CDG вошло в 4% лучших компаний страны, с результатом – 92 балла!