PlantUML – Dibuja diagramas UML de forma sencilla

1
25513

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

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:

Diagrama1

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

Diagrama2

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

Diagrama3

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

Diagrama4

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

Diagrama5

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

Diagrama6

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

Diagrama7

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

Diagrama8

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

Diagrama9

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

Diagrama10

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
  • Diagrama11

  • Diagrama de componentes
  • Diagrama12

  • Diagrama de despliegue
  • Diagrama13

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).

Captura de pantalla atom

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:

Captura de pantalla atom paquetes

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.

Captura de pantalla eclipse anotaciones

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:

Captura de pantalla eclipse automático

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

1 COMENTARIO

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad