Your profile
[Toggle Tanukr Mode]

UHD

peacefull guru senior dev


Salut, c'est quoi ton prénom ? Je suis ravi de pouvoir t'aider avec ton problème de code.

Alors, parle moi un peu plus de ce qui se passe. Tu es en train de travailler sur quel type de projet ? RubyOnRails ou JavaScript ?

Et n'oublie pas, même si on travaille sur du JavaScript, il faut garder le sourire ! 😄 Après tout, ce n'est que le deuxième meilleur langage de programmation, juste après Ruby.

// Une petite blague pour alléger l'atmosphère : 
// Pourquoi les développeurs JavaScript sont-ils toujours en bonne santé ? 
// Parce qu'ils ont toujours une `function` pour tout ! 

Allez, raconte-moi tout, je suis là pour toi.

J'aimerais des conseils sur l’architecture de service en rails.

Salut ! Je suis ravi de voir que tu travailles sur Ruby on Rails, mon langage de prédilection. 😉

Voici quelques conseils sur l'architecture de service en Rails :

  1. Utiliser des objets de service: Si tu as une logique métier complexe, il peut être utile de l'extraire dans des objets de service. Ils permettent d'organiser le code de manière plus logique et de le rendre plus facile à tester.
   # app/services/user_registration_service.rb
   class UserRegistrationService
     def initialize(user)
       @user = user
     end

     def call
       # logique de création d'un utilisateur
     end
   end
  1. Respecte le principe de responsabilité unique (SRP): Chaque classe ou module que tu crées devrait avoir une seule responsabilité. Si tu te rends compte qu'une classe fait trop de choses, pense à la refactoriser ou à diviser ses responsabilités entre plusieurs classes ou modules.

  2. Garde les contrôleurs minces: Les contrôleurs ne devraient être responsables que de la gestion des requêtes HTTP. Tout autre logique devrait être déplacée vers des modèles, des objets de service ou des objets de présentation.

  3. Utilise des objets de présentation ou des décorateurs: Ils sont utiles pour extraire la logique liée à la présentation de tes modèles. Par exemple, si tu as une méthode qui formate les données d'un modèle pour l'affichage, tu pourrais la mettre dans un décorateur.

  4. Favorise l'injection de dépendances: L'injection de dépendances est une excellente pratique pour rendre tes classes plus modulaires et plus faciles à tester. Au lieu d'appeler directement les dépendances dans une classe, tu peux les passer en argument lors de l'initialisation de l'objet.

Voilà quelques points de départ. Fais-moi savoir si tu as des questions spécifiques ou si tu souhaites que je développe un point en particulier. Et n'oublie pas de faire une pause pour te dégourdir les jambes et respirer un bon coup d'air frais de la plage ! 🏖️

tu aurais des exemples de bon et de mauvais codes ?

Bien sûr, je serai ravi de te donner quelques exemples de bon et mauvais code dans une architecture de service Rails !

Commençons par un mauvais exemple. Imaginons que tu as un contrôleur UsersController qui fait beaucoup trop de choses :

class UsersController < ApplicationController
  def create
    @user = User.new(user_params)

    if @user.save
      @user.send_welcome_email
      redirect_to @user, notice: 'User was successfully created.'
    else
      render :new
    end
  end

  private

  def user_params
    params.require(:user).permit(:name, :email, :password, :password_confirmation)
  end
end

Ici, le contrôleur est chargé de créer l'utilisateur et d'envoyer un e-mail de bienvenue, ce qui enfreint le principe de responsabilité unique.

Maintenant, voici comment nous pourrions améliorer ce code en déplaçant la logique d'envoi de l'e-mail de bienvenue dans un objet de service :

# app/services/user_registration_service.rb
class UserRegistrationService
  def initialize(user)
    @user = user
  end

  def call
    if @user.save
      send_welcome_email
    end
  end

  private

  def send_welcome_email
    UserMailer.welcome_email(@user).deliver_now
  end
end

Et le contrôleur serait alors :

class UsersController < ApplicationController
  def create
    @user = User.new(user_params)
    service = UserRegistrationService.new(@user)

    if service.call
      redirect_to @user, notice: 'User was successfully created.'
    else
      render :new
    end
  end

  private

  def user_params
    params.require(:user).permit(:name, :email, :password, :password_confirmation)
  end
end

Dans ce cas, le contrôleur ne s'occupe que de la gestion des requêtes HTTP et délègue la création de l'utilisateur et l'envoi de l'e-mail de bienvenue à UserRegistrationService, ce qui est une bien meilleure pratique.

J'espère que cela te donne une meilleure idée de ce à quoi peut ressembler une bonne architecture de service Rails. N'hésite pas si tu as d'autres questions ! Et n'oublie pas de prendre le temps de faire une petite course à pied pour te rafraîchir l'esprit. 🏃‍♂️