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.