Archyno
UMLDiagrammes de structure

Exemples de diagrammes de composants

Cinq diagrammes de composants de systèmes sur lesquels vous avez sans doute travaillé. Chacun tranche une question : qui a le droit d'appeler qui, ce qu'un remplaçant devrait respecter, et où une dépendance part dans le mauvais sens.

9 min de lectureUML 2.5.118 sur 35

La réponse courte

  • Le meilleur exemple est le plus petit qui tranche une question : deux ou trois composants, les interfaces entre eux, rien d'autre.
  • Les microservices se projettent proprement : un service par composant, une API publiée par interface. Où ils tournent relève du diagramme de déploiement.
  • De trois à neuf composants. Au-delà de dix, le lecteur cesse de suivre les flèches et survole, et le diagramme est devenu décoratif.
  • Dessinez l'adaptateur, pas la base de données. Le contrat dont votre code dépend est le fait utile ; le produit lui-même relève de l'infrastructure.
Un diagramme de composants UML. Un composant de vitrine web et un composant d'application mobile dépendent tous deux d'une interface ICatalog, que réalise un unique composant de service de catalogue.
Exemple un. Deux clients, un contrat, un fournisseur - la flèche en tirets à triangle creux signifie "j'implémente ceci", la flèche en tirets simple signifie "j'ai besoin de ceci".

01Comment lire les cinq#

Chaque diagramme ci-dessous emploie les trois mêmes marques, et si vous savez les lire vous savez lire les cinq : un composant est une boîte à icône de prise, une «interface» est une boîte nommant un contrat, et les flèches disent de quel côté de ce contrat se trouve chaque composant. Une flèche en tirets à triangle creux signifie j'implémente ceci. Une flèche en tirets simple signifie j'ai besoin de ceci. Le jeu complet est dans les symboles du diagramme de composants, et le raisonnement derrière la notation dans le guide du diagramme de composants.

Ils sont classés par fréquence d'apparition de la forme plutôt que par complexité. Chacun nomme la question qu'il tranche, car un diagramme de composants qui ne tranche rien est le genre le plus répandu et le moins utile : cinq boîtes, cinq flèches, et aucune affirmation avec laquelle on puisse être en désaccord.

021. Deux clients, un contrat#

La figure en tête de cet article. Une vitrine web et une application mobile ont toutes deux besoin de données produit ; un service de catalogue les fournit. L'interface est dessinée une fois, entre les deux.

Cette seule boîte est tout l'intérêt de l'exemple. Avant qu'elle existe, les deux clients avaient deux idées différentes de ce que renvoie « le catalogue », et la différence vivait dans celui qui avait été écrit en second. Nommer ICatalog force la question de ce qu'est réellement le contrat, et une fois nommé, une modification de celui-ci est visiblement une modification pour deux consommateurs plutôt qu'une retouche d'un service.

032. Ports et adaptateurs#

Un diagramme de composants UML d'une conception en ports et adaptateurs. Un composant API HTTP dépend d'une interface IOrdering réalisée par le composant coeur de commande. Le coeur dépend d'une interface IOrderStore réalisée par un composant adaptateur PostgreSQL.
Exemple deux. Le coeur se tient entre deux contrats et ne dépend d'aucune implémentation : l'API HTTP appelle par IOrdering, et la base est atteinte par IOrderStore.

Lisez les flèches et remarquez ce que le coeur de commande ne touche pas. Il ne dépend pas de HTTP et il ne dépend pas de PostgreSQL. Il réalise un contrat et en requiert un autre, et les deux sont des boîtes que n'importe qui aurait pu lui tendre.

C'est la forme que les gens désignent par architecture hexagonale, ports et adaptateurs ou clean architecture, et un diagramme de composants est le moyen le moins coûteux de vérifier si une base de code l'a réellement. Si la boîte du coeur a une flèche pointant vers un composant de base de données plutôt que vers une interface, le motif est un souhait : quelque chose au milieu importe le pilote.

043. Un contrat, deux implémentations#

Un diagramme de composants UML. Un composant de service de commandes dépend d'une interface IBilling. Deux composants la réalisent : un composant de facturation historique et un nouveau composant de service de facturation.
Exemple trois. Le diagramme de migration : les deux implémentations de facturation réalisent IBilling, donc le service de commandes ne peut pas savoir à laquelle il parle.

C'est le diagramme à dessiner avant un remplacement, pas après. L'affirmation qu'il porte est précise et testable : tout ce dont le service de commandes a besoin de la facturation est dans IBilling, donc une seconde implémentation de cette interface peut être substituée sans que le service de commandes change.

C'est aussi le moyen le plus rapide de découvrir que l'affirmation est fausse. Si quelqu'un dit « le nouveau service ne sait pas produire les relevés PDF », alors les relevés PDF faisaient partie du contrat et manquent à l'interface, et le diagramme était faux avant la migration. Cette conversation coûte dix minutes au tableau et trois mois en production.

Une fois l'ancienne implémentation partie, supprimez-la du diagramme. Un diagramme de composants qui montre encore le mainframe deux ans après son extinction est la raison pour laquelle les gens cessent de faire confiance aux diagrammes.

054. Une architecture à greffons#

Un diagramme de composants UML d'une architecture à greffons. Un composant hôte d'éditeur dépend d'une interface IExporter, que réalisent trois composants : un exportateur PNG, un exportateur Mermaid et un exportateur Sparx .qea.
Exemple quatre. La même forme que l'exemple trois, avec un sens différent : l'hôte ne choisit pas un exportateur, il est conçu pour en accepter un nombre quelconque.

Topologiquement, c'est l'exemple trois avec une troisième implémentation, et cette ressemblance mérite qu'on s'y arrête : remplaçabilité et extensibilité sont le même dessin. Ce qui diffère, c'est l'intention. Dans une migration, la réalisation supplémentaire est temporaire ; dans une architecture à greffons, elle est le produit.

La technique de lecture qui paie ici est de masquer la colonne de droite avec la main. Ce qui reste - l'hôte et IExporter- est tout ce qu'un auteur de quatrième exportateur a besoin de savoir. Si la réponse à « puis-je écrire mon propre exportateur ? » exige de lire le source de l'hôte, l'interface est sous-spécifiée, et le diagramme vient de vous le dire.

065. Celui avec un cycle#

Un diagramme de composants UML montrant un cycle de dépendances. Le service Orders dépend d'une interface IShipping réalisée par le service Shipping, et le service Shipping dépend d'une interface IOrders réalisée par le service Orders.
Exemple cinq. Orders a besoin de Shipping, Shipping a besoin d'Orders. Ni l'un ni l'autre ne peut être déployé, testé ou remplacé sans l'autre, et le diagramme le rend visible d'un coup d'oeil.

Deux services, chacun réalisant un contrat dont l'autre a besoin. Rien ici n'est de l'UML illégal et rien sur le diagramme n'est faux - le dessin est une image exacte d'un système qui va être difficile, et c'est précisément ce qu'on veut qu'un diagramme sache dire.

Un cycle entre composants signifie qu'aucun ne peut être compris seul : pas de déploiement indépendant, pas de test en isolation sans un bouchon de l'autre, et le remplacement de l'un doit satisfaire un contrat dont l'autre dépend simultanément. Sur un diagramme de classes, un cycle est une odeur ; entre unités déployables, c'est un risque de planning.

Les correctifs habituels sont visibles sur la même image. Déplacez ce dont Shipping a besoin depuis IOrders vers un événement publié par le service Orders, afin que la flèche devienne à sens unique. Ou extrayez la partie commune dans un troisième composant dont les deux dépendent, ce qui transforme le cycle en convergence et vous ramène à l'exemple un.

En une ligne chacun

  1. 01Convergence (exemple 1) : un contrat avec plusieurs consommateurs - nommez-le une fois, changez-le une fois.
  2. 02Chaîne (exemple 2) : le coeur dépend d'interfaces aux deux bouts, d'implémentations à aucun.
  3. 03Deux réalisations (exemple 3) : l'affirmation de migration, écrite là où elle peut être réfutée.
  4. 04Beaucoup de réalisations (exemple 4) : le même dessin qu'une migration, voulu de façon permanente.
  5. 05Un cycle (exemple 5) : une image honnête d'un système qu'on ne peut ni déployer ni remplacer par morceaux.
  6. 06Si un diagramme ne tranche aucun débat, c'est de la décoration - supprimez-le plutôt que de l'entretenir.

Pour en dessiner un contre votre propre système, la version pas à pas est dans comment dessiner un diagramme de composants. Pour l'endroit où ces composants tournent plutôt que pour ce qu'ils se promettent, c'est un diagramme de déploiement.

07Questions fréquentes#

À quoi ressemble un bon exemple de diagramme de composants ?

Le meilleur exemple est le plus petit qui tranche une question : deux ou trois composants, les interfaces entre eux, et rien d'autre. Un diagramme de catalogue partagé entre un site et une application dit davantage qu'un mur de quarante boîtes, parce qu'on le tient en tête d'un seul coup et qu'on peut le confronter au code.

Un diagramme de composants peut-il représenter des microservices ?

Oui, et c'est l'un de ses meilleurs usages. Chaque service devient un composant et chaque API publiée une interface, si bien que le diagramme énonce quel service a le droit d'appeler quel contrat. Ce qu'il ne doit pas montrer, c'est où ces services tournent : cela relève du diagramme de déploiement.

Combien de composants faut-il par diagramme ?

Entre trois et neuf environ. En dessous de trois il n'y a pas de structure à dessiner, au-delà de neuf ou dix le lecteur cesse de suivre les flèches et se met à survoler, et le diagramme devient décoratif. Un grand système se dessine en plusieurs diagrammes, un par question.

Faut-il dessiner une base de données comme un composant ?

Dessinez l'adaptateur, pas la base. Le diagramme porte sur le contrat dont votre code dépend : un composant Adaptateur PostgreSQL réalisant l'interface IOrderStore porte l'information utile. Le produit de base de données lui-même est de l'infrastructure et appartient au diagramme de déploiement.

Dans cette série

À lire aussi

Tous les articles