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:
- faire le tour des différentes pratique
- montrer quelque gem
- lister des choses que j’aimerai voir après 10 ans de pratique
- 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
-
Anatomy of a Rails Service Object Dave Copeland ↩