Un diagrama de clases describe los tipos de objetos (sus atributos, operaciones y restricciones) que hay en el sistema y las relaciones estáticas que existen entre ellos.
Básicamente hay dos tipos de relaciones:
-
Asociaciones: Un Cliente hace un Pedido
-
Subtipos: Un Profesor es un subtipo de Persona
# Componentes: Clases
Representadas por rectángulos divididos en tres secciones:
-
Nombre de la Clase: La parte superior muestra el nombre de la clase.
-
Atributos: La sección del medio lista las propiedades o datos que la clase mantiene.
-
Métodos: La sección inferior detalla las operaciones o funciones que la clase puede realizar.
En código:
public class Pedido {
// Atributos privados
private Date fecha;
private int cantidad;
private double precio;
// Constructor
public Pedido(Date fecha, int cantidad, double precio) {
this.fecha = fecha;
this.cantidad = cantidad;
this.precio = precio;
}
// Métodos públicos
public void despacha() {
// Implementación del método despacha
}
public void cierra() {
// Implementación del método cierra
}
// Podríamos agregar los métodos de acceso (getters) y
// modificación (setters) de los atributos privados
}
# Relaciones: Asociación
Una línea simple que conecta dos clases y representa una relación entre ellas, como la colaboración o interacción.
La multiplicidad indica la cantidad de objetos que participan. El *â entre Cliente y Pedido indica que Cliente puede tener muchos Pedidos asociados; el 1â indica que un Pedido viene de un solo Cliente.
public class Cliente {
private String nombre;
private String direccion;
private List<Pedido> pedidos; // Lista de pedidos asociados
public Cliente(String nombre, String direccion) {
this.nombre = nombre;
this.direccion = direccion;
this.pedidos = new ArrayList<>();
}
public void addPedido(Pedido pedido) {
pedidos.add(pedido);
}
}
Si agregamos Navegabilidad (con Pedido apuntando a Cliente):
# Herencia
Una línea que termina en un triángulo apuntando hacia una superclase, indicando que una clase hereda de otra.
public class ClienteCorporativo extends Cliente {
private String nombreContacto;
private double limiteCredito;
public ClienteCorporativo(String nombre, String direccion, String contacto, double limite) {
super(nombre, direccion);
this.nombreContacto = contacto;
this.limiteCredito = limite;
}
}
# Agregación y Composición
Agregación (Relación Débil)
Un objeto está relacionado con otros, teniendo los segundos una existencia propia. Si se borra la librería, los libros pueden seguir existiendo.
Composición (Relación Fuerte)
La existencia de uno depende del otro; la parte no puede existir sin el todo. Se borra el polígono, se borran sus puntos.
# Interfaces y Visibilidad
Una interfaz es una clase sin implementación (operaciones sin cuerpo ni atributos). Se usa <<interface>> y líneas punteadas para la implementación.
Símbolos de Visibilidad:
- + Público
- - Privado
- # Protegido
# Diagrama Completo
Propósito y Uso
-
Diseño: Esenciales para definir la estructura del código antes de implementarlo.
-
Documentación: Detalla cómo está construido el sistema para el mantenimiento futuro.
-
Comunicación: Facilita el entendimiento común entre desarrolladores y analistas.
# Conclusión
El diagrama de clases es un instrumento vital en UML y en la ingeniería de software, no solo ayuda a los desarrolladores a pensar y diseñar de manera estructurada y organizada, sino que también asegura que el equipo de desarrollo comparta una comprensión común del diseño del sistema.