Archyno
UMLPratique de la modélisation

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.
Diagramme de classes UML d'un domaine bancaire. Customer détient un ou plusieurs Account. Un Account a zéro ou plusieurs Posting. Une Transaction est composée d'exactement deux Posting, dont la somme doit être nulle.
Le grand livre. Notez ce que Account n'a pas : un attribut balance. Il a balance() - une opération qui somme les écritures - et cette seule décision est ce qui garde le modèle honnête.

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#

Diagramme de machine à états UML pour un virement bancaire. Depuis l'état initial il entre dans Requested. Requested va vers Authorised sur authorise, ou vers Rejected sur reject. Authorised va vers Settled sur settle, et Settled atteint l'état final.
Le cycle de vie d'un virement. Quatre états, et la partie utile est ce qui manque : il n'y a pas de flèche de Rejected vers Authorised, ni aucune de Settled vers quoi que ce soit.

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

  1. 01Supprimez l'attribut balance : dérivez-le des écritures, ou deux copies d'un même fait divergeront.
  2. 02Un virement est une Transaction composée d'exactement deux Posting dont la somme est nulle.
  3. 03Composition, pas association : on ne supprime pas la moitié d'un virement, et une annulation en est un nouveau.
  4. 04Modélisez le cycle de vie là où des règles en dépendent, et lisez d'abord les transitions manquantes.
  5. 05Nommez la garde d'une transition ; "reject" seul laisse la raison au lecteur.
  6. 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

À lire aussi

Tous les articles