Introducción
Creo que todo el mundo ha oído en la infancia un dicho como " Mida dos veces, corte una vez ". Es lo mismo en programación. Siempre es mejor pensar en la implementación antes de dedicar tiempo a ejecutarla. A menudo, durante la implementación hay que crear clases e inventar su interacción. Y, a menudo, una representación visual de esto puede ayudar a resolver el problema de la manera más correcta. Aquí es donde UML nos ayuda .¿Qué es UML?
Si miras imágenes en los motores de búsqueda, quedará claro que UML se trata de diagramas, flechas y cuadrados. Lo importante es que UML se traduce a Unified Modeling Language . La palabra Unificado es importante aquí. Es decir, nuestras imágenes serán entendidas no sólo por nosotros, sino también por otras personas que conocen UML. Resulta que este es un lenguaje internacional para dibujar diagramas.
Como dice Wikipedia
UML es un lenguaje de descripción gráfica para el modelado de objetos en el desarrollo de software, modelado de procesos comerciales, diseño de sistemas y visualización de estructuras organizativas.Lo más interesante de lo que no todo el mundo piensa o se da cuenta es que UML tiene especificaciones. Además, existe incluso una especificación UML2. Se pueden encontrar más detalles sobre la especificación en el sitio web de Object Management Group . En realidad, este grupo está desarrollando especificaciones UML. También es interesante que UML no se limita a describir la estructura de clases. Hay muchos tipos de diagramas UML. Una breve descripción de los tipos de diagramas UML se puede ver en la misma Wikipedia: Diagramas UML o en el vídeo de Timur Batyrshinov Revisión de diagramas UML . UML también se usa ampliamente para describir varios procesos, por ejemplo aquí: Inicio de sesión único usando JWT . Volviendo al uso de los diagramas de clases UML, cabe destacar el libro Head First: Design Patterns , en el que los patrones se ilustran mediante esos mismos diagramas UML. Resulta que efectivamente se está utilizando UML. Y resulta que el conocimiento y la comprensión de su aplicación es una habilidad bastante útil.
Solicitud
Veamos cómo puedes trabajar con este mismo UML desde el IDE. Tomemos IntelliJ Idea como IDE . Si utilizamos IntelliJ Idea Ultimate , entonces tendremos el complemento “ UML Support ” instalado de fábrica. Le permite generar automáticamente hermosos diagramas de clases. Por ejemplo, usando Ctrl+N o el elemento de menú "Navegar" -> "Clase" vamos a la clase ArrayList . Ahora, a través del menú contextual del nombre de la clase, seleccione "Diagrama" -> "Mostrar ventana emergente de diagrama". Como resultado, obtenemos un hermoso diagrama:

@startuml
class ArrayList {
}
class LinkedList {
}
@enduml
Para ver el resultado en Idea, seleccione "Ver" -> "Ventanas de herramientas" -> "PlantUML". Solo obtendremos dos cuadrados que representan clases. Como sabemos, ambas clases implementan la interfaz List. Esta relación de clases se llama implementación. Para representar dicha conexión, use una flecha con una línea de puntos. Representémoslo:
interface List
List <|.. ArrayList
List <|.. LinkedList
List
- una de las clases infantiles Collection
. Es decir, hereda de Collection. Esta conexión se llama generalización. Parece una flecha con una línea continua regular. Representémoslo:
interface Collection
Collection <|-- List
Para el siguiente tipo de conexión, agregue a la descripción de la clase ArrayList
una entrada sobre la matriz privada de elementos del paquete:
~Object[] elementData
Ahora queremos mostrar qué ArrayList
contiene algunos objetos. En este caso, el tipo de conexión será agregación . La unidad en este caso es ArrayList
, porque contiene otros objetos. Elegimos la agregación porque los objetos de la lista pueden vivir sin la lista: no son partes integrales de ella. Su vida útil no está ligada a la vida útil de la lista. Agregado se traduce del latín como "ensamblado", es decir, algo formado por algo. Por ejemplo, en la vida hay una unidad de bombeo, que consta de una bomba y un motor. La unidad en sí se puede desmontar, dejando algunos de sus componentes. Por ejemplo, para vender o poner en otra unidad. Así es la lista. Y esto se expresa en forma de un diamante vacío cerca de la unidad y una línea continua. Representémoslo así:
class Object{
}
ArrayList o- Object
Ahora queremos mostrar que, a diferencia de ArrayList
, la clase LinkedList
contiene Node
contenedores que hacen referencia a datos almacenados. En este caso, Node
son parte de sí mismos LinkedList
y no pueden vivir separados. Node
no es contenido almacenado directamente, solo contiene un enlace al mismo. Por ejemplo, cuando agregamos a LinkedList
una fila, agregamos un nuevo Node
, que contiene un enlace a esa fila, así como un enlace a la anterior y a la siguiente Node
. Este tipo de comunicación se llama composición . Para mostrar un compuesto (uno que consta de partes), se dibuja un diamante de color, con una línea continua que conduce a él. Ahora escribamos esto como una visualización de texto de la conexión:
class Node{
}
LinkedList *-- Node
Y ahora necesitamos aprender a visualizar otro tipo importante de relación: la relación de dependencia . Se usa cuando una clase usa otra y la clase no contiene la clase que se está usando y no es su descendiente. Por ejemplo, LinkedList
saben ArrayList
crear ListIterator
. Mostremos esto como flechas con una línea de puntos:
class ListIterator
ListIterator <... ArrayList : create
ListIterator <... LinkedList : create
Después de todo esto quedará así:


Automatización
Hay varias formas de generar automáticamente diagramas PlantUML. Por ejemplo, Idea tiene un complemento SketchIT , pero no los dibuja del todo correctamente. Por ejemplo, la implementación de las interfaces se dibuja incorrectamente (se muestra como herencia). También hay ejemplos en Internet sobre cómo incorporar esto en el ciclo de vida de construcción de su proyecto. Digamos que hay un ejemplo de Maven que usa uml-java-docklet . Para mostrar cómo se hace esto, usaremos Maven Archetype para crear rápidamente un proyecto Maven. Ejecutemos el comando:mvn archetype:generate
Cuando se le solicite seleccionar un filtro ( Elija un número o aplique el filtro ), deje el valor predeterminado simplemente presionando Enter. Siempre será " maven-archetype-quickstart ". Seleccione la última versión. A continuación, respondemos las preguntas y completamos la creación del proyecto:

mvn clean install
: y mvn javadoc:javadoc
. Ahora, si abrimos la documentación generada (explorer target\site\apidocs\index.html), veremos los diagramas UML. Por cierto, la implementación ya se muestra correctamente aquí)
GO TO FULL VERSION