Símbolos del diagrama de clases UML
Cada punta de flecha, rombo y línea discontinua que puede llevar un diagrama de clases, dibujada a escala de leyenda junto a su significado: la página que dejas abierta al comprobar un trazo.
11 min de lecturaUML 2.5.17 de 35
La respuesta corta
- El extremo decorado de una línea es el que lleva el significado: el triángulo apunta al padre, el rombo se apoya en el todo que posee y la flecha abierta señala lo que se usa.
- Línea continua con triángulo hueco es generalización; discontinua es realización. La primera hereda estructura y comportamiento, la segunda solo promete las operaciones.
- Una multiplicidad describe la clase junto a la que está escrita: 0..* al lado de Order se lee como muchos pedidos, no como muchos clientes.
- En las cajas: nombre en cursiva significa abstracto, las comillas angulares una palabra clave o un estereotipo, una barra inicial un atributo derivado y las llaves una restricción.
01Las seis relaciones#
| Elemento | Notación | Qué significa |
|---|---|---|
| Asociación | Las dos clases se conocen. La opción por defecto, y la respuesta correcta mucho más a menudo que las de abajo. | |
| Generalización | Triángulo hueco en el padre. El hijo es un tipo de padre y puede sustituirlo dondequiera que se espere al padre. | |
| Realización | Discontinua, triángulo hueco en la interfaz. La clase proporciona lo que la interfaz declara, sin heredar estado. | |
| Composición | Rombo relleno en el todo. La parte pertenece a exactamente un todo y se borra con él. | |
| Agregación | Rombo hueco en el todo. La parte puede compartirse y sobrevive al todo. No lleva ninguna otra semántica formal. | |
| Dependencia | Flecha abierta discontinua. Una clase usa otra sin mantener una referencia a ella: un parámetro, un tipo de retorno, una llamada estática. |
La regla que hace todo esto memorizable: el extremo decorado es el extremo que importa. El triángulo apunta al clasificador más general, el rombo se apoya en el todo que posee, y la flecha abierta señala lo que se usa. Si recuerdas qué extremo lleva la marca, normalmente puedes reconstruir el significado.
02Las cajas en sí#
La mitad de las marcas de un diagrama de clases está en las líneas y la otra mitad en las cajas, y es la segunda la que la gente se salta. Un rectángulo con un nombre es una clase; todo lo que sigue cambia qué clase de cosa afirma ser ese rectángulo, y un lector que no conoce la diferencia lee una interfaz como una clase y se pregunta por qué no tiene atributos.
| Elemento | Notación | Qué significa |
|---|---|---|
| Clase | Order | Un rectángulo simple con el nombre en redonda. El caso por defecto, y el único aquí que no necesita marca alguna. |
| Clase abstracta | AbstractOrder | Nombre en cursiva. No se puede instanciar: existe para generalizar desde ella. Donde la cursiva no sobrevive -y en una pizarra nunca lo hace- se escribe {abstract} bajo el nombre. |
| Interfaz | «interface» Printable | Un contrato con operaciones y sin estado. Las clases llegan a ella por realización -la línea discontinua con el triángulo hueco- nunca por generalización. |
| Enumeración | «enumeration» Status | Un conjunto fijo de literales, uno por línea en el compartimento bajo el nombre: DRAFT, PLACED, SHIPPED. Sin marcadores de visibilidad: los literales son siempre públicos. |
| Tipo de datos | «dataType» Money | Un valor sin identidad: dos instancias con los mismos números son la misma cosa. «primitive» es la misma idea para los tipos integrados. |
| Clase activa | ‖ Scheduler ‖ | Doble línea vertical en los costados. El objeto posee su propio hilo de control en vez de esperar a que lo llamen: un proceso, un demonio, un consumidor de cola. |
Las formas de caja. Todo salvo la primera es una palabra clave o un cambio de estilo tipográfico, y justo por eso se leen tan fácilmente sin verlas.
Una interfaz tiene una segunda notación, más pequeña, que no cuesta ninguna caja: una piruleta -un círculo en un palito- dibujada sobre el clasificador que la proporciona, y un zócalo a juego, un semicírculo abierto, sobre el que la necesita. Junta los dos y tienes la bola y zócalo con la que se construyen los diagramas de componentes. Dice exactamente lo que dice el triángulo discontinuo, en una décima parte del espacio, y es la elección correcta en cuanto un diagrama tiene más de unas tres interfaces.
03Dentro de la caja: visibilidad, tipos y multiplicidad#
Una caja de clase es una banda con el nombre y hasta dos compartimentos debajo: atributos y luego operaciones. Ambos son opcionales, y una caja que es solo un nombre es perfectamente legal: normalmente lo correcto en un diagrama sobre relaciones.
| Elemento | Notación | Qué significa |
|---|---|---|
| Público | + name: String | Visible para todo. Lo que siempre son los miembros de una interfaz. |
| Privado | - id: UUID | Visible solo dentro de la clase. Lo habitual en la mayoría de diagramas de diseño. |
| Protegido | # state: Status | Visible para la clase y sus subtipos. |
| Paquete | ~ cache: Map | Visible dentro del paquete propietario. Raro en la práctica. |
| Estático | subrayado | Pertenece al clasificador y no a una instancia. |
| Abstracto | cursiva | La clase u operación no tiene implementación. Donde la cursiva no sobreviviría a una pizarra, suele escribirse «abstract». |
La multiplicidad se escribe en el extremo de una relación, y la sintaxis es corta: 1 exactamente uno, 0..1 opcional, * o 0..* cualquier número incluido ninguno, 1..* al menos uno y 2..5 un rango real. Una multiplicidad ausente significa sin especificar, no «uno»: dejarla en blanco es un hueco, no un valor por defecto.
Una operación se escribe + place(customer: Customer, at: Instant): Order: visibilidad, nombre, parámetros con sus tipos y luego el tipo de retorno tras los dos puntos. Dos decoraciones aparecen lo bastante a menudo como para reconocerlas: un parámetro puede llevar dirección, como en out receipt: Receipt, y un atributo un valor por defecto, como en - status: Status = DRAFT. Ninguna es obligatoria, y un modelo de dominio suele estar mejor sin ninguna de las dos.
04Los extremos de una línea: flechas, roles y calificadores#
Una relación lleva significado en ambos extremos, y casi todo lo que un diagrama de clases hace mal en una revisión está en un extremo y no en el medio. La línea dice que dos clases están conectadas; los extremos dicen quién puede alcanzar a quién, cuántos, en qué orden y con qué nombre.
| Elemento | Notación | Qué significa |
|---|---|---|
| Navegabilidad | Una flecha abierta en un extremo: ese extremo es alcanzable desde el otro, y no se afirma nada sobre el camino de vuelta. Order mantiene un Customer; si un cliente puede listar sus pedidos es otra pregunta. | |
| No navegable | ╳ | Una crucecita en el extremo. Explícitamente no alcanzable por ahí, que es una afirmación mucho más fuerte que dejar el extremo desnudo, y que merece la pena en el sitio o dos de un modelo donde es una decisión de diseño real. |
| Nombre de rol | + placedBy | Cómo se llama este extremo desde el otro lado. Imprescindible en cuanto una clase se relaciona consigo misma -manager y reports en los dos extremos entre Employee y Employee- y útil siempre que el nombre de la clase por sí solo no diga para qué es la referencia. |
| Multiplicidad | 0..* | Cuántos objetos hay en este extremo por cada uno del otro. Léela hacia el extremo en el que está escrita: 1 junto a Customer y 0..* junto a Order significa un cliente y cualquier número de pedidos. |
| Cadena de propiedades | {ordered} | Entre llaves junto a una multiplicidad. {ordered} significa que la posición forma parte del significado, {unique} que no puede haber duplicados; juntas son la diferencia entre una lista, un conjunto y un multiconjunto. |
| Calificador | [ isbn ] | Una cajita en el extremo origen que contiene una clave. Convierte un 0..* en un 0..1: una biblioteca tiene muchos libros, pero una biblioteca calificada por ISBN tiene como mucho uno. |
| Clase de asociación | - - - Enrolment | Una clase unida al centro de una asociación por una línea discontinua, que contiene los atributos que pertenecen al emparejamiento y no a ninguno de los lados: una nota, una fecha de matrícula, un precio en el momento del pedido. |
| Asociación n-aria | ◇ | Un rombo hueco en el centro con tres o más líneas saliendo. Legal, raro y casi siempre más claro redibujado como una clase con tres asociaciones, que es lo que una base de datos haría con ello de todos modos. |
Todo lo que puede escribirse al final de una línea. Lee la multiplicidad hacia el extremo en el que está: esa única convención causa más diagramas mal leídos que las puntas de flecha.
05Notas, restricciones y miembros derivados#
El último grupo de marcas es el que lleva las reglas que un dibujo de cajas y líneas no puede expresar por sí solo. Un diagrama de clases es una estructura, y la mitad de lo que sabe un experto del dominio es una condición sobre esa estructura: un total que nunca puede ser negativo, un par de relaciones de las que exactamente una puede estar rellena.
| Elemento | Notación | Qué significa |
|---|---|---|
| Nota | ⎒ comentario | Un rectángulo con la esquina doblada, atado por una línea discontinua simple a aquello de lo que trata. Texto libre: un supuesto, una pregunta abierta, un enlace al ticket del que salió la clase. |
| Restricción | {total >= 0} | Llaves, allí donde la restricción se aplique: dentro de una nota, junto a un atributo, en un extremo de asociación. Una afirmación que el modelo dice que se cumple siempre, en el lenguaje que se lea con más claridad: OCL si el modelo se va a comprobar mecánicamente, castellano si se va a leer. |
| Derivado | / age: Integer | Una barra inclinada al principio. El valor se calcula a partir de otros en vez de almacenarse, que es exactamente la señal que necesitan tanto un generador de esquema como un revisor de código, y exactamente la que se omite. |
| Solo lectura | {readOnly} | Se fija al crear y nunca después. En un extremo de asociación es la diferencia entre una referencia que puedes reapuntar y una que no. |
| Xor | {xor} | Escrito sobre una línea discontinua trazada entre dos asociaciones: para un objeto dado exactamente una puede estar rellena. Una factura va a una persona o a una empresa, nunca a ambas. |
| Conjunto de generalización | {complete, disjoint} | Junto a un grupo de generalizaciones que comparten un padre. complete significa que los subtipos cubren todos los casos, disjoint que nada puede ser dos de ellos a la vez. Las cuatro combinaciones son cuatro modelos genuinamente distintos. |
Una convención fuera de esta tabla merece conocerse porque parece un diagrama de clases y no lo es: un nombre subrayado con la forma order1: Order es una instancia, y un diagrama hecho de esos es un diagrama de objetos: la misma notación mostrando un momento en vez de todos los momentos posibles. El subrayado dentro de una caja de clase significa algo completamente distinto: es el marcador estático de la tabla de compartimentos de arriba.
06Comillas angulares y lo demás#
El texto entre comillas angulares -«interface», «enumeration», «entity»- es un estereotipo: una extensión del vocabulario estándar que dice qué clase de cosa es este clasificador más allá de «clase». UML define unos pocos; el resto viene de un perfil, que es el mecanismo para inventar los tuyos sin salir del lenguaje.
Las comillas angulares hacen dos trabajos distintos y la especificación los distingue aunque nada en la página lo haga. «interface» y «enumeration» son palabras clave: parte de UML, de significado fijo y legales en cualquier herramienta. «aggregate root» o «pii» son estereotipos: tu propio vocabulario, definido en un perfil, con significado solo para quien sepa qué quieren decir. Ambos merecen usarse. Merece saber cuál acabas de escribir, porque el segundo tipo necesita una leyenda en el diagrama y el primero no.
Un estereotipo también puede llevar valores etiquetados: {owner = payments-team, retention = 7y} bajo una clase estereotipada, y así es como un modelo empieza a contener los metadatos que una hoja de cálculo contenía mal. Ese es el mecanismo que un perfil existe para definir.
En una línea cada uno
- 01El extremo decorado es el que importa: triángulo en el padre, rombo en el todo, flecha en lo usado.
- 02Triángulo hueco es generalización, triángulo hueco discontinuo es realización: la línea sólida hereda, la discontinua solo promete.
- 03Rombo relleno significa borrado con el todo; hueco significa compartido y superviviente.
- 04Una multiplicidad describe la clase que toca, así que léela hacia el extremo en el que está.
- 05Una multiplicidad en blanco significa sin especificar, no uno: es un hueco en el diagrama.
- 06Una barra inclinada inicial es derivado, las llaves son una restricción, y un nombre subrayado es una instancia, no una clase.
- 07Las comillas angulares marcan o una palabra clave de UML o tu propio estereotipo; solo el segundo necesita explicarse en el diagrama.
Para ver todo esto sobre modelos reales, lee los ejemplos trabajados; para el razonamiento detrás de las marcas y no las marcas en sí, el artículo del diagrama de clases.
07Preguntas frecuentes#
¿Qué significan las flechas en un diagrama de clases UML?
Un triángulo hueco es generalización y uno discontinuo realización; un rombo relleno es composición y uno hueco agregación; una línea simple es una asociación y una flecha abierta discontinua una dependencia. La punta está siempre en el extremo más general o poseedor.
¿Qué diferencia hay entre rombo relleno y rombo hueco?
El rombo relleno es composición: la parte se borra con el todo y pertenece exactamente a un todo. El rombo hueco es agregación: la parte puede compartirse y sobrevive al todo. Más allá de esa lectura, la agregación no lleva semántica formal en UML 2.5.1.
¿Qué significan más, menos y almohadilla antes de un atributo?
Son marcadores de visibilidad: más es público, menos privado, almohadilla protegido y virgulilla de paquete. Su sitio es un diagrama de diseño cuyo tema es la estructura del código, y suelen omitirse en un modelo de dominio porque no dicen nada del negocio.
¿Qué significa una barra antes del nombre de un atributo?
Una barra inicial marca el atributo como derivado: su valor se calcula a partir de otros atributos o asociaciones en vez de almacenarse. Escribir /edad en una Persona que ya guarda una fecha de nacimiento es lo que le dice a un generador de esquema que no cree una columna, y a un revisor que no busque el código que las mantiene sincronizadas.
¿Qué diferencia hay entre una palabra clave de UML y un estereotipo?
Ambos se escriben entre comillas angulares y no son lo mismo. Una palabra clave como interface o enumeration forma parte del propio UML y significa lo mismo en toda herramienta. Un estereotipo como aggregate root es tu vocabulario propio, definido en un perfil, y no le dice nada a un lector al que nadie ha avisado, así que necesita una leyenda en el diagrama que una palabra clave no necesita.
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 estructura
Diagramas de estructura
Referencia de notación
Referencia de notación
Diagramas de comportamiento