«Clean Architecture» de Bob Martin est-il une règle de base pour toutes les architectures ou n'est-ce qu'une des options?

22

J'ai vraiment aimé les concepts de la vidéo Les principes de l'architecture propre de l'oncle Bob Martin . Mais j'ai l'impression que ce modèle est comme une combinaison de modèles Abstract Factory et Builder à la base.

C'est une façon d'écrire de bons programmes mais pas la seule.

Rails et reactjs sont 2 frameworks qui viennent à l'esprit qui ne favorisent pas ce type d'architecture propre. Rails s'attend à ce que votre logique métier soit dans les modèles ( FatModels et SkinnyControllers ) et réagisse à l'intérieur de vos composants. Les deux approches associent étroitement la logique métier et le code cadre .

Je ne trouve rien de mal dans aucune des 3 façons. C'est un appel au jugement de choisir n'importe qui.

Mais dans la vidéo, je pense qu'il suggère qu'une architecture propre devrait avoir une frontière claire entre la logique métier et les frameworks. Cadres (web, Android, etc.) doivent être plug - ins qui se branchent pour la logique métier. Il se moque même subtilement des rails dans la vidéo.

Alors, "Clean Architecture" de Bob Martin est-il une règle de base pour toutes les architectures ou n'est-ce qu'une des options?

vedant
la source
16
"Clean Architecture" est quelque chose que Bob Martin a inventé. C'est ça.
Robert Harvey
2
Peut-être une meilleure question est la suivante:. Rails et React remportent un franc succès. Qu'est-ce que Bob Martin a écrit, en utilisant son architecture propre, pour comparer? J'aimerais connaître la réponse moi-même.
user949300
4
Lisez le billet de blog de Joel sur cinq mondes , et vous savez pourquoi il n'y a pas de "règle d'or pour toutes les architectures".
Doc Brown
1
Les rails peuvent être très efficaces pour les startups et le prototypage. Lorsque vient le temps de maintenir et de développer davantage avec 50 autres développeurs - la "liberté" de Rails devient un problème pour les développeurs seniors.
Fabio
Soumis à votre considération: Baruco 2012: Déconstruire le cadre, par Gary Bernhardt
Theraot

Réponses:

34

Bien que «l'architecture propre» soit correcte et présente de nombreux avantages, il est important de se rappeler que:

  • L'architecture propre est en grande partie le re-branding et l'évolution de Robert C. Martin d'approches connexes comme l'architecture Onion de Jeffrey Palermo (2008) et l'architecture hexagonale («Ports et adaptateurs») par Alistair Cockburn et autres (<2008).

  • Différents problèmes ont des exigences différentes. L'architecture propre et les approches connexes transforment le découplage, la flexibilité et l'inversion des dépendances jusqu'à onze, mais sacrifient la simplicité. Ce n'est pas toujours une bonne affaire.

Le précurseur de ces architectures est le modèle MVC classique de Smalltalk. Cela démêle le modèle de l'interface utilisateur (contrôleur et vue), de sorte que le modèle ne dépend pas de l'interface utilisateur. Il existe de nombreuses variantes de MVC comme MVP, MVVM,….

Les systèmes plus complexes n'ont pas une seule interface utilisateur, mais éventuellement plusieurs interfaces utilisateur. De nombreuses applications choisissent d'offrir une API REST qui peut être utilisée par n'importe quelle interface utilisateur, telle qu'une application Web ou une application mobile. Cela isole la logique métier du serveur de ces interfaces utilisateur, de sorte que le serveur ne se soucie pas du type d'application qui y accède.

En règle générale, le serveur dépend toujours de services principaux tels que des bases de données ou des fournisseurs tiers. C'est parfaitement bien, et conduit à une architecture simple en couches.

L'architecture hexagonale va plus loin et cesse de faire une distinction entre frontend et backend. Tout système externe peut être une entrée (source de données) ou une sortie. Notre système central définit les interfaces (ports) nécessaires et nous créons des adaptateurs pour tous les systèmes externes.

Une approche classique pour un découplage fort est une architecture orientée services (SOA), où tous les services publient des événements et consomment des événements à partir d'un bus de messages partagé. Une approche similaire a ensuite été popularisée par les microservices.

Toutes ces approches présentent des avantages , comme faciliter le test du système de manière isolée (en remplaçant tous les systèmes externes avec lesquels il s'interface par des implémentations simulées). Ils facilitent la fourniture de plusieurs implémentations pour un type de service (par exemple l'ajout d'un deuxième processeur de paiement), ou l' échange de l'implémentation d'un service (par exemple le passage d'une base de données Oracle à PostgreSQL, ou en réécrivant un service Python dans Go) .

Mais ces architectures sont la Ferrari des architectures: chères, et la plupart des gens n'en ont pas besoin. La flexibilité supplémentaire de l'architecture propre, etc. se fait au prix d'une complexité accrue. De nombreuses applications et notamment les webapps CRUD n'en bénéficient pas. Il est logique d'isoler les choses qui pourraient changer, par exemple en utilisant des modèles pour générer du HTML. Il est moins logique d'isoler des éléments qui ne changeront probablement pas, par exemple la base de données de sauvegarde. Ce qui est susceptible de changer dépend du contexte et des besoins de l'entreprise.

Les cadres font des hypothèses sur ce qui va changer. Par exemple, React a tendance à supposer que la conception et le comportement d'un composant changent ensemble, il n'est donc pas logique de les séparer. Peu de cadres supposent que vous souhaiterez peut-être modifier le cadre. En tant que tels, les cadres présentent un certain degré de verrouillage. Par exemple, la dépendance de Rail à l'égard du modèle d'enregistrement actif (très avisé!) Rend difficile, voire impossible, le passage de votre stratégie d'accès aux données au modèle de référentiel (souvent supérieur). Si vos attentes de changement ne correspondent pas au cadre, il peut être préférable d'utiliser un autre cadre. De nombreux autres cadres Web ne font aucune hypothèse sur l'accès aux données.

amon
la source
20
Note latérale: Robert C Martin a cette fâcheuse tendance à présenter quelque chose comme la meilleure chose jamais et suggère que c'est la seule approche raisonnable. Il n'a généralement pas complètement tort. Mais il omet souvent de discuter des inconvénients potentiels et est sujet à l'hyperbole. En conséquence, ses conseils ont tendance à être trompeurs. Il vaut donc mieux ignorer complètement tout ce qu'il dit.
amon
2
J'adore entendre une déclaration comme ça, parce que si souvent je trouve des gens qui essaient aveuglément de suivre chaque petite chose qu'il dit. Au moins si je devais adopter l'approche "c'est une façon, qui fonctionne souvent, mais toujours avec méfiance", je me sentirais peut-être mieux pour lui, mais je ne peux pas vraiment dire que je suis un fan de Robert Martin
jleach
6
C'est drôle, car je me souviens qu'il a souligné que sa solution n'était pas la seule du livre. Ensuite, il a parlé de sa solution plus en profondeur. Personnellement, je ne me soucie pas de certains de ses messages, mais Clean Architecture était une excellente imo de lecture.
bitsoflogic
2
@bitsoflogic C'est bon à savoir! TBH Je n'ai pas lu ses livres et mon opinion est basée sur ses discours, ses articles et sur les questions des gens qui lisent ses trucs. Jusqu'à présent, j'ai vu plus d'exemples où il n'a aucune nuance notable. C'est un vrai problème étant donné que Clean Code est beaucoup commercialisé auprès des développeurs juniors qui ne peuvent pas encore mettre ses opinions en contexte. Son discours sur l'architecture propre (cette question est basée sur un enregistrement) ne semble pas discuter des limites. Pour le public visé, c'est bien, pour quiconque le considère comme une «autorité», il présente un point de vue trompeur.
amon
1
@amon J'adorerais vraiment voir quelqu'un parler plus en profondeur du temps et du lieu pour de nombreux modèles et architectures. Ils sont généralement tenus de faire face à un certain problème, que ce soit en raison du langage de codage ou des besoins de l'entreprise, mais les discussions se concentrent toujours sur le "comment mettre en œuvre". Quant au livre, sa connaissance de l'histoire du codage (l'avoir vécu) a pu mettre une perspective unique sur les choses. Cela dit, je pense que vous trouverez principalement le même problème dans le livre que vous avez vu lors des discussions.
bitsoflogic
24

J'ai vraiment aimé les concepts de la vidéo Les principes de l'architecture propre de l'oncle Bob Martin. Mais j'ai l'impression que ce modèle est comme une combinaison de modèles Abstract Factory et Builder à la base.

Pas même près.

Quand vous regardez ceci:

entrez la description de l'image ici

Vous regardez la conception d'un graphe d'objet. Cela dicte ce qui sait quoi. Ce qui manque dans cette histoire, c'est comment ce graphe d'objet a été construit. Désolé mais vous ne le trouverez pas ici. Il n'y a aucune mention de construction.

Vous pouvez construire tout cela sans usines ni constructeurs abstraits. Je le sais parce que je l'ai fait . Je n'ai même pas voulu les éviter. Je les aime. Je n'ai tout simplement pas eu besoin d'eux. J'ai juste utilisé le passage de référence. L'injection de dépendance est le terme de fantaisie pour cela.

En fait, je pourrais construire tout ce que vous voyez dans ce diagramme en principal. Ensuite, il suffit d'appeler une méthode sur un objet pour démarrer le tout.

Maintenant, les choses doivent exister avant de pouvoir les pousser dans d'autres choses. J'ai exploré cela ici et lui ai donné ce joli petit diagramme:

entrez la description de l'image ici

Et vous pouvez construire tout cela sans même partir main().

Je recommanderais d'utiliser des constructeurs et des usines lorsque vous souhaitez diviser un tas de code de construction procédural en morceaux conceptuels de bonne taille. Mais il n'y a rien dans une architecture propre ou dans aucune autre architecture à la mode qui exige que vous le fassiez. Donc, si vous voulez rester main(), très bien. S'il vous plaît, ayez pitié .

«Clean Architecture» de Bob Martin est-il une règle de base pour toutes les architectures ou n'est-ce qu'une des options?

Je considère l'architecture propre comme un mot à la mode utilisé pour conduire les gens vers un blog et un livre. Ce blog et ce livre ont de très bonnes explications sur des architectures anciennes très similaires avec des noms plus anciens utilisés pour conduire les gens vers des blogs et des livres plus anciens. Plus précisément Oignon ainsi que les ports et adaptateurs. Aucune de ces options n'est la seule dont vous disposez.

J'aime Oncle Bob parce qu'il est un conférencier et un auteur génial. Il me fait penser à des choses que je n'aurais pas autrement. Mais si vous laissez cela vous transformer en un fanatique religieux qui insiste sur le fait que tout doit être fait à sa manière, vous constaterez rapidement que la mise à jour de la documentation est la plus proche, je vous laisserai accéder à mon code.

Les architectures de mots à la mode sont utiles lorsque vous avez du code de longue durée qui doit persister pendant que le monde change autour de lui. C'est alors que ça brille. Si le monde est stable par rapport au code, alors vous faites des choses fantaisistes sans raison valable.

Peu importe à quel point quelque chose est génial, il y a un contexte dans lequel vous pouvez le mettre qui le rendra absurde. Désolé, ce n'est pas non plus une solution miracle.

Mais dans la vidéo, je pense qu'il suggère qu'une architecture propre devrait avoir une frontière claire entre la logique métier et les frameworks. Les frameworks (web, android, etc.) doivent être des plugins qui se connectent à la logique métier. Il se moque même subtilement des rails dans la vidéo.

Tu as raison. Il fait. Oncle Bob pense que les frameworks peuvent être traités comme des bibliothèques. Et ils le peuvent. Mais même cette décision vous coûte quelque chose.

Ce que M. Martin essaie de préserver, c'est un espace où votre langage généraliste est toujours général. Vous abandonnez cela lorsque vous diffusez un cadre partout. Lorsque vous faites cela, vous vous dirigez vers le chemin de la transformation de votre langue en quelque chose appelé une langue spécifique au domaine. HTML est un langage spécifique au domaine. Il fait très bien son travail mais il y a d'autres emplois qu'il ne peut pas faire du tout.

Tant que vos besoins seront anticipés par le cadre, les choses se passeront très bien. C'est agréable d'avoir anticipé vos besoins. Il vous met dans une boîte qui garde les choses simples. Comprenez simplement ce que vous abandonnez pour l'obtenir. Si vous diffusez Spring partout, vous ne pouvez plus le publier comme un travail Java. C'est un travail Java / Spring. Je pourrais dire la même chose à propos de Ruby and Rails, mais Rails a mangé le déjeuner de Ruby il y a longtemps.

candied_orange
la source
4

Pour citer la vidéo:

"Vous ne voulez pas faire de fusion et publipostage en SQL."

suivi par:

"J'ai en fait vu une procédure stockée SQL qui était une opération de fusion et publipostage complète"

L'architecture, comme la fusion et le publipostage, n'est qu'une option parmi tant d'autres.

Ce qui n'est pas facultatif, ce sont les problèmes que l'architecture essaie de résoudre.

Si vous comprenez les problèmes provoqués par le publipostage SQL par rapport à d'autres solutions, votre choix architectural sera informé et même si vous êtes obligé de choisir de `` mauvaises '' solutions, vous serez conscient et atténuerez leurs lacunes.

Si vous suivez un style architectural simplement parce qu'il est bien pensé, vous risquez de faire des erreurs et de rencontrer les mêmes problèmes.

Ewan
la source
2

"L'architecture propre" n'est certainement "qu'une" des options. Je dirais que c'est l' une des mauvaises options pour la plupart des projets, en particulier pour les projets orientés objet.

Voici une analyse phrase par phrase de l'article de l'oncle Bob sur l'architecture propre avec les raisons de la déclaration ci-dessus:

L'architecture propre dans une perspective orientée objet

Robert Bräutigam
la source
1

L'architecture propre est un ensemble de principes et de modèles pour répondre à un certain nombre de symptômes courants auxquels les organisations de développement de logiciels sont souvent confrontées au cours de la durée de vie de la création d'applications complexes. M. Martin fait de grands efforts dans le livre pour identifier les symptômes et les causes profondes sur la base de sa vaste expérience dans le domaine, et pour clarifier le rôle de l'architecture dans l'atténuation de ces préoccupations.

Cependant, ce n'est pas une règle de base, ni une panacée à tous les maux. Si vous lisez le livre, vous comprendrez mieux si / quand / comment appliquer les principes et les modèles qu'il préconise (et les compromis impliqués). Si vous n'avez pas lu le livre, vous risquez de faire des hypothèses, des applications, des jugements et des déclarations incorrects sur la base d'informations incomplètes.

Cory Serratore
la source
cela ne semble pas offrir quoi que ce soit de substantiel par rapport aux points soulevés et expliqués dans 4 réponses précédentes
gnat