Un système bancaire en UML
La plupart des exemples bancaires modélisent un compte comme un solde doté d'une méthode déposer, c'est-à-dire la seule chose qu'aucune banque ne fait. Voici la version fondée sur la partie double, avec la machine à états qui décide ce qu'un virement a le droit de faire ensuite.
8 min de lectureUML 2.5.133 sur 35
La réponse courte
- Modélisez un solde comme une opération dérivée, pas un attribut stocké. balance() additionne les écritures ; une copie stockée ne peut pas se justifier.
- Un virement est une Transaction composée d'exactement deux écritures de somme nulle. Une flèche entre comptes perd l'atomicité que le modèle existe pour protéger.
- Un système bancaire a besoin d'un diagramme de classes pour le grand livre, d'une machine à états par cycle de vie, et d'un diagramme de composants pour la frontière.
- Un distributeur est un canal et va avec les autres canaux. Le placer à côté des comptes, c'est le diagramme d'exercice classique.
01Le compte n'a pas de solde#
Presque tous les exemples bancaires d'internet donnent à Account un attribut balance et une paire de méthodes qui y ajoutent et en retranchent. C'est la première chose à supprimer, car aucun grand livre devant être auditable ne fonctionne ainsi.
Un solde stocké est une seconde copie d'un fait que les écritures contiennent déjà. Deux copies d'un même fait peuvent diverger, et quand elles le font - une panne partielle, un message rejoué, une migration - rien ne permet de dire laquelle a raison, parce que le solde ne porte aucun historique auquel le confronter. Le dériver, comme balance() sur la figure ci-dessus, rend la divergence impossible par construction.
02Un virement est une chose à deux effets#
La composition à droite de la figure d'ouverture est la deuxième décision structurante. Une Transaction est composée d'exactement deux écritures - la multiplicité dit 2, pas 0..* - et par convention leur somme est nulle : l'argent quitte un compte et arrive sur un autre.
Dessiner une association d'Account directement vers Account, ce qui est la première tentative évidente, perd les deux moitiés de cela. Cela perd l'atomicité, car deux flèches peuvent exister indépendamment et un virement ne peut pas se produire à moitié. Et cela perd la référence : une transaction est une chose dont les clients parlent par son numéro, qu'ils contestent et qu'ils annulent, donc une entité et non un trait entre deux autres.
Le losange plein dit ensuite que les écritures meurent avec la transaction. C'est correct et c'est aussi une contrainte sur le code : vous ne pouvez pas supprimer la moitié d'un virement, et une annulation est une nouvelle transaction plutôt qu'une modification de l'ancienne. Le guide du diagramme de classes détaille toutes les règles disant quand un losange est plein.
03Ce qu'un virement a le droit de faire ensuite#
Une machine à états mérite sa place chaque fois qu'un objet a un cycle de vie dont dépendent des règles, et l'argent qui circule en est l'archétype. La valeur n'est pas dans les quatre boîtes, que n'importe qui devinerait : ce sont les transitions absentes.
Settled n'a aucune transition sortante. Cela dit qu'un virement réglé est définitif et qu'une annulation est une autre transaction plutôt qu'un changement d'état - la même affirmation que faisait la composition sur le modèle de domaine. Rejected n'en a pas non plus : une approbation après un refus démarre un nouveau virement. Les gardes rendent le reste explicite : reject [limit]nomme le pourquoi, et un diagramme qui dit seulement "reject" laisse la raison au lecteur.
En une ligne chacun
- 01Supprimez l'attribut balance : dérivez-le des écritures, ou deux copies d'un même fait divergeront.
- 02Un virement est une Transaction composée d'exactement deux Posting dont la somme est nulle.
- 03Composition, pas association : on ne supprime pas la moitié d'un virement, et une annulation en est un nouveau.
- 04Modélisez le cycle de vie là où des règles en dépendent, et lisez d'abord les transitions manquantes.
- 05Nommez la garde d'une transition ; "reject" seul laisse la raison au lecteur.
- 06Les canaux - distributeur, application, agence - relèvent d'un diagramme de composants, pas du grand livre.
Pour le même traitement sur un autre domaine, voyez l'architecture e-commerce, modélisée. Pour la moitié modélisation de données d'un grand livre - clés, cardinalité et schéma sous-jacent - voyez les diagrammes ER.
04Questions fréquentes#
Comment modéliser le solde d'un compte en UML ?
Comme une opération dérivée plutôt qu'un attribut stocké : balance() additionne les écritures du compte. Un solde stocké est une seconde copie d'un fait que le grand livre contient déjà, et le jour où les deux divergent, rien ne dit lequel a tort - raison pour laquelle les vrais grands livres n'en gardent pas.
Comment représenter un virement entre deux comptes ?
Comme une Transaction composée d'exactement deux écritures, une négative et une positive, de somme nulle. Une flèche d'un compte vers l'autre perd le fait qu'un virement est une chose atomique unique à deux effets, et c'est cette atomicité que le modèle existe pour protéger.
Quels diagrammes UML pour un système bancaire ?
Un diagramme de classes pour le grand livre, une machine à états pour tout ce qui a un cycle de vie - virements, cartes, demandes - et un diagramme de composants pour la frontière avec les schémas de paiement et le core banking. Les diagrammes de séquence servent pour les deux ou trois flux réellement disputés.
Un distributeur doit-il figurer sur le diagramme des comptes ?
Non. Un distributeur est un canal et va sur un diagramme de composants ou de déploiement avec les autres canaux ; le diagramme du grand livre porte sur ce qu'est une transaction. Mélanger les deux produit le diagramme d'exercice classique où un appareil est associé à une notion comptable.
Dans cette série
- 01Qu'est-ce que UML ?
- 02Symboles UML
- 03Choisir un diagramme
- 04Diagrammes de classes
- 05Exemples de diagrammes de classes
- 06Dessiner un diagramme de classes
- 07Symboles du diagramme de classes
- 08Diagrammes de séquence
- 09Exemples de diagrammes de séquence
- 10Dessiner un diagramme de séquence
- 11Diagrammes de cas d'utilisation
- 12Exemples de cas d'utilisation
- 13Diagrammes d'activité
- 14Exemples d'activité
- 15Diagrammes états-transitions
- 16Exemples d'états-transitions
- 17Diagrammes de composants
- 18Exemples de composants
- 19Dessiner un diagramme de composants
- 20Symboles de composants
- 21Diagrammes de déploiement
- 22Exemples de déploiement
- 23Diagrammes d'objets
- 24Diagrammes de paquetages
- 25Diagrammes de structure composite
- 26Diagrammes de communication
- 27Séquence vs communication
- 28Diagrammes de temps
- 29Diagrammes globaux d'interaction
- 30Diagrammes de profil
- 31UML avec l'IA
- 32Exemple e-commerce
- 33Exemple bancaire
- 34Exemple microservices
- 35Exemple AWS
À lire aussi
Diagrammes de structure
Diagrammes de comportement
Pratique de la modélisation
Fondamentaux
Pratique de la modélisation
Pratique de la modélisation