Come eseguire il refactoring dell'app Rails con oggetti di servizio

Come eseguire il refactoring dell'app Rails con oggetti di servizio

Man mano che le applicazioni Rails diventano sempre più complesse, diventa fondamentale mantenere un codice pulito, leggibile e gestibile. Un approccio efficace per raggiungere questo obiettivo consiste nel refactoring della base di codice utilizzando oggetti di servizio. Gli oggetti di servizio aiutano a estrarre la logica aziendale complessa da modelli o controller in classi separate, promuovendo una migliore organizzazione, testabilità e riusabilità. In questo articolo esploreremo il processo di refactoring di un'applicazione Rails con oggetti di servizio, fornendo un esempio pratico per dimostrarne i vantaggi.

Identificazione del problema: Per iniziare il processo di refactoring, inizia identificando una sezione di codice che contiene logica complessa o viola il principio di responsabilità unica (SRP). Supponiamo di avere un'applicazione Rails con un UserController che gestisce la creazione, la convalida e la notifica degli utenti.

Estrazione di un oggetto di servizio: per eseguire il refactoring di questo codice, estrarre la logica complessa relativa alla creazione e alla notifica dell'utente in un oggetto di servizio separato. Crea un nuovo file chiamato user_creation_service.rb nella directory app/services. Ecco un esempio di come potrebbe apparire l'oggetto servizio:

#app/services/user_creation_service.rb

classe UserCreationService

  def inizializza(parametri_utente)

    @user_params = user_params

  FINE

  def crea_utente

    utente = Utente.nuovo(@utente_params)

    se user.save

      invia_notifica(utente)

      VERO

    altro

      falso

    FINE

  FINE

  privato

  def invia_notifica(utente)

    # Logica per l'invio di una notifica all'utente

  FINE

FINE

Aggiornamento dell'UserController: Nell'UserController, sostituire la logica complessa con una chiamata all'oggetto servizio. Ecco un esempio di come potrebbe essere aggiornato:

#app/controllers/users_controller.rb

classe UsersController <ApplicationController

  sicuramente creare

    user_service = UserCreationService.new(user_params)

    se user_service.crea_utente

      reindirizza_a root_path, nota: 'Utente creato con successo!'

    altro

      rendering: nuovo

    FINE

  FINE

  privato

  def parametri_utente

    params.require(:utente).permit(:nome, :email, :password)

  FINE

FINE

Testare l'oggetto servizio: Gli oggetti di servizio possono essere facilmente testati isolatamente, garantendo la correttezza della logica estratta. Scrivi test per la classe UserCreationService, simulando le dipendenze secondo necessità. Per esempio:

#spec/services/user_creation_service_spec.rb

richiedono 'rails_helper'

RSpec.describe UserCreationService fare

  descrivere '#create_user' fare

    "crea un utente e invia una notifica".

      user_params = { nome: 'John Doe', email: '[email protected]', password: 'password' }

      user_service = UserCreationService.new(user_params)

      aspettarsi che (user_service.create_user). sia vero

      aspettarsi(Notifica).to have_received(:invia).con(istanza_di(Utente))

    FINE

    "restituisce false se la creazione dell'utente fallisce".

      # Caso di fallimento del test

    FINE

  FINE

FINE

Conclusione: 

Rifattorizzando il tuo Applicazione delle rotaie con gli oggetti di servizio è possibile separare in modo efficace la logica aziendale complessa, migliorare l'organizzazione del codice e potenziare la testabilità. L'esempio pratico fornito dimostra il processo di estrazione della creazione dell'utente e della logica di notifica in un oggetto di servizio, ottenendo un codice più pulito e più gestibile. Sfrutta la potenza degli oggetti di servizio per semplificare la tua app Rails e sfruttare i vantaggi di una base di codice modulare e scalabile.



Articoli correlati

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

it_ITItalian