Cómo refactorizar su aplicación Rails con objetos de servicio

Cómo refactorizar su aplicación Rails con objetos de servicio

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.



Artículos Relacionados

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

es_ESSpanish