Un sistema bancario en UML
La mayoría de los ejemplos bancarios modelan una cuenta como un saldo con un método ingresar, que es justo lo único que ningún banco hace. Aquí está la versión basada en la partida doble, más la máquina de estados que decide qué puede hacer a continuación una transferencia.
8 min de lecturaUML 2.5.133 de 35
La respuesta corta
- Modela el saldo como operación derivada, no como atributo almacenado. balance() suma los apuntes; una copia guardada no tiene cómo demostrar que es correcta.
- Una transferencia es una Transacción compuesta por exactamente dos apuntes que suman cero. Una flecha entre cuentas pierde la atomicidad que el modelo protege.
- Un sistema bancario necesita un diagrama de clases para el libro mayor, una máquina de estados por ciclo de vida y uno de componentes para la frontera.
- Un cajero es un canal y va con los demás canales. Ponerlo junto a las cuentas es el diagrama de ejercicio clásico.
01La cuenta no tiene saldo#
Casi todos los ejemplos bancarios de internet le dan a Account un atributo balance y un par de métodos que le suman y le restan. Es lo primero que hay que borrar, porque ningún libro mayor que deba ser auditable funciona así.
Un saldo almacenado es una segunda copia de un hecho que los asientos ya contienen. Dos copias de un hecho pueden discrepar, y cuando lo hacen - un fallo parcial, un mensaje reintentado, una migración - no hay forma de saber cuál es la correcta, porque el saldo no lleva historia contra la que comprobarlo. Derivarlo, como balance() en la figura de arriba, hace imposible la discrepancia por construcción.
02Una transferencia es una cosa con dos efectos#
La composición a la derecha de la figura de cabecera es la segunda decisión estructural. Una Transaction está compuesta de exactamente dos asientos - la multiplicidad dice 2, no 0..* - y por convención suman cero: el dinero sale de una cuenta y llega a otra.
Dibujar una asociación de Account directamente a Account, que es el primer intento obvio, pierde las dos mitades de eso. Pierde la atomicidad, porque dos flechas pueden existir de forma independiente y una transferencia no puede ocurrir a medias. Y pierde la referencia: una transacción es algo por lo que los clientes preguntan por número, que reclaman y que revierten, lo que significa que es una entidad y no una línea entre otras dos.
El rombo relleno dice entonces que los asientos mueren con la transacción. Eso es correcto y es además una restricción sobre el código: no puedes borrar media transferencia, y una reversión es una nueva transacción en vez de una edición de la vieja. La guía del diagrama de clases tiene las reglas completas de cuándo un rombo va relleno.
03Qué se le permite hacer a continuación a una transferencia#
Una máquina de estados se gana su sitio siempre que un objeto tiene un ciclo de vida del que dependen reglas, y el dinero moviéndose es el arquetipo. El valor no son las cuatro cajas, que adivinaría cualquiera: son las transiciones que faltan.
Settled no tiene transición de salida. Eso dice que una transferencia liquidada es firme y que una reversión es otra transacción y no un cambio de estado, que es la misma afirmación que hacía la composición en el modelo de dominio. Rejected tampoco tiene: una aprobación tras un rechazo inicia una transferencia nueva. Las guardas hacen explícito el resto: reject [limit]nombra el porqué, y un diagrama que dice solo "reject" le deja la razón al lector.
En una línea cada uno
- 01Borra el atributo balance: derívalo de los asientos, o dos copias de un hecho acabarán discrepando.
- 02Una transferencia es una Transaction compuesta de exactamente dos Posting que suman cero.
- 03Composición, no asociación: no puedes borrar media transferencia, y una reversión es una nueva.
- 04Modela el ciclo de vida donde haya reglas que dependan de él, y lee primero las transiciones que faltan.
- 05Nombra la guarda de una transición; "reject" a secas le deja la razón al lector.
- 06Los canales - cajero, aplicación, oficina - van en un diagrama de componentes, no en el libro mayor.
Para el mismo tratamiento en otro dominio, mira la arquitectura de comercio electrónico, modelada. Para la mitad de modelado de datos de un libro mayor - claves, cardinalidad y el esquema de debajo - mira los diagramas ER.
04Preguntas frecuentes#
¿Cómo se modela el saldo de una cuenta en UML?
Como una operación derivada y no como un atributo almacenado: balance() suma los apuntes de la cuenta. Un saldo almacenado es una segunda copia de un dato que el libro ya tiene, y el día que ambos discrepen no hay forma de saber cuál está mal, que es justo por lo que los libros reales no lo guardan.
¿Cómo se representa una transferencia entre dos cuentas?
Como una Transacción compuesta por exactamente dos apuntes, uno negativo y otro positivo, que suman cero. Una flecha de una cuenta a otra pierde el hecho de que una transferencia es una sola cosa atómica con dos efectos, y es esa atomicidad lo que el modelo existe para proteger.
¿Qué diagramas UML necesita un sistema bancario?
Un diagrama de clases para el libro mayor, una máquina de estados para todo lo que tenga ciclo de vida - transferencias, tarjetas, solicitudes - y uno de componentes para la frontera con los esquemas de pago y el core bancario. Los de secuencia sirven para los dos o tres flujos realmente discutidos.
¿Debe aparecer un cajero en el mismo diagrama que las cuentas?
No. Un cajero es un canal y va en un diagrama de componentes o de despliegue junto a los demás canales; el diagrama del libro mayor trata de qué es una transacción. Mezclarlos produce el diagrama de ejercicio clásico donde un aparato aparece asociado a un concepto contable.
En esta serie
- 01¿Qué es UML?
- 02Símbolos UML
- 03Elegir un diagrama
- 04Diagramas de clases
- 05Ejemplos de diagramas de clases
- 06Cómo dibujar un diagrama de clases
- 07Símbolos del diagrama de clases
- 08Diagramas de secuencia
- 09Ejemplos de diagramas de secuencia
- 10Cómo dibujar un diagrama de secuencia
- 11Diagramas de casos de uso
- 12Ejemplos de casos de uso
- 13Diagramas de actividad
- 14Ejemplos de actividad
- 15Diagramas de máquina de estados
- 16Ejemplos de máquina de estados
- 17Diagramas de componentes
- 18Ejemplos de componentes
- 19Dibujar un diagrama de componentes
- 20Símbolos de componentes
- 21Diagramas de despliegue
- 22Ejemplos de despliegue
- 23Diagramas de objetos
- 24Diagramas de paquetes
- 25Diagramas de estructura compuesta
- 26Diagramas de comunicación
- 27Secuencia vs comunicación
- 28Diagramas de tiempos
- 29Diagramas de visión general de interacción
- 30Diagramas de perfil
- 31UML con IA
- 32Ejemplo de e-commerce
- 33Ejemplo bancario
- 34Ejemplo de microservicios
- 35Ejemplo de AWS
Lecturas relacionadas
Diagramas de estructura
Diagramas de comportamiento
Práctica del modelado
Fundamentos
Práctica del modelado
Práctica del modelado