Diagrammes as code¶
Mermaid, PlantUML et le modèle C4 — produire des diagrammes versionnables, reviewables et toujours à jour.
Pourquoi des diagrammes as code ?¶
Un diagramme dans un fichier .png ou .pptx :
- Se desynchonise du code sans que personne ne s'en apercoit
- Ne peut pas être revu en diff dans une pull request
- Se perd dans un dossier partagé ou une confluence oubliee
Un diagramme as code :
- Est versionne avec le code qu'il documente
- Évolue dans les mêmes pull requests
- Est généré automatiquement à chaque build
Mermaid¶
Mermaid est le standard de facto pour les diagrammes dans la documentation Markdown. Il est supporte nativement par GitHub, GitLab, MkDocs Material, et Notion.
Flowchart¶
graph TD
A[Requete HTTP] --> B{Token valide ?}
B -- Oui --> C[Traitement]
B -- Non --> D[401 Unauthorized]
C --> E{Role suffisant ?}
E -- Oui --> F[Reponse 200]
E -- Non --> G[403 Forbidden] Code source :
graph TD
A[Requete HTTP] --> B{Token valide ?}
B -- Oui --> C[Traitement]
B -- Non --> D[401 Unauthorized]
C --> E{Role suffisant ?}
E -- Oui --> F[Reponse 200]
E -- Non --> G[403 Forbidden]
Diagramme de sequence¶
sequenceDiagram
participant Client
participant API Gateway
participant Auth Service
participant User Service
Client->>API Gateway: POST /login
API Gateway->>Auth Service: Valider credentials
Auth Service->>User Service: Recuperer profil
User Service-->>Auth Service: Profil utilisateur
Auth Service-->>API Gateway: JWT token
API Gateway-->>Client: 200 OK + token Diagramme de classes¶
classDiagram
class Order {
+String id
+User customer
+List~OrderLine~ lines
+OrderStatus status
+total() float
+cancel() void
}
class OrderLine {
+Product product
+int quantity
+float unitPrice
+subtotal() float
}
class Product {
+String sku
+String name
+float price
}
Order "1" --> "1..*" OrderLine
OrderLine "1" --> "1" Product Diagramme ER¶
erDiagram
USER {
uuid id PK
string email UK
string name
timestamp created_at
}
ORDER {
uuid id PK
uuid user_id FK
string status
float total
timestamp created_at
}
ORDER_LINE {
uuid id PK
uuid order_id FK
string product_sku
int quantity
float unit_price
}
USER ||--o{ ORDER : "passe"
ORDER ||--|{ ORDER_LINE : "contient" Le modèle C4¶
Le modèle C4 (Context, Container, Component, Code) structure les diagrammes d'architecture en quatre niveaux de zoom.
graph TB
subgraph "Niveau 1 - Contexte"
direction TB
U[Utilisateur] --> S[Systeme]
S --> E[Systeme externe]
end Niveau 1 : Contexte¶
Qui utilise le système et avec quoi il interagit.
graph TB
Dev["Developpeur\n[Personne]"]
User["Client final\n[Personne]"]
Stripe["Stripe\n[Systeme externe]"]
Email["SendGrid\n[Systeme externe]"]
App["Plateforme e-commerce\n[Systeme logiciel]"]
Dev --> App
User --> App
App --> Stripe
App --> Email Niveau 2 : Conteneurs¶
Les blocs deployables qui composent le système.
graph TB
Browser["Navigateur\n[SPA React]"]
API["API Backend\n[FastAPI / Python]"]
DB[("PostgreSQL\n[Base de donnees]")]
Cache[("Redis\n[Cache / Sessions]")]
Queue["RabbitMQ\n[File de messages]"]
Worker["Worker async\n[Celery]"]
Browser -- "HTTPS / REST" --> API
API -- "SQL" --> DB
API -- "Redis protocol" --> Cache
API -- "AMQP" --> Queue
Queue --> Worker
Worker -- "SQL" --> DB Niveau 3 : Composants¶
Les modules internes d'un conteneur.
graph TB
subgraph "API Backend"
Router["Router FastAPI"]
AuthMiddleware["Auth Middleware"]
OrderController["Order Controller"]
PaymentService["Payment Service"]
NotificationService["Notification Service"]
end
Router --> AuthMiddleware
AuthMiddleware --> OrderController
OrderController --> PaymentService
OrderController --> NotificationService Le niveau 4 : Code
Le quatrieme niveau (Code) correspond aux diagrammes de classes et d'implémentation. Il est souvent généré automatiquement depuis le code source. Ne le maintenez pas à la main — il devient obsolète trop vite.
PlantUML¶
PlantUML offre plus de types de diagrammes que Mermaid (timing, deployment, BPMN) mais nécessité un rendu server-side ou un plugin.
@startuml
actor Utilisateur
participant "API Gateway" as API
participant "Auth Service" as Auth
database "Redis" as Cache
Utilisateur -> API : GET /resource
API -> Auth : Valider token
Auth -> Cache : Verifier session
Cache --> Auth : Session valide
Auth --> API : Autorise
API --> Utilisateur : 200 OK
@enduml
Choisir entre Mermaid et PlantUML
- Mermaid : Support natif GitHub/GitLab, MkDocs Material, syntaxe simple. Choix par défaut.
- PlantUML : Plus de types de diagrammes, rendu serveur nécessaire. Utile pour l'UML avance.
Tableau des types de diagrammes¶
| Type de diagramme | Outil recommande | Cas d'usage principal |
|---|---|---|
| Flowchart / flux | Mermaid | Logique métier, processus |
| Sequence | Mermaid | Interactions entre services |
| Classes | Mermaid / PlantUML | Modèle de données, héritage |
| ER / BDD | Mermaid | Schéma de base de données |
| Contexte C4 | Mermaid | Vue macro du système |
| Conteneurs C4 | Mermaid | Architecture deployable |
| Composants C4 | Mermaid | Modules internes |
| Gantt | Mermaid | Planning, roadmap |
| State machine | Mermaid | Cycle de vie d'une entité |
| Deployment | PlantUML | Infrastructure, réseau |
Intégration dans MkDocs Material¶
# mkdocs.yml
markdown_extensions:
- pymdownx.superfences:
custom_fences:
- name: mermaid
class: mermaid
format: !!python/name:pymdownx.superfences.fence_code_format
extra_javascript:
- https://unpkg.com/mermaid@10/dist/mermaid.min.js
Les diagrammes Mermaid dans des blocs de code ```mermaid sont alors rendus automatiquement.
Bonnes pratiques¶
- Versionnez les sources, pas les images : committez le code Mermaid/PlantUML, pas les
.png. - Un diagramme par concept : evitez les mega-diagrammes illisibles. Decoupez par niveau C4.
- Titre explicite : chaque diagramme doit avoir un titre et une legende si nécessaire.
- Liens depuis l'ADR : quand un ADR implique une nouvelle architecture, liez le diagramme correspondant.
Piege courant
Un diagramme qui documente un état futur (la cible d'une refacto) doit être clairement labele comme tel. Sinon, les lecteurs croiront documenter l'état actuel.
Prochaine étape¶
Avec les diagrammes, vous documentez l'architecture. Voyons maintenant comment documenter les API que vous exposez a vos consommateurs.