Ci-dessus, nous avons une structure que nous appelons userService. Il possède deux propriétés : db qui est responsable de la communication avec une base de données relationnelle, et amqpChannel, qui permet la communication avec le service de messagerie RabbitMQ.
UserService implémente une méthode appelée Create. Dans le cadre de cette méthode, nous stockons les informations utilisateur reçues dans la base de données, puis publions les données sur RabbitMQ.
On peut voir que la responsabilité de la méthode Create dans userService n'est pas une, mais deux : stocker les informations dans la base de données et publier un message dans une file d'attente RabbitMQ.
Cela peut entraîner plusieurs problèmes, tels que :
Dans le code suivant, nous modifions la structure pour respecter le SRP. Vérifiez-le:
Notez que nous avons séparé les responsabilités en trois parties distinctes : le référentiel UserRepository pour conserver l'utilisateur dans la base de données, l'éditeur UserPublisher pour envoyer un message à RabbitMQ et le service UserService qui orchestre ces deux opérations.
De cette manière, chaque composant est responsable d'une tâche spécifique et indépendante, facilitant la maintenance et l'évolution du code, en plus de permettre de remplacer ou d'améliorer chacune de ces parties sans affecter les autres. Par exemple, s’il est nécessaire de changer la base de données utilisée, remplacez simplement le référentiel. S'il est nécessaire de changer de forme de communication, il suffit de changer d'éditeur.
Il convient de mentionner qu'il existe une différence subtile entre effectuer deux tâches distinctes et déléguer leur exécution. Dans l'exemple original de userService.Create, deux opérations ont été effectuées au même endroit, violant le principe de responsabilité unique. Après le refactoring, nous avons délégué les exécutions à différentes structures et la méthode Create était uniquement responsable de la coordination de ce flux.
Pour appliquer SRP dans cet exemple, nous avons également fini par mettre en œuvre certains des autres principes SOLID :
Dans les prochains articles de cette série, je fournirai une explication plus détaillée de chacun d'eux, avec des exemples spécifiques.
À plus tard, les amis !
Les références:
SOLID : les 5 premiers principes de la conception orientée objet
Clean Coder Blog - Le principe de responsabilité unique
Dans le monde du développement logiciel, les principes SOLID nous indiquent comment organiser les fonctions et les données afin que nos codes :
Le terme SOLID est un acronyme désignant cinq postulats de conception, décrits ci-dessous :
(S) Principe de responsabilité unique : "Un module doit avoir une et une seule raison de changer"
(O) Principe ouvert/fermé : "Un artefact logiciel doit être ouvert pour extension mais fermé pour modification"
(L) Principe de substitution de Liskov : "Une classe dérivée doit être remplaçable par sa classe de base"
(I) Principe de ségrégation des interfaces : "Une classe ne doit pas être obligée d'implémenter des interfaces et des méthodes qu'elle n'utilisera pas"
(D) Principe d'inversion des dépendances : "Dépend des abstractions et non des implémentations"
SOLID est conçu pour la programmation orientée objet, et on sait que GoLang n'est pas un langage qui adopte ce paradigme. Cependant, nous pouvons utiliser les ressources qu'il met à disposition pour répondre à la méthodologie POO. Par exemple, Go n'a pas de support d'héritage, mais l'idée peut être compensée par son support de composition. De même, un type de polymorphisme peut être créé à l'aide d'interfaces.
Dans cet article, le premier d'une série de 5, je compte détailler le premier principe avec des exemples proches des situations que nous rencontrons au quotidien.
Nous savons déjà ce que signifie le terme, il est maintenant temps d'apprendre comment l'implémenter dans GoLang.
Dans ce langage, on pourrait définir ce principe comme « Une fonction ou un type doit avoir un et un seul travail, et une et une seule responsabilité », voyons le code suivant :
Ci-dessus, nous avons une structure que nous appelons userService. Il possède deux propriétés : db qui est responsable de la communication avec une base de données relationnelle, et amqpChannel, qui permet la communication avec le service de messagerie RabbitMQ.
UserService implémente une méthode appelée Create. Dans le cadre de cette méthode, nous stockons les informations utilisateur reçues dans la base de données, puis publions les données sur RabbitMQ.
On peut voir que la responsabilité de la méthode Create dans userService n'est pas une, mais deux : stocker les informations dans la base de données et publier un message dans une file d'attente RabbitMQ.
Cela peut entraîner plusieurs problèmes, tels que :
Dans le code suivant, nous modifions la structure pour respecter le SRP. Vérifiez-le:
Notez que nous avons séparé les responsabilités en trois parties distinctes : le référentiel UserRepository pour conserver l'utilisateur dans la base de données, l'éditeur UserPublisher pour envoyer un message à RabbitMQ et le service UserService qui orchestre ces deux opérations.
De cette manière, chaque composant est responsable d'une tâche spécifique et indépendante, facilitant la maintenance et l'évolution du code, en plus de permettre de remplacer ou d'améliorer chacune de ces parties sans affecter les autres. Par exemple, s’il est nécessaire de changer la base de données utilisée, remplacez simplement le référentiel. S'il est nécessaire de changer de forme de communication, il suffit de changer d'éditeur.
Il convient de mentionner qu'il existe une différence subtile entre effectuer deux tâches distinctes et déléguer leur exécution. Dans l'exemple original de userService.Create, deux opérations ont été effectuées au même endroit, violant le principe de responsabilité unique. Après le refactoring, nous avons délégué les exécutions à différentes structures et la méthode Create était uniquement responsable de la coordination de ce flux.
Pour appliquer SRP dans cet exemple, nous avons également fini par mettre en œuvre certains des autres principes SOLID :
Dans les prochains articles de cette série, je fournirai une explication plus détaillée de chacun d'eux, avec des exemples spécifiques.
À plus tard, les amis !
Les références:
SOLID : les 5 premiers principes de la conception orientée objet
Clean Coder Blog - Le principe de responsabilité unique
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3