Componentes básicos de un diagrama de clases
Según el contexto, las clases en un diagrama de clases pueden representar los objetos principales, las interacciones en la aplicación o las clases que se van a programar. Para responder a la pregunta "¿Qué es un diagrama de clases en UML?", primero debes comprender su composición básica.
- Clases: una plantilla para crear objetos e implementar comportamientos en un sistema. En UML, a clase representa un objeto o un conjunto de objetos que comparten una estructura y un comportamiento comunes. Se representan mediante un rectángulo que incluye filas para el nombre de la clase, sus atributos y sus operaciones. Cuando dibujas una clase en un diagrama de clases, solo tienes la obligación de completar la fila superior; las demás son opcionales si quieres proporcionar más detalles.
- Señales: símbolos que representan comunicaciones asincrónicas unidireccionales entre objetos activos.
- Tipos de datos: clasificadores que definen valores de datos. Los tipos de datos pueden modelar tanto tipos primitivos como enumeraciones.
- Paquetes: figuras diseñadas para organizar clasificadores relacionados en un diagrama. Se simbolizan con una figura de rectángulo grande con pestañas.
- Interfaces: una colección de firmas de operación o definiciones de atributos que definen un conjunto cohesivo de comportamientos. Las interfaces son similares a las clases, excepto que una clase puede tener una instancia de su tipo y una interfaz debe tener al menos una clase que la implemente.
- Enumeraciones: representaciones de tipos de datos definidos por el usuario. Una consideración incluye grupos de identificadores que representan valores de la enumeración.
- Objetos: instancias de una o varias clases. Se pueden agregar objetos a un diagrama de clases para representar instancias concretas o prototípicas.
- Artefactos: elementos de modelo que representan las entidades concretas en un sistema de software, como documentos, bases de datos, archivos ejecutables, componentes de software, etc.
Secciones dentro de una clase
La clase estándar se compone de tres secciones:
Sección superior
Contiene el nombre de la clase. Esta sección siempre es obligatoria, ya sea que estés hablando del clasificador o de un objeto. El nombre de la clase debe:
- Comenzar con mayúscula.
- Estar en negrita.
- Estar centrado en la sección superior.
- Ser descriptivo.
Sección central
Contiene los atributos de la clase. Usa esta sección para describir las cualidades de la clase. Esto solo es necesario cuando se describe una instancia específica de una clase.
Sección inferior
Incluye las operaciones (métodos) de la clase. Se muestra en formato de lista y cada operación ocupa su propia línea. Las operaciones describen cómo interactúa una clase con los datos. El texto de las dos secciones inferiores suele estar alineado a la izquierda y se escribe con la primera letra en minúscula.
Modificadores de acceso de miembros
Todas las clases tienen diferentes niveles de acceso según el modificador de acceso (visibilidad). Aquí están los niveles de acceso con sus símbolos correspondientes:
- Público (+)
- Privado (-)
- Protegido (#)
- Paquete (~)
- Derivado (/)
- Estático (subrayado)
Ámbitos de miembros
Existen dos ámbitos para los miembros: clasificadores e instancias.
Los clasificadores a menudo se reconocen como estáticos, lo que significa que los valores de los atributos siguen siendo los mismos en todas las instancias y la invocación del método no afecta al estado de la instancia. En comparación, las instancias contienen métodos que pueden cambiar el estado de la instancia y los valores de los atributos que pueden variar entre las instancias. Para indicar un clasificador, simplemente subraya su nombre; deja el texto normal para indicar una instancia.
Interacciones
El término "interacciones" se refiere a las diversas relaciones y enlaces que pueden existir en los diagramas de clases y de objetos. Algunas de las interacciones más comunes incluyen:
Herencia: el proceso por el cual una subclase o clase hija adopta la funcionalidad de una superclase o clase madre, también conocida como generalización. Se simboliza con una línea recta conectada con una punta de flecha cerrada que apunta hacia la superclase.

En este ejemplo, el objeto "Car" heredaría todos los atributos (velocidad, número de pasajeros, combustible) y métodos (go(), stop(), changeDirection()) de la clase madre ("Vehicle"), además de los atributos específicos (tipo de modelo, número de puertas, fabricante de automóviles) y métodos de su propia clase (Radio(), windshieldWiper(), ac/heat()). La herencia se muestra en un diagrama de clases mediante el uso de una línea sólida con una flecha cerrada y hueca.
Asociación bidireccional: la relación predeterminada entre dos clases. Ambas clases se detectan entre sí y conocen su relación con la otra. Esta asociación se representa mediante una línea recta entre dos clases.

En el ejemplo anterior, la clase Car y la clase RoadTrip están interrelacionadas. En un extremo de la línea, la clase Car adopta la asociación de "assignedCar" con el valor de multiplicidad de 0..1, por lo que cuando existe la instancia de RoadTrip, puede tener una instancia de Car asociada o ninguna. En este caso, se necesita una clase Caravan independiente con un valor de multiplicidad de 0..* para demostrar que un RoadTrip podría tener varias instancias de Car asociadas. Dado que una instancia de Car podría tener varias asociaciones de "getRoadTrip" (en otras palabras, un automóvil podría realizar varios viajes por carretera), el valor de multiplicidad se establece en 0..*
Asociación unidireccional: una relación un poco menos común entre dos clases. Una clase detecta a la otra e interactúa con ella. La asociación unidireccional se modela con una línea recta de conexión que apunta con una punta de flecha abierta desde la clase que detecta hacia la clase detectada.

Como ejemplo, en tu viaje por carretera a través de Arizona, puedes toparte con una trampa de velocidad donde una cámara de velocidad registra tu actividad de conducción, pero no lo sabrás hasta que recibas una notificación por correo. No está dibujado en la imagen, pero en este caso, el valor de multiplicidad sería de 0..* dependiendo de cuántas veces pases por la cámara de velocidad.