Liber IT School

Блог

Паттерн Interactor в Ruby

17 Jul , 2023 · views

Паттерн Interactor (Интерактор) - это структурный паттерн проектирования, который используется для управления сложными операциями и бизнес-логикой в приложении. Он помогает разделить обработку запросов от представления и бизнес-логики, а также упрощает тестирование и повторное использование кода.

В Ruby паттерн Interactor обычно реализуется с использованием отдельного класса, называемого "интерактором". Интерактор содержит метод, который выполняет определенную операцию и управляет взаимодействием между различными компонентами системы. Вот пример реализации паттерна Interactor в Ruby:

class CreateUserInteractor
def initialize(params)
@params = params
end
def call
validate_params
create_user
send_welcome_email
end
private
def validate_params
# Валидация параметров
# ...
end
def create_user
# Создание пользователя
# ...
end
def send_welcome_email
# Отправка приветственного письма
# ...
end
end

В приведенном примере у нас есть класс CreateUserInteractor, который представляет операцию создания нового пользователя в системе. Конструктор класса принимает параметры, необходимые для создания пользователя. Метод call является точкой входа и управляет последовательным выполнением шагов операции.

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

Паттерн Interactor также может использоваться для обработки сложных взаимодействий между различными объектами в системе, выделения отдельных подзадач и управления транзакциями. Кроме того, он способствует улучшению тестируемости кода, поскольку каждый интерактор может быть легко протестирован в изоляции от остальной системы.

В целом, паттерн Interactor в Ruby помогает разделить бизнес-логику и операции в приложении, повысить его модульность и тестируемость, а также упростить повторное использование кода и поддержку.

Использование gem Interactor

Для использования класса Interactor в Rails вам понадобится установить гем interactor. Вот шаги, которые вы можете следовать, чтобы начать использовать Interactor в вашем проекте:

  1. Установите гем interactor, добавив его в свой Gemfile:
gem 'interactor'

Затем запустите команду bundle install для установки гема.

Создайте новый класс интерактора. Это может быть отдельный файл или часть существующего файла в директории app/interactors.

Вот пример простого интерактора:

# app/interactors/create_user_interactor.rb
class CreateUserInteractor
include Interactor
def call
# Ваша логика создания пользователя
end
end
  1. Определите метод call внутри вашего интерактора. Этот метод будет вызываться, когда вы запустите интерактор.

  2. Используйте ваш интерактор в контроллере или в другом месте в вашем приложении, где вам нужно выполнить определенную бизнес-логику. Вы можете вызвать интерактор с помощью метода #call и передать ему необходимые параметры:

# app/controllers/users_controller.rb
class UsersController < ApplicationController
def create
result = CreateUserInteractor.call(user_params)
if result.success?
# Действия в случае успеха
else
# Действия в случае ошибки
end
end
private
def user_params
params.require(:user).permit(:name, :email, :password)
end
end

В этом примере мы вызываем интерактор CreateUserInteractor и передаем ему параметры пользователя. Результат выполнения интерактора доступен в переменной result, и вы можете проверить его на успешное выполнение с помощью метода #success?.

  1. В вашем интеракторе вы можете использовать методы #context и #fail! для управления данными контекста и обработки ошибок. Например:
# app/interactors/create_user_interactor.rb
class CreateUserInteractor
include Interactor
def call
if user.valid?
context.user = user
else
context.fail!(errors: user.errors)
end
end
private
def user
@user ||= User.new(context.user_params)
end
end

В этом примере мы проверяем, является ли пользователь допустимым. Если пользователь допустим, мы сохраняем его в контексте с помощью context.user. В противном случае мы вызываем метод #fail!, передавая ошибки пользователя в контекст.

Это базовый пример использования интерактора в Rails. Вы можете дальше расширять его, добавлять валидацию, взаимодействовать с моделями, использовать другие интеракторы и т.д., в зависимости от вашей бизнес-логики и требований приложения.

В классе CreateUserInteractor контекст (context) используется для передачи данных между различными методами и этапами выполнения интерактора. Он предоставляет механизм для хранения и передачи информации, связанной с выполнением конкретной задачи, между методами внутри интерактора.

В контекст можно сохранять данные, которые нужны для дальнейшей обработки или передачи другим методам. Например, в примере с CreateUserInteractor, после успешного создания пользователя мы сохраняем созданного пользователя в контексте (context.user), чтобы иметь доступ к нему в дальнейших этапах выполнения или возвращать его как результат.

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

Использование контекста помогает отделить логику выполнения интерактора от внешних зависимостей и контекста окружения, таких как контроллеры, модели или запросы. Это делает интеракторы более гибкими, переиспользуемыми и тестируемыми.

Заключение

Паттерн Interactor помогает разделить бизнес-логику и операции приложения от представления и других слоев. Это способствует повышению чистоты и модульности кода, а также улучшает его понимаемость и поддержку.

Interactor предоставляет механизм для управления сложными операциями и бизнес-логикой в приложении. Он позволяет организовать последовательность шагов и контролировать взаимодействие между ними, делая код более структурированным и управляемым.

Использование Interactor позволяет легко добавлять новые операции и изменять поведение существующих операций. Каждый интерактор является независимым и может быть легко модифицирован или заменен без влияния на остальные части системы.

Liber IT School

Либер Виталий Анатольевич

ИНН 720692679400

vitalyliber@gmail.com

Договор-офертаПолитика конфиденциальности