So gestalten Sie Ihre Rails-App mit Serviceobjekten um

So gestalten Sie Ihre Rails-App mit Serviceobjekten um

Da Rails-Anwendungen immer komplexer werden, ist es wichtig, einen sauberen, lesbaren und wartbaren Code zu erhalten. Ein effektiver Ansatz, um dies zu erreichen, ist die Umstrukturierung Ihrer Codebasis mithilfe von Serviceobjekten. Serviceobjekte helfen dabei, komplexe Geschäftslogik aus Modellen oder Controllern in separate Klassen zu extrahieren, was eine bessere Organisation, Testbarkeit und Wiederverwendbarkeit fördert. In diesem Artikel werden wir den Prozess des Refactorings einer Rails-Anwendung mit Serviceobjekten untersuchen und anhand eines praktischen Beispiels die Vorteile dieser Methode demonstrieren.

Identifizierung des Problems: Um den Refactoring-Prozess zu beginnen, müssen Sie zunächst einen Codeabschnitt identifizieren, der komplexe Logik enthält oder gegen das Single Responsibility Principle (SRP) verstößt. Nehmen wir an, wir haben eine Rails-Anwendung mit einem UserController, der die Erstellung, Validierung und Benachrichtigung von Benutzern übernimmt.

Extrahieren eines Serviceobjekts: Um diesen Code zu refaktorisieren, extrahieren Sie die komplexe Logik im Zusammenhang mit der Benutzererstellung und -benachrichtigung in ein separates Serviceobjekt. Erstellen Sie eine neue Datei namens user_creation_service.rb im Verzeichnis app/services. Hier ist ein Beispiel dafür, wie das Service-Objekt aussehen könnte:

#app/services/user_creation_service.rb

Klasse UserCreationService

  def initialize(user_params)

    @user_params = user_params

  Ende

  def create_user

    user = User.new(@user_params)

    if user.save

      send_notification(user)

      wahr

    anders

      falsch

    Ende

  Ende

  Privat

  def send_notification(user)

    # Logik zum Senden einer Benachrichtigung an den Benutzer

  Ende

Ende

Aktualisieren des UserControllers: Ersetzen Sie im UserController die komplexe Logik durch einen Aufruf des Serviceobjekts. Hier ist ein Beispiel, wie es aktualisiert werden könnte:

#app/controllers/users_controller.rb

Klasse UsersController < ApplicationController

  auf jeden Fall erstellen

    user_service = UserCreationService.new(user_params)

    if user_service.create_user

      redirect_to root_path, notice: 'Benutzer erfolgreich angelegt!'

    anders

      rendern :neu

    Ende

  Ende

  Privat

  def user_params

    params.require(:user).permit(:name, :email, :password)

  Ende

Ende

Testen des Serviceobjekts: Dienstobjekte können leicht isoliert getestet werden, um die Korrektheit der extrahierten Logik zu gewährleisten. Schreiben Sie Tests für die Klasse UserCreationService, wobei Sie bei Bedarf Abhängigkeiten nachbilden. Zum Beispiel:

#spec/services/user_creation_service_spec.rb

erfordern 'rails_helper'

RSpec.describe UserCreationService do

  beschreiben '#create_user' do

    it 'erstellt einen Benutzer und sendet eine Benachrichtigung' do

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

      user_service = UserCreationService.new(user_params)

      expect(user_service.create_user).to be true

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

    Ende

    it 'gibt false zurück, wenn die Benutzererstellung fehlschlägt' do

      # Testfehlerfall

    Ende

  Ende

Ende

Abschluss: 

Durch die Umstrukturierung Ihrer Rails-Anwendung mit Serviceobjekten können Sie komplexe Geschäftslogik effektiv trennen, die Codeorganisation verbessern und die Testbarkeit erhöhen. Das praktische Beispiel demonstriert den Prozess der Extraktion von Benutzererstellungs- und Benachrichtigungslogik in ein Serviceobjekt, was zu einem saubereren und besser wartbaren Code führt. Nutzen Sie die Möglichkeiten von Serviceobjekten, um Ihre Rails-Anwendung zu rationalisieren und die Vorteile einer modularen und skalierbaren Codebasis zu genießen.



zusammenhängende Posts

Hinterlasse einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

de_DEGerman