Dans le monde du développement logiciel, les principes SOLID nous indiquent comment organiser les fonctions et les données pour que nos codes :
Le terme SOLIDE est l'acronyme de cinq postulats de conception, décrits ci-dessous :
(S) Principe de responsabilité unique : "Un module doit avoir une, et une seule raison pour changer"
(Le) 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 l'on rencontre 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.
Cela peut entraîner plusieurs problèmes tels que :
Dans le code suivant, nous avons modifié la structure pour respecter le SRP. Découvrez-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 pièces 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, changez simplement d'éditeur.
Il convient de noter qu'il existe une différence subtile entre effectuer deux tâches distinctes et déléguer leur exécution. Dans l'exemple original 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 gars !
Références :
SOLID : Les 5 premiers principes de la conception orientée objet
Clean Coder Blog - Le principe de responsabilité unique
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!