UT06 - UML Y DIAGRAMAS DE CLASES
UML: lenguaje de modelado y diagramas de clases
Introducción
El Lenguaje Unificado de Modelado (UML, Unified Modeling Language) es un lenguaje gráfico estandarizado que se utiliza para visualizar, especificar, construir y documentar sistemas de software orientados a objetos. Su finalidad principal es facilitar la comunicación entre los distintos participantes de un proyecto, especialmente analistas, desarrolladores, clientes y responsables técnicos, mediante una notación común y comprensible.
UML no es un lenguaje de programación, sino un lenguaje de modelado. Esto significa que permite representar cómo se organiza y cómo debe comportarse un sistema, pero no describe directamente su implementación en un lenguaje como Java, PHP o Python. Su valor reside en reducir errores de interpretación, mejorar la planificación y servir como apoyo en el análisis y diseño de aplicaciones complejas.
Características
UML presenta una serie de características que explican su amplia utilización en el desarrollo de software. En primer lugar, emplea una notación visual uniforme, formada por símbolos, líneas y estereotipos, que permite describir sistemas de manera clara y estructurada.
Además, UML es independiente del lenguaje de programación y de la metodología concreta utilizada en el desarrollo. Puede aplicarse en proyectos construidos con distintos paradigmas y tecnologías, aunque su uso es especialmente frecuente en el diseño orientado a objetos. También permite representar un sistema desde varios puntos de vista, ya que ofrece diferentes tipos de diagramas para mostrar la estructura, el comportamiento y la interacción entre elementos.
Entre sus rasgos más relevantes destacan los siguientes:
- Proporciona una notación estándar aceptada en la industria del software.
- Facilita la comunicación entre perfiles técnicos y no técnicos.
- Permite modelar tanto sistemas sencillos como sistemas de gran complejidad.
- Ayuda a documentar el diseño antes, durante y después de la implementación.
- Favorece el trabajo en equipo al ofrecer una visión compartida del sistema.
Versiones
UML surgió a partir del trabajo conjunto de Grady Booch, James Rumbaugh e Ivar Jacobson, conocidos en la literatura del software como “los tres amigos”. Cada uno había desarrollado su propia metodología de análisis y diseño orientado a objetos durante las décadas de 1980 y 1990, pero finalmente unificaron sus propuestas en un lenguaje común.
En 1994, Rumbaugh se incorporó a Rational Software, donde ya trabajaba Booch, y en 1995 se sumó Jacobson. A partir de esa colaboración comenzaron a difundirse los primeros borradores del UML, que fueron revisados y ampliados con aportaciones de distintas empresas del sector tecnológico.
En 1997, un consorcio empresarial impulsó la versión 1.0 del UML y la presentó al OMG (Object Management Group) como propuesta de estándar. Ese mismo año se elaboró la versión 1.1, que fue finalmente adoptada por el OMG a finales de 1997. Desde entonces, UML se consolidó como estándar de facto en la industria del software y continuó evolucionando mediante revisiones posteriores.
Diagramas UML
UML está compuesto por distintos elementos gráficos que se combinan para formar diagramas. Cada diagrama representa una perspectiva concreta del sistema, por lo que el conjunto de diagramas constituye un modelo más completo y preciso que una única representación aislada.
La finalidad de estos diagramas es describir qué hace el sistema, cómo se estructura y cómo se relacionan sus partes, sin entrar necesariamente en detalles de implementación. De este modo, UML actúa como un plano técnico comparable al anteproyecto de un edificio en arquitectura.
Entre los diagramas más utilizados en UML se encuentran:
- Diagrama de clases.
- Diagrama de objetos.
- Diagrama de casos de uso.
- Diagrama de secuencia.
- Diagrama de comunicación.
- Diagrama de estados.
- Diagrama de actividades.
- Diagrama de componentes.
- Diagrama de despliegue.
Aunque todos tienen utilidad, en el análisis y diseño orientado a objetos cobra especial importancia el diagrama de clases, ya que representa la estructura estática del sistema y sirve como base para la posterior implementación.
Utilización en metodologías de desarrollo orientado a objetos
UML está estrechamente vinculado a las metodologías de desarrollo orientado a objetos, ya que comparte con ellas los conceptos fundamentales de clase, objeto, herencia, encapsulación y relación entre elementos. Por ello, se utiliza como herramienta de apoyo tanto en el análisis como en el diseño de sistemas software.
En este contexto, el analista emplea UML para capturar los requisitos del cliente y transformarlos en modelos comprensibles por el equipo de desarrollo. Posteriormente, esos modelos sirven para planificar la solución, distribuir responsabilidades entre clases y mantener una visión coherente del sistema durante todo el ciclo de vida del proyecto.
Su uso es especialmente valioso en procesos iterativos e incrementales, donde el diseño se revisa y perfecciona conforme evoluciona el producto. También resulta útil en situaciones donde intervienen varios miembros del equipo o donde los requisitos pueden cambiar durante el desarrollo.
Herramientas CASE con soporte UML
Las herramientas CASE (Computer-Aided Software Engineering) son aplicaciones diseñadas para asistir en tareas de análisis, diseño, documentación, generación de código y mantenimiento de software. Cuando incluyen soporte para UML, permiten crear diagramas de forma visual y mantener una representación más organizada del sistema.
Estas herramientas ofrecen ventajas importantes en entornos académicos y profesionales. Por ejemplo, facilitan el uso correcto de la notación, permiten modificar modelos con rapidez, mejoran la calidad de la documentación y, en determinados casos, posibilitan la generación automática de código o la obtención de diagramas a partir del código existente.
Entre las herramientas CASE más conocidas con soporte UML se pueden citar Visual Paradigm, StarUML, Enterprise Architect, Rational Rose, ArgoUML o Modelio. La elección de una u otra depende del entorno de desarrollo, del presupuesto disponible y de las funcionalidades requeridas.
Elaboración de diagramas de clases
El diagrama de clases es el instrumento central del modelado orientado a objetos. Se utiliza para representar las clases que forman parte de un sistema, los atributos y métodos de cada una de ellas y las relaciones que mantienen entre sí.
La elaboración de un diagrama de clases suele comenzar con la identificación de los conceptos principales del dominio del problema. A partir de ahí, se determinan sus propiedades, sus responsabilidades y las conexiones existentes entre unas clases y otras. Este proceso ayuda a entender el problema antes de programar y proporciona una base sólida para el diseño técnico.
En un contexto práctico, el procedimiento habitual consiste en:
- Analizar el problema y detectar entidades relevantes.
- Agrupar esas entidades en clases.
- Definir sus atributos y métodos.
- Establecer las relaciones entre clases.
- Revisar el nivel de detalle y simplificar el modelo cuando sea necesario.
Notación de los diagramas de clases
La notación de UML para los diagramas de clases utiliza rectángulos divididos en compartimentos. El compartimento superior contiene el nombre de la clase; el central, sus atributos; y el inferior, sus métodos u operaciones.

Esta representación permite captar de forma rápida qué información almacena cada clase y qué comportamiento ofrece. Además, las relaciones entre clases se muestran mediante líneas con distintos símbolos, de modo que el diagrama no solo representa elementos aislados, sino también la estructura global del sistema.
Un ejemplo sencillo sería una clase Lavadora, con atributos como marca, modelo, numeroSerie y capacidad, y con métodos como agregarRopa(), agregarDetergente() o sacarRopa(). Esta forma de modelado permite trasladar elementos del mundo real al diseño del software.
Clases, atributos, métodos y visibilidad
Una clase es una categoría o conjunto de objetos que comparten propiedades y comportamientos comunes. Desde el punto de vista del desarrollo orientado a objetos, las clases constituyen la unidad básica de organización del sistema.
Los atributos representan las características o datos asociados a una clase. Por ejemplo, en una clase Alumno, podrían aparecer atributos como nombre, edad o expediente. Los métodos, en cambio, describen las acciones que la clase puede realizar, como matricular(), calcularMedia() o mostrarDatos().
En UML, la visibilidad de atributos y métodos se indica con símbolos concretos:
+Público: accesible desde cualquier clase.-Privado: accesible solo desde la propia clase.#Protegido: accesible desde la clase y sus subclases.~De paquete: accesible desde clases del mismo paquete.
El uso correcto de la visibilidad es importante porque favorece la encapsulación, uno de los principios básicos de la orientación a objetos.
Objetos e instanciación
Un objeto es una instancia concreta de una clase. Mientras la clase define una estructura general, el objeto representa un elemento real con valores específicos para sus atributos.
Por ejemplo, si existe una clase Lavadora, un objeto podría representarse como lavadora1 : Lavadora, donde lavadora1 es el nombre del objeto y Lavadora el nombre de la clase. Ese objeto podría tener como valores particulares una marca determinada, un número de serie concreto y una capacidad específica.
En UML, los objetos se representan también mediante rectángulos, pero su nombre suele aparecer subrayado. El proceso de crear un objeto a partir de una clase recibe el nombre de instanciación, y es esencial para comprender cómo se materializan las clases en tiempo de ejecución.
Relaciones: asociación, herencia, composición, agregación, dependencia y navegabilidad
Las relaciones son uno de los elementos más importantes del diagrama de clases, ya que permiten expresar cómo se conectan y colaboran las clases del sistema. UML distingue varios tipos de relaciones, cada una con un significado específico.
Asociación
La asociación representa una relación estructural entre dos clases. Indica que existe un vínculo estable entre ellas, de forma que los objetos de una clase pueden relacionarse con objetos de la otra. Por ejemplo, una clase Profesor puede estar asociada con una clase Modulo.
Herencia
La herencia, también llamada generalización, expresa una relación entre una clase general y otra más específica. La subclase hereda atributos y métodos de la superclase. Por ejemplo, ProfesorInterino y ProfesorTitular podrían heredar de Profesor.

Nota: las clases abstractas pueden escribirse en cursiva para indicar que no deben instanciarse directamente.
Composición
La composición representa una relación todo-parte muy fuerte. Las partes dependen completamente del todo y no tienen sentido fuera de él. Por ejemplo, una clase Pedido puede componerse de varias líneas de pedido; si el pedido desaparece, sus líneas también.
Agregación
La agregación también expresa una relación todo-parte, pero más débil que la composición. Las partes pueden existir independientemente del todo. Por ejemplo, una clase Departamento puede agrupar a varios Profesor, pero los profesores pueden seguir existiendo aunque desaparezca el departamento.
Dependencia
La dependencia indica que una clase utiliza a otra de forma puntual, normalmente como parámetro, variable local o elemento auxiliar. Es una relación menos estable que la asociación y suele representarse con una línea discontinua.
Navegabilidad
La navegabilidad señala la dirección en la que una relación puede recorrerse. Si una clase conoce a la otra y puede acceder a ella, se indica mediante una flecha. Este aspecto resulta útil para reflejar la dirección de uso o conocimiento entre objetos.
Clases abstractas e interfaces
Las clases abstractas son clases que no están pensadas para ser instanciadas directamente. Su función es servir de base para otras clases más concretas, compartiendo atributos y métodos comunes que luego podrán especializarse.
En UML, las clases abstractas suelen representarse con el nombre en cursiva o con alguna indicación explícita de abstracción. Son especialmente útiles cuando varias clases comparten estructura y comportamiento, pero no tiene sentido crear objetos directamente de la clase general.
Las interfaces, por su parte, definen un conjunto de operaciones que otras clases deben implementar. Se emplean para establecer contratos de comportamiento y favorecer un diseño desacoplado, flexible y reutilizable. En UML suelen representarse mediante el estereotipo <<interface>>.
Paquetes
Los paquetes son mecanismos de organización del modelo. Permiten agrupar clases y otros elementos relacionados dentro de una unidad lógica, facilitando la comprensión del sistema y evitando diagramas excesivamente recargados.
Su utilidad aumenta conforme crece el tamaño del proyecto, ya que ayudan a estructurar el modelo en subsistemas, capas o áreas funcionales. En una aplicación web, por ejemplo, podrían definirse paquetes como modelo, controladores, servicios, persistencia o utilidades.
Además de organizar, los paquetes contribuyen a mejorar la modularidad del diseño y permiten delimitar dependencias entre partes del sistema.
Grado de detalle
El grado de detalle de un diagrama de clases debe ajustarse a su finalidad. No todos los diagramas requieren el mismo nivel de precisión: algunos se elaboran para explicar una idea general, mientras que otros sirven como base directa para la codificación.
Un modelo demasiado simple puede ocultar aspectos relevantes del diseño. Por el contrario, un diagrama excesivamente detallado puede resultar difícil de interpretar y mantener. Por ello, conviene buscar un equilibrio entre claridad, utilidad y precisión, teniendo en cuenta el momento del proyecto y el destinatario de la documentación.
Utilización de herramientas CASE para elaborar diagramas de clases con UML
Las herramientas CASE permiten elaborar diagramas de clases con mayor rapidez y precisión que los métodos manuales. Gracias a sus interfaces gráficas, el diseñador puede añadir clases, atributos, relaciones y restricciones de manera visual, manteniendo la coherencia del modelo.
En el ámbito educativo, su uso resulta especialmente recomendable porque ayuda a aprender la notación UML de forma práctica y reduce errores formales. En el ámbito profesional, aportan ventajas adicionales como control de cambios, validación del modelo, exportación de documentación y sincronización con el código fuente.
Módulos integrados en entornos de desarrollo para elaborar diagramas de clases
Muchos entornos de desarrollo integrados (IDE) incorporan módulos o complementos que permiten trabajar con diagramas UML sin abandonar el propio entorno de programación. Esta integración favorece un flujo de trabajo más eficiente y conecta directamente el diseño con la implementación.
Gracias a estos módulos, es posible visualizar clases existentes, detectar relaciones entre componentes y documentar la estructura interna del proyecto. En algunos casos, también permiten generar esqueletos de código o reconstruir diagramas a partir de proyectos ya desarrollados.
Creación de código a partir de diagramas de clases
La creación de código a partir de diagramas de clases consiste en transformar automáticamente el modelo UML en código fuente inicial. Este proceso suele generar clases, atributos, métodos y, en ocasiones, parte de las relaciones estructurales del sistema.
Esta funcionalidad es útil para acelerar el desarrollo y garantizar una correspondencia básica entre diseño e implementación. Sin embargo, el código generado normalmente necesita ser completado y adaptado por el desarrollador, ya que la lógica de negocio detallada no queda plenamente reflejada en el modelo.
Generación de diagramas de clases a partir de código (ingeniería inversa)
La ingeniería inversa es el proceso contrario: a partir del código fuente de una aplicación, una herramienta obtiene automáticamente un diagrama de clases que representa su estructura. Este procedimiento resulta especialmente útil para comprender proyectos heredados, documentar aplicaciones existentes o analizar sistemas que no disponen de diseño previo.
Gracias a la ingeniería inversa, es posible detectar dependencias, jerarquías de clases y relaciones estructurales de manera más rápida que mediante revisión manual del código. Por ello, constituye una técnica muy valiosa en tareas de mantenimiento, refactorización y auditoría técnica.