Diagrama de clases

Un diagrama de clases describe la estructura estática de un sistema: sus clases, sus atributos y métodos, y las relaciones entre ellas. Es el diagrama UML más utilizado para documentar la organización y el diseño del código.

En PlantUML, la sintaxis se parece a la de un lenguaje de programación, por lo que los atributos, los métodos y los marcadores de visibilidad resultan familiares. Las relaciones usan el mismo estilo de flechas que los diagramas de secuencia.

Consulte los comandos comunes para conocer las funcionalidades disponibles en todos los tipos de diagramas.

Elemento declarante

[Referencia para protocol y struct: GH-1028, para exception: QA-16258, para record y dataclass: GH-2232]

[Ref. for protocol and struct: GH-1028, for exception: QA-16258, for record and dataclass: GH-2232]

[Ref. for protocol and struct: GH-1028; for exception: GH-1056, QA-16258; for metaclass and stereotype: GH-1159, QA-16784; for record and dataclass: GH-2232]
WARNING
 This translation need to be updated. 
WARNING

Relación entre clases

Las relaciones entre clases se definen usando los siguientes símbolos:

Tipo Símbolo Finalidad
Extensión <|-- Especialización de una clase en una jerarquía
Implementación <|.. Realización de una interfaz mediante una clase
Composición *-- La parte no puede existir sin el todo
Agregación o-- La parte puede existir independientemente del todo
Dependencia --> El objeto utiliza otro objeto
Dependencia ..> Una forma más débil de dependencia

Es posible intercambiar -- por .. para tener lineas punteadas.

Sabiendo esas reglas, es posible sacar los siguientes dibujos:

WARNING
 This translation need to be updated. 
WARNING

Etiqueta en las relaciones

Es posible añadir una etiqueta en la relación, utilizando :, seguido por el texto de la etiqueta.

Para la cardinalidad, puede utilizar comillas dobles "" a cada lado de la relación.

Se puede añadir una flecha adicional apuntando a un objeto que muestre qué objeto actúa sobre el otro objeto, utilizando < o > al principio o al final de la etiqueta.

Sin usar letras

Si no desea usar letras en la visualización de la clase (o enum...), puede:

Also note that names starting with ``$`` are valid, but to assign an alias to such element the name must be put between quotes ``""``.
WARNING
 This translation need to be updated. 
WARNING

Añadir métodos

Para declarar campos y métodos, se puede utilizar el símbolo : seguido del nombre del campo o del método.

El sistema busca paréntesis para elegir entre métodos y campos

También es posible agrupar entre paréntesis {} todos los campos y métodos.

Tenga en cuenta que la sintaxis es muy flexible en cuanto al orden tipo/nombre.

Puedes utilizar los modificadores {field} y {method} para anular el comportamiento por defecto del analizador sintáctico sobre los campos y métodos

Definiendo la visibilidad

Cuando defines propiedades o métodos, puedes usar caracteres para establecer la visibilidad que les correspondan:

Character Icon for field Icon for method Visibility
- private
# protected
~ package private
+ public

Puedes desactivar esta característica usando el comando skinparam classAttributeIconSize 0 :

*[Ref. [QA-4755](https://forum.plantuml.net/4755/provide-display-visibility-attributes-private-protected)]*
WARNING
 This translation need to be updated. 
WARNING

Visibility on compositions and aggregations

[Ref. QA-8294]

Abstracto y Estático

Puedes definir métodos o propiedades abstractas y estáticas usando los modificadores {static} o {abstract} .

Esos modificadores pueden ser usado al comienzo o al final de un línea. También puedes usar {classifier} en lugar de {static}.

Cuerpo avanzado de las clases

Por defecto, las propiedades y los métodos son agrupados automáticamente por PlantUML. Puedes usar separadores para definir tu propia manera de ordenar las propiedades y los métodos. Son posibles los siguientes separadores: -- .. == __.

También puedes definir títulos dentro de los separadores:

Notas y estereotipos

Los estereotipos son definidos con la palabra clave class, << and >>.

También puedes definir notas usando las palabras claves note left of , note right of , note top of , note bottom of .

Además puedes definir una nota en la última clase definida usando note left, note right, note top, note bottom .

Una nota también puede definirse solitariamente con la palabra clave note, y a continuación relacionarla con otro objeto usando el símbolo ...

WARNING
 This translation need to be updated. 
WARNING

Más acerca de notas

También es posible usar algunas etiquetas HTML como (See Creole expression):

También puedes tener una nota en varias líneas.

És possible definir una nota en la última clase definida usando note left, note right, note top, note bottom.

WARNING
 This translation need to be updated. 
WARNING

Note on field (field, attribute, member) or method

It is possible to add a note on field (field, attribute, member) or on method.

⚠ Constraint

Note on field or method

Note on method with the same name

[Ref. QA-3474 and QA-5835]

Notas en enlaces

Es posible añadir una nota en un enlace, justo después de la definición de dicho enlace, usando note on link .

También puedes usar note left on link, note right on link, note top on link, note bottom on link si quieres cambiar la posición de la nota, en relación a una etiqueta.

Clases abstractas e interfaces

Puedes declarar una clase como abstracta usando las palabras claves abstract or abstract class .

La clase será impresa en italic .

Puedes usar también las palabras claves interface, annotation and enum .

*[Ref. 'Annotation with members' [Issue#458](https://github.com/plantuml/plantuml/issues/458)]*
WARNING
 This translation need to be updated. 
WARNING

Atributos, métodos... ocultos

Puede parametrizar la visualización de las clases usando el comando hide/show .

El comando básico es: hide empty members. Este comando ocultará atributos y métodos si están vacíos.

En lugar de empty members , puedes usar: También puede proporcionar, justo después las palabras clave hide o show:

Puedes usar varios comandos show/hide para definir reglas y excepciones.

*[Ref. [QA-2913](https://forum.plantuml.net/2913/hiding-based-on-visibilty?show=2916#a2916)]*
WARNING
 This translation need to be updated. 
WARNING

Clases ocultas

También puedes usar el comando show/hide para ocultar clases.

Esto puede llegar a ser útil si defines una archivo !included muy grande y si deseas ocultar algunas clases después de la inclusión de dicho archivo.

WARNING
 This translation need to be updated. 
WARNING

Remove classes

You can also use the remove commands to remove classes.

This may be useful if you define a large !included file, and if you want to remove some classes after file inclusion.

Hide, Remove or Restore tagged element or wildcard

You can put $tags (using $) on elements, then remove, hide or restore components either individually or by tags.

By default, all components are displayed:

But you can:

Hide or Remove unlinked class

By default, all classes are displayed:

But you can:

[Adapted from QA-11052]

Uso de clases genéricas

También puedes usar los signos menor < y mayor > para definir el uso de clases genéricas.

Es posible desactivar este dibujo con el comando skinparam genericDisplay old.

Círculo enmarcador específico

Usualmente, un carácter enmarcado en un círculo (C,I,E o A) es usado por clases, interfaces, enum y clases abstractas.

Pero puedes definir tu propio enmarcado para una clase cuando defines un estereotipo, añadiendo un carácter y un color, así como en el ejemplo:

Paquetes

Puedes definir un paquete usando la palabra reservada package, y opcionalmente declarar un color de fondo para tu paquete (Usando el nombre o el código HTML del color).

Tenga en cuenta que las definiciones de paquetes pueden ser anidadas.

WARNING
 This translation need to be updated. 
WARNING

Estilos de paquetes

Hay diferentes estilos disponibles para paquetes.

Puedes especificarlos, ya sea configurando un estilo por defecto con el comando : skinparam packageStyle , o usando un estereotipo en el paquete.

Puedes también definir enlaces entre paquetes, como en el siguiente ejemplo:

Espacios de nombre

En los paquetes, el nombre de una clase es el único identificador de esta clase. Quiere decir que no puedes tener dos clases con el mismo nombre en diferentes paquetes.

En este caso, deberías usar espacios de nombres en lugar de paquetes.

Puedes referir a clases de otros espacios de nombre describiendo su ruta completamente. A clases del espacio de nombre por defecto son descritas colocando un punto al inicio.

Tenga en cuenta que no tiene que especificar explícitamente un espacio de nombre : una clase altamente clasificada es automáticamente colocada en el espacio de nombre correcto.

There won't be any difference between namespaces and packages anymore: both keywords are now synonymous.

There won't be any difference between ``namespaces`` and ``packages`` anymore: both keywords are now synonymous.
WARNING
 This translation need to be updated. 
WARNING

Creación automática del espacio de nombre

Puedes definir otro separador (otro además del punto) usando el comando : set namespaceSeparator ???.

Puedes deshabilitar la creación automática de paquetes usando el comando set namespaceSeparator none.

WARNING
 This translation need to be updated. 
WARNING

Interface Lollipop

También puedes definir interfaces lollipops en clases, usando la siguiente sintaxsis:

Cambiando la dirección de las flechas

Por defecto, enlaces entre clases tienen dos guiones -- y son verticalemnte orientados. Es posible usar un enlace horizontal colocando un solo guión (o punto), así:

También puedes cambiar las direcciones revirtiendo el enlace:

También es posible cambiar la dirección de la flecha añadiendo las palabras claves left, right, up or down dentro de la flecha:

Puedes acortar la flecha usando el primer carácter de la dirección (por ejemplo, -d- en lugar de -down-) o los primeros dos caracteres.

Por favor tenga en cuenta que no debería abusar de esta funcionalidad : Graphviz usualmente otorga buenos resultados sin necesidad de ajustar.

WARNING
 This translation need to be updated. 
WARNING

Asociación de clases

Puedes definir association class después de que una relación haya sido establecida entre dos clases, como en este ejemplo:

Puedes definirla en otra dirección:

Association on same class

[Ref. Incubation: Associations]

Personalización (Skinparam)

Puedes usar el comando skinparam para cambiar los colores y fuentes en el diagrama.

Puedes usar este comando:

Estereotipos personalizados

Puedes definir colores y fuentes específicas para clases esterotipadas.

Any of the spaces shown as `_` below will cause all skinparams to be ignored, see [discord discussion](https://discord.com/channels/1083727021328306236/1289954399321329755/1289967399302467614) and [issue #1932](https://github.com/plantuml/plantuml/issues/1932):
WARNING
 This translation need to be updated. 
WARNING

Degrado de colores

Es posible declarar colores individuales para clases o notas usando la notación #.

Puedes usar el nombre estándar del color o el código RGB.

También puedes usar degradación de color en el fondo, con la siguiente sintaxis: dos nombres de colores separados por cualquier de los siguientes: dependiendo de la dirección del degradado.

Por ejemplo, podrías tener:

WARNING
 This translation need to be updated. 
WARNING

Ayudar en el diseño

Sometimes, the default layout is not perfect...

You can use together keyword to group some classes together : the layout engine will try to group them (as if they were in the same package).

You can also use hidden links to force the layout.

Dividiendo archivos grandes

A veces, puedes obtener imágenes bastante grandes.

Puedes usar el comando page (hpages)x(vpages) para dividir la imágen generada, en varias imágenes:

hpages es el número que indica la cantidad de páginas horizontales, y vpages es el número que indica la cantidad de páginas verticales.

También puede utilizar algunos ajustes específicos skinparam poner fronteras en las páginas splitted (ver ejemplo).

Extends and implements

It is also possible to use extends and implements keywords.

[Ref. QA-2239]

Bracketed relations (linking or arrow) style

Line style

It's also possible to have explicitly bold, dashed, dotted, hidden or plain relation, links or arrows:

[Adapted from QA-4181]

Line color

Line thickness

[Ref. QA-4949]

Mix

Change relation (linking or arrow) color and style (inline style)

You can change the color or style of individual relation or arrows using the inline following notation:

[See similar feature on deployment]

Change class color and style (inline style)

You can change the color or style of individual class using the two following notations:

With background color first (#color), then line style and line color (##[style]color )

[Ref. QA-1487]

First original example:

[Ref. QA-3770]

Arrows from/to class members

[Ref. QA-3636]

[Ref. QA-5261]

Grouping inheritance arrow heads

You can merge all arrow heads using the skinparam groupInheritance, with a threshold as parameter.

GroupInheritance 1 (no grouping)

GroupInheritance 2 (grouping from 2)

GroupInheritance 3 (grouping only from 3)

GroupInheritance 4 (grouping only from 4)

[Ref. QA-3193, and Defect QA-13532]

Display JSON Data on Class or Object diagram

Simple example

[Ref. QA-15481]

For another example, see on JSON page.

Packages and Namespaces Enhancement

[From V1.2023.2+, and V1.2023.5]

[Ref. GH-1352]

Qualified associations

Minimal example

[Ref. QA-16397, GH-1467]

Another example

Cambiar la orientación del diagrama

Puede cambiar la orientación (completa) del diagrama con:

De arriba a abajo (por defecto)

Con Graphviz (motor de diseño por defecto)

La regla principal es: Elemento anidado primero, luego elemento simple.

Con Smetana ( motor de diseño interno)

La regla principal es la contraria: Elemento simple primero, luego elemento anidado.

De izquierda a derecha

Con Graphviz (motor de diseño por defecto)

Con Smetana (motor de diseño interno)

Role label to associations

[Ref. GH-2536, GH-2537]