Hur du refaktorerar din Rails-app med serviceobjekt

Hur du refaktorerar din Rails-app med serviceobjekt

I takt med att Rails-applikationer blir alltmer komplexa blir det allt viktigare att upprätthålla en ren, läsbar och underhållbar kod. Ett effektivt sätt att uppnå detta är genom att refaktorisera din kodbas med hjälp av serviceobjekt. Serviceobjekt hjälper till att extrahera komplex affärslogik från modeller eller styrenheter till separata klasser, vilket främjar bättre organisation, testbarhet och återanvändbarhet. I den här artikeln kommer vi att utforska processen för att refaktorisera en Rails-applikation med serviceobjekt och ge ett praktiskt exempel för att visa deras fördelar.

Identifiering av problemet: För att påbörja refaktoriseringsprocessen börjar du med att identifiera ett kodavsnitt som innehåller komplex logik eller bryter mot Single Responsibility Principle (SRP). Låt oss anta att vi har en Rails-applikation med en UserController som hanterar skapande, validering och avisering av användare.

Extrahera ett serviceobjekt: För att refaktorisera den här koden ska du extrahera den komplexa logiken som rör skapande av användare och meddelanden till ett separat serviceobjekt. Skapa en ny fil som heter user_creation_service.rb under katalogen app/services. Här är ett exempel på hur serviceobjektet kan se ut:

#app/services/user_creation_service.rb

klass UserCreationService

  def initialize(användare_param)

    @user_params = användar_params

  slutet

  def skapa_användare

    user = User.new(@user_params)

    om användare.spara

      send_notification(användare)

      Sann

    annan

      falska

    slutet

  slutet

  privat

  def skicka_notifiering(användare)

    # Logik för att skicka ett meddelande till användaren

  slutet

slutet

Uppdatering av UserController: I UserController ersätter du den komplexa logiken med ett anrop till serviceobjektet. Här är ett exempel på hur det skulle kunna uppdateras:

#app/controllers/användare_controller.rb

klass UsersController < ApplikationsController

  def skapa

    user_service = UserCreationService.new(user_params)

    if user_service.create_user

      redirect_to root_path, notice: "Användaren har skapats framgångsrikt!

    annan

      rendera :ny

    slutet

  slutet

  privat

  def user_params

    params.require(:user).permit(:namn, :e-post, :lösenord)

  slutet

slutet

Testning av serviceobjektet: Tjänsteobjekt kan enkelt testas isolerat, vilket säkerställer att den extraherade logiken är korrekt. Skriv tester för klassen UserCreationService och mocka beroenden efter behov. Ett exempel:

#spec/services/user_creation_service_spec.rb

kräver 'rails_helper'

RSpec.describe UserCreationService do

  beskriv "#create_user" do

    it "skapar en användare och skickar ett meddelande" do

      user_params = { namn: "John Doe", e-post: "[email protected]", lösenord: "password" }

      user_service = UserCreationService.new(user_params)

      förväntar sig(user_service.create_user).att vara sant

      expect(Notification).to have_received(:send).with(instance_of(User))

    slutet

    it "returnerar false om skapandet av användare misslyckas" do

      # Test av fall med fel

    slutet

  slutet

slutet

Slutsats: 

Genom att refaktorisera din Rails ansökan med serviceobjekt kan du effektivt separera komplex affärslogik, förbättra kodorganisationen och öka testbarheten. Det praktiska exemplet visar hur man extraherar logiken för att skapa och meddela användare till ett serviceobjekt, vilket resulterar i renare och mer underhållbar kod. Omfamna kraften i serviceobjekt för att effektivisera din Rails-app och dra nytta av fördelarna med en modulär och skalbar kodbas.



relaterade inlägg

Lämna en kommentar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *

sv_SESwedish