En este tutorial aprenderemos qué es PlantUML y cómo se puede utilizar. Detallaremos mediante ejemplos los tipos de diagramas que se pueden hacer con esta herramienta.
Índice de contenidos
- 1. Introducción
- 2. Entorno
- 3. Instalación
- 4. Diagramas de secuencia
- 5. Diagrama de clases
- 6. Diagramas de estado
- 7. Diagramas de actividad
- 8. Otros diagramas
- 9. Integración en IDEs y editores de texto
- 10. Conclusiones
- 11. Referencias
1. Introducción
PlantUML es una herramienta de dibujo de diagramas. Soporta varios de los diagramas más usados. Entre ellos destacan:
- Diagramas de Secuencia
- Diagramas de Clases
- Diagramas de Estados
- Diagramas de Actividad
Una de sus ventajas es que se puede integrar con una gran cantidad de aplicaciones. Nosotros lo hemos probado con Atom, en el que dispone de un paquete que traduce al vuelo el código que se va escribiendo (https://atom.io/packages/plantuml-viewer), de forma que dibuja en el momento en el que escribes. También se puede integrar en IDEs, como eclipse, en los que por medio de anotaciones se pueden acompañar diagramas dentro de una clase java.
Otra de sus ventajas es la simplicidad e intuitividad de su sintaxis, por ejemplo, para hacer una flecha en un diagrama de secuencia se usa “->”; si se necesita una flecha discontinua se usaría “–>»; una relación de herencia en un diagrama de clases “<|--”.
Es importante recordar que es una herramienta de dibujo. Esto quiere decir que es posible dibujar diagramas inconsistentes si no se tiene algo de cuidado.
2. Entorno
El tutorial está escrito usando el siguiente entorno:
- Hardware: 2 Ghz Intel Core I7, 8GB DDR3
- Sistema Operativo: OS X El Capitan
- Entorno de desarrollo: Atom
- Entorno de desarrollo: Eclipse Mars
3. Instalación
Para el correcto funcionamiento de PlantUML deberemos tener instalado software adicional: Graphviz. Es necesario para poder generar la mayoría de los diagramas.
Finalmente, descargamos el jar correspondiente a PlantUML para ponernos manos a la obra.
4. Diagramas de secuencia
Comencemos, pues, a dibujar. Lo principal es empezar cada uno de nuestros diagramas con @startuml y terminarlos con @enduml. Veremos mediante ejemplos qué cosas se pueden hacer con esta herramienta, desde algo sencillo a algo más complejo. La complejidad y el tamaño de los diagramas puede ser atroz. Por si os queréis hacer una idea, en la documentación se habla de un problema de memoria para diagramas de mas de 20000 x 10000px, pudiéndose arreglar aumentando la memoria que usa la JVM. Nosotros no vamos a llegar a tanto, empezamos con un diagrama sencillo tal que así:
@startuml Juan -> Paco: saluda Juan <-- Paco: responde Juan -> Jesús: saluda Juan <-- Jesús: responde @enduml
Que genera el siguiente diagrama:
También podemos declarar distintos participantes en el diagrama, como un actor (el monigote de los diagramas) o una base de datos, entre otros. Incluso añadir notas, o cambiar la apariencia de todo. Completando el ejemplo anterior… (lo siento Jesús, te he convertido en baseDeDatos)
@startuml actor Juan database baseDeDatos #green Juan -> baseDeDatos: saludas note right: cortesía Juan <-- baseDeDatos: responde Juan -> Paco: saluda Paco -> Paco: ¿cómo se \nllamaba \neste tío? Juan <-- Paco: responde @enduml
Como podemos ver, las posibilidades se hacen enormes según descubrimos nuevos elementos que añadir en nuestros diagramas, así como formas de combinarlos. En el siguiente código podemos ver una muestra de las posibilidades:
@startuml == Comienzo== Elemento1 -X Elemento2 Elemento2 -[#0000FF]-\ Elemento1 Elemento2 <-> Elemento1 == Final == Elemento1 ->o Elemento2 @enduml
Con esto terminamos con los diagramas de secuencia, podemos hacernos una idea de las posibilidades.
5. Diagramas de clases
Lo siguientes diagramas que tenemos en la lista son los diagramas de clases, vamos a analizarlos. A continuación exponemos las principales operaciones entre clases: Herencia, composición y agregación.
@startuml Clase1 <|-- Clase2 Clase1 <|-- Clase3 Clase4 *-- Clase5 Clase6 o-- Clase7 @enduml
Como hemos hecho antes, ahora completamos el diagrama con más elementos para demostrar la potencia: nombres a las relaciones, métodos, etc.
@startuml class Clase1{ toString() } class Clase2 { String[] elementos mostrarElementos() } Clase1 <|-- Clase2 Clase1 <|-- Clase3 Clase4 "1" *-- "n" Clase5 :agregación Clase6 o-- Clase7 @enduml
Tenemos muchas más opciones para relacionar clases entre sí, más ejemplos:
@startuml Clase1 .. Clase2 Clase1 -- Clase3 Clase3 --> Clase4 Clase4 <|.. Clase5 Clase6 ..> Clase7 Clase7 ..|> Clase8 Clase8 <--* Clase9 @enduml
Para acabar con este tipo de diagramas, vamos a hablar de la visibilidad de métodos y atributos, así como la posibilidad de trabajar con interfaces o clases abstractas, dejando muchas cosas en el tintero para que podáis investigar (y no os de tanta pereza leer un artículo tan largo).
@startuml abstract Abstracta{ -privado #protected ~package_private() +public() } interface Interfaz { metodo() } enum TimeUnit { DIAS HORAS MINUTOS } class Clase2 #red Abstracta <|-- Clase2 Abstracta <|-- Clase3 Interfaz <|.. Clase4 Interfaz <|.. Clase5 @enduml
6. Diagramas de estados
Seguimos con los diagramas de estados de toda la vida, que simbolizan un esquema de transiciones entre diversos estados.
@startuml [*] --> Nacimiento Nacimiento : sin preocupaciones Tropiezo: se lió parda Nacimiento --> Tropiezo : torpeza Tropiezo -> Muerte : SAMUR no llega a tiempo Muerte --> [*] @enduml
Se pueden tener además estados compuestos. Completando el ejemplo anterior con un estado compuesto nos quedaría algo como lo siguiente:
@startuml [*] --> Nacimiento Nacimiento : sin preocupaciones state Tropiezo { Agilidad: lo esquiva Torpeza: se lio parda } Nacimiento --> Tropiezo : torpeza Agilidad -> Vida : felicidad Torpeza -> Muerte : SAMUR no llega a tiempo Torpeza -> Vida : SAMUR llega a tiempo Vida --> Muerte Muerte --> [*] @enduml
A grandes rasgos es todo para este tipo de diagramas. Señalar que las flechas de transiciones entre estados se adaptan bastante bien a los elementos con los que puedan colisionar.
7. Diagramas de actividad
Para ilustrar este tipo de diagramas os mostraré un ejemplo de la documentación de PlantUML que muestra la actividad de un servlet container haciendo uso de la mayoría de opciones que podemos usar en este tipo de diagramas. Se puede observar que el código es bastante legible, en consonancia con lo visto en apartados anteriores. Además, se puede comprobar que aunque los diagramas crezcan en tamaño, siguen dibujandose de forma que nada se "pisa".
@startuml title Servlet Container (*) --> "ClickServlet.handleRequest()" --> "new Page" if "Page.onSecurityCheck" then ->[true] "Page.onInit()" if "isForward?" then ->[no] "Process controls" if "continue processing?" then -->[yes] ===RENDERING=== else -->[no] ===REDIRECT_CHECK=== endif else -->[yes] ===RENDERING=== endif if "is Post?" then -->[yes] "Page.onPost()" --> "Page.onRender()" as render --> ===REDIRECT_CHECK=== else -->[no] "Page.onGet()" --> render endif else -->[false] ===REDIRECT_CHECK=== endif if "Do redirect?" then ->[yes] "redirect request" --> ==BEFORE_DESTROY=== else if "Do Forward?" then -left->[yes] "Forward request" --> ==BEFORE_DESTROY=== else -right->[no] "Render page template" --> ==BEFORE_DESTROY=== endif endif --> "Page.onDestroy()" -->(*) @enduml
8. Otros diagramas
Finalizaremos aquí el repaso más detallado a los distintos diagramas que se pueden crear, puesto que ya os podéis hacer una idea de la potencia de esta herramienta. Sin embargo, vale la pena mencionar algunos de los diagramas que nos dejamos por el camino, junto con una imagen creada con PlantUML:
- Diagrama de casos de uso
- Diagrama de componentes
- Diagrama de despliegue
9. Otros diagramas
Como hemos introducido al principio, PlantUML se puede integrar con multitud de IDEs y editores de texto: Eclipse, Netbeans, Intellij, Atom, Sublime, Emacs, etc.
Nosotros lo hemos probado con Atom, en el que dispone de un paquete que traduce al vuelo el código que se va escribiendo (plantuml-viewer), de forma que dibuja en el momento en el que escribes. Se instala desde el gestor de paquetes de Atom (la pestaña de Install en las opciones).
Como vemos arriba, buscamos plantuml e instalamos 2 paquetes. Primero plantuml-viewer para la traducción al vuelo de nuestro código así como la posibilidad de guardar el diagrama generado. Por último language-plantuml para que Atom reconozca la sintaxis de PlantUML.
Una vez hecho todo esto, ya se puede trabajar con él:
También se puede integrar en IDEs, como eclipse. Para instalarlo en eclipse se necesita instalar mediante la opción Install New Software, según se indica en la web de PlantUML.
Por medio de anotaciones se pueden crear diagramas dentro de una clase java de la misma forma que hemos creado con anterioridad.
Sin embargo, lo más interesante de este plugin es que también crea de forma automática diagramas del contexto en el que te encuentres, por ejemplo, creando una clase que hereda de otra con sus métodos y sus atributos:
10. Conclusiones
Como hemos podido comprobar, nos encontramos ante una forma muy potente de dibujar diagramas, que se puede integrar con muchas de las herramientas de edición más utlizadas. Además, la traducción al vuelo es una feature muy interesante, el permitir ver instantáneamente reflejados los cambios en el código se agradece enormemente. Os animo a probarlo y comentar la entrada con vuestras conclusiones.
11. Referencias
- PlantUML Reference guide.
- Instalación e Integración con IDEs y editores de texto.
- PlantUML-viewer. Paquete de Atom para traducción al vuelo.
- language-plantuml. Paquete de Atom para sintaxis.
- Plugin de eclipse.
- PlantUML. In a nutshell, guía rápida.
Muy útil, gracias.