Il y a cela de nombreuses années les services objects en rails sont devenus à la mode. Et si ils sont toujours utilisés aujourd’hui c’est qu’il y a de très bonnes raisons. Dans cette série d’articles je vais vous faire une rétrospective sur l’une des couches les moins officielles mais des plus utile de ruby on rails.

Bientot ce genre de code n’aura plus de secret pour vous.

result = MyService.call(params)

quelques liens

Si vous faite des recherches vous verrez qu’il y a plus de 10 on en parlais déja. You can see some blog post June 02, 2015 1 or some stackoverflow question asked Jul 16, 2014 2 Et que l’on en parle encore aujourd’hui.

Il n’y a toujours pas de convensions officiel à cette couche et de nombreuse équipe et devloppeurs indépendants on créer leur propre style et parfois leur propre gem.

Qu’est ce ?

Les Service Objects en Rails sont une façon d’extraire la logique métier d’un contrôleur ou d’un modèle pour améliorer la maintenabilité du code. Plutôt que d’alourdir les modèles ou les contrôleurs avec des responsabilités supplémentaires, un Service Object encapsule une action unique et réutilisable.

Utilité

__ Séparation des responsabilités

Évite les Fat Models et Fat Controllers. Chaque classe a une seule responsabilité.

Réutilisabilité

Un service peut être utilisé dans plusieurs contrôleurs ou jobs sans duplication.

3 Lisibilité et testabilité accrues

Un service bien écrit est plus facile à comprendre qu’un gros modèle. Les tests unitaires deviennent plus simples.

4. Facilite l’extension

Ajouter une nouvelle fonctionnalité est plus propre et structuré.

5. Facilite l’introduction de la programmation fonctionnelle

Un service peut retourner des objets résultats (Success/Failure) pour une meilleure gestion des erreurs.

6. Évité les problèmes liée au callback

Les callback dans les models ont beaucoup d’avantage mais ils ont sur le long terme quelques incovénients.

But de cette série d’articles

Dans cette série d’articles je vais:

  1. faire le tour des différentes pratique
  2. montrer quelque gem
  3. lister des choses que j’aimerai voir après 10 ans de pratique
  4. Proposé le début d’une gem qui pourrai synthétiser le meilleur de chaque chose

Exemple

vous ne serez pas venu pour rien voici déja un 1er exemple

# exemple de service
class MyService
  def self.call(*args)
    new(*args).call
  end

  def initialize(params)
    @params = params
  end

  def call
    # Implémentation de la logique métier
  end
end