A medida que las aplicaciones Rails crecen en complejidad, resulta crucial mantener un código limpio, legible y fácil de mantener. Una forma eficaz de conseguirlo es refactorizar el código utilizando objetos de servicio. Los objetos de servicio ayudan a extraer la lógica de negocio compleja de modelos o controladores en clases separadas, promoviendo una mejor organización, testeabilidad y reutilización. En este artículo exploraremos el proceso de refactorización de una aplicación Rails con objetos de servicio, proporcionando un ejemplo práctico para demostrar sus ventajas.
Identificación del problema: Para comenzar el proceso de refactorización, hay que identificar una sección de código que contenga lógica compleja o viole el Principio de Responsabilidad Única (SRP). Supongamos que tenemos una aplicación Rails con un UserController que se encarga de la creación, validación y notificación de usuarios.
Extracción de un objeto de servicio: Para refactorizar este código, extrae la lógica compleja relacionada con la creación y notificación de usuarios en un objeto de servicio separado. Crea un nuevo archivo llamado user_creation_service.rb en el directorio app/services. Este es un ejemplo del aspecto que podría tener el objeto de servicio:
#app/services/user_creation_service.rb
clase UserCreationService
def initialize(parámetros_usuario)
@parámetros_usuario = parámetros_usuario
fin
def crear_usuario
usuario = User.new(@parámetros_usuario)
si usuario.guardar
send_notification(usuario)
verdadero
demás
falso
fin
fin
privado
def send_notification(usuario)
# Lógica para enviar una notificación al usuario
fin
fin
Actualización del UserController: En el UserController, sustituye la lógica compleja por una llamada al objeto de servicio. He aquí un ejemplo de cómo se podría actualizar:
#app/controllers/users_controller.rb
clase UsersController < ApplicationController
definitivamente crear
user_service = UserCreationService.new(user_params)
if servicio_usuario.crear_usuario
redirect_to root_path, notice: '¡Usuario creado con éxito!'
demás
renderizar :nuevo
fin
fin
privado
def parámetros_usuario
params.require(:usuario).permit(:nombre, :email, :contraseña)
fin
fin
Prueba del objeto de servicio: Los objetos de servicio pueden probarse fácilmente de forma aislada, garantizando la corrección de la lógica extraída. Escribe pruebas para la clase UserCreationService, imitando las dependencias según sea necesario. Por ejemplo:
#spec/services/user_creation_service_spec.rb
require 'rails_helper'
RSpec.describe UserCreationService do
describe '#create_user' do
it 'crea un usuario y envía una notificación' do
user_params = { nombre: 'John Doe', email: '[email protected]', contraseña: 'contraseña' }
user_service = UserCreationService.new(user_params)
expect(servicio_usuario.crear_usuario).to be true
esperar(Notificación).haber_recibido(:enviar).con(instancia_de(Usuario))
fin
it 'devuelve false si falla la creación del usuario' do
# Caso de fallo de la prueba
fin
fin
fin
Conclusión:
Al refactorizar su Aplicación de rieles con objetos de servicio, puede separar eficazmente la lógica de negocio compleja, mejorar la organización del código y aumentar la capacidad de prueba. El ejemplo práctico que se ofrece muestra el proceso de extracción de la lógica de creación y notificación de usuarios en un objeto de servicio, lo que da como resultado un código más limpio y fácil de mantener. Aproveche el poder de los objetos de servicio para optimizar su aplicación Rails y disfrute de las ventajas de una base de código modular y escalable.