Приведение в порядок вашего кода Rails: Искусство рефакторинга в стиле Мари Кондо

Приведение в порядок вашего кода Rails: Искусство рефакторинга в стиле Мари Кондо

Содержание
  1. 🧹 Рефакторинг
  2. 🗞 Заключение
  3. Шаг 1: Переносим логику проверки в объект сервиса
  4. Шаг 2: Использование локализации для текста уведомления

Вам знакомо это чувство, когда вы в настроении взломать какой-нибудь код, сделать ”мозговую свалку” идей и зашифровать их? Уверен, так бывает у всех, и это совершенно нормально. Но иногда мы забываем о первоначальной “свалке мозгов” и продолжаем жить, работать и кодить, добавляя все новые и новые сложности в кодовую базу. Пока в один прекрасный день вас не осеняет, и вы понимаете, что вам нужно вернуться к “старому другу” - старому коду - и отрефакторить его, чтобы сделать отполированным, полезным, простым и, возможно, пригодным для повторного использования в будущем. Хорошая мысль! Это происходит со мной постоянно - такое ощущение, что я постоянно учусь и расту в своем стремлении добиться лучшего рефакторинга в своем коде.

🏁 Начальный код

В одном проекте мне нужно было установить ограничение на то, сколько раз пользователь может создать пост. Приложение требовало только 3 поста на пользователя (поговорим об эксклюзивности, да?). Вот мой первоначальный код:

class PostsController < ApplicationController before_action :check_limited_posts, if: :signed_in?, only: :new private def check_limited_posts limited_posts = 3 return unless current_user.posts.size == limited_posts redirect_to posts_path, notice: 'В настоящее время мы предлагаем только максимум 3 поста.' end end

Как видите, здесь нет ничего сложного, и код в порядке - он не ”должен” меняться, верно? Но мы, разработчики, всегда должны следовать лучшим практикам, и рефакторинг - одна из основных, к которой мы всегда должны стремиться (как супергерои чистого кода!).

🧹 Рефакторинг

Итак, я засучил рукава и приступил к работе над рефакторингом кода, чтобы сделать его более профессиональным и пригодным для повторного использования, и вот что я хочу сделать:

Вывести максимальное количество допустимых постов в константу (потому что, кто знает, может быть, однажды мы почувствуем себя более щедрыми).

Использовать более описательное имя для константы. Как вы уже поняли, именование - дело непростое.

Используйте более описательное имя для метода before_action.

class PostsController < ApplicationController MAX_POSTS_ALLOWED = 3 before_action :check_max_posts_allowed, if: :signed_in?, only: :new private def check_max_posts_allowed if current_user.posts.size >= MAX_POSTS_ALLOWED redirect_to posts_path, notice: "В настоящее время мы предлагаем только максимум #{MAX_POSTS_ALLOWED} постов" end end.

И вуаля! Метод check_max_posts_allowed стал более многоразовым, и у него даже появилось имя, которое легко запомнить (например, название крутой группы или секретный код). Максимальное количество разрешенных постов теперь определяется как константа, что облегчает модификацию в будущем (идеально для постоянно меняющихся требований проекта). Имена методов и констант стали более описательными, что делает код более читабельным и понятным, как хорошо написанный роман.

🗞 Заключение

Рефакторинг может показаться тривиальной задачей, но он является важной частью процесса разработки. Следуя лучшим практикам и постоянно совершенствуя код, мы можем создавать более удобные в обслуживании, многократно используемые и эффективные приложения. Это все равно что навести порядок в нашем цифровом рабочем пространстве, и наши будущие друзья скажут нам спасибо!

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

😉 И еще одно

Но мы еще не закончили! Давайте сделаем наш код еще более модульным и удобным для сопровождения, перенеся логику проверки в отдельный объект сервиса и используя локализацию для текста уведомления. Ух ты, модные штучки 😎

Шаг 1: Переносим логику проверки в объект сервиса

Создайте новый объект сервиса PostValidator в директории app/services:

class PostValidator MAX_POSTS_ALLOWED = 3 def self.check_max_posts_allowed(user) user.posts.size >= MAX_POSTS_ALLOWED end end.

Теперь обновите PostsController, чтобы он использовал новый объект сервиса PostValidator:

class PostsController < ApplicationController before_action :check_max_posts_allowed, if: :signed_in?, only: :new private def check_max_posts_allowed if PostValidator.check_max_posts_allowed(current_user) redirect_to posts_path, notice: "В настоящее время мы предлагаем только максимум #{PostValidator::MAX_POSTS_ALLOWED} постов." end end.

Шаг 2: Использование локализации для текста уведомления

Обновите файл views.en.yml в папке config/locales:

en: posts: new: max_posts_notice: "В настоящее время мы предлагаем только максимум %{max_posts} пост(ов).".

Обратите внимание, что я использую файл views, который отличается от стандартного файла en.yml, генерируемого рельсами. Файл views фокусируется на действиях new, index, show, ... для каждого объекта post.

Далее обновите PostsController, чтобы использовать текст уведомления из файла локализации:

class PostsController < ApplicationController before_action :check_max_posts_allowed, if: :signed_in?, only: :new private def check_max_posts_allowed if PostValidator.check_max_posts_allowed(current_user) redirect_to posts_path, notice: t('.posts.max_posts_notice', max_posts: PostValidator::MAX_POSTS_ALLOWED) end end end.

Обратите внимание на . в t('.posts.max_posts_notice', это ссылка на объект posts в файле views. Если вы забудете об этом, то получите ошибку translation missing: en.max_posts_notice.

Вот и все! Теперь наш код стал более модульным, поддерживаемым и готовым к любым будущим изменениям. С помощью этих простых приемов рефакторинга мы улучшили читаемость и организацию нашего кода Ruby on Rails, при этом немного повеселившись. Яппи 👏🏼🤖

И как всегда, счастливого кодинга 😀 💻

Источник