Skip to content
IRC-CodingIRC-Coding
Diagramas UMLDiagrama de clasesDiagrama de secuenciaDiagrama de actividadesDiagrama de casos de uso

Diagramas UML: Clases, Secuencia y Casos de Uso

UML es la notación estándar para modelado de software. Diagramas de clases, secuencia, actividades y casos de uso con relaciones y ejemplos prácticos.

S

schutzgeist

6 min read
Diagramas UML: Clases, Secuencia y Casos de Uso

Diagramas UML: Clases, Secuencias, Actividades y Casos de Uso

Este artículo te ofrece una descripción completa de los diagramas UML, incluidos todos los tipos principales, relaciones y ejemplos prácticos.

En pocas palabras

UML (Unified Modeling Language) es la notación gráfica estandarizada para modelar sistemas software. Proporciona diferentes tipos de diagramas para representar distintos aspectos del desarrollo de software.

Descripción técnica concisa

Unified Modeling Language (UML) es un lenguaje de modelado estandarizado por la Object Management Group (OMG) para el desarrollo de software orientado a objetos.

Tipos principales de diagramas:

  • Diagramas estructurales: Aspectos estáticos (clases, componentes, despliegue)
  • Diagramas de comportamiento: Aspectos dinámicos (actividades, secuencias, estados)
  • Diagramas de interacción: Comunicación entre objetos

Diagramas más importantes:

  • Diagrama de clases: Clases, atributos, métodos, relaciones
  • Diagrama de secuencia: Secuencia temporal y flujo de mensajes
  • Diagrama de actividades: Flujos de procesos y decisiones
  • Diagrama de casos de uso: Requisitos e interacciones de actores

UML actúa como medio de comunicación entre desarrolladores, arquitectos y stakeholders, y constituye la base para generación de código y documentación.

Puntos clave para exámenes

  • Diagrama de clases: Estructura estática con atributos, métodos, relaciones
  • Diagrama de secuencia: Interacciones temporales entre objetos
  • Diagrama de actividades: Flujos de procesos con decisiones y paralelismo
  • Diagrama de casos de uso: Requisitos funcionales e interacciones de actores
  • Relaciones: Asociación, agregación, composición, herencia
  • Modificadores de visibilidad: public (+), private (-), protected (#), package (~)
  • Multiplicidades: 1, , 0..1, 1.., 0..*
  • Relevante para IHK en arquitectura y diseño de software

Componentes principales

Diagrama de clases

  1. Clases: Rectángulos con nombre, atributos, métodos
  2. Atributos: Propiedades con tipo y visibilidad
  3. Métodos: Operaciones con parámetros y tipo de retorno
  4. Relaciones: Conexiones entre clases

Diagrama de secuencia

  1. Actores: Participantes de la interacción
  2. Líneas de vida: Líneas verticales para objetos
  3. Mensajes: Flechas horizontales entre líneas de vida
  4. Cajas de activación: Rectángulos en las líneas de vida

Diagrama de actividades

  1. Acciones: Rectángulos redondeados
  2. Decisiones: Rombos para bifurcaciones
  3. Inicio/Fin: Círculos para comienzo y término del proceso
  4. Barras de sincronización: Para flujos paralelos

Diagrama de casos de uso

  1. Casos de uso: Óvalos para funcionalidades
  2. Actores: Figuras de palo para usuarios y roles
  3. Límites del sistema: Rectángulos alrededor de los casos de uso
  4. Relaciones: Líneas entre actores y casos de uso

Ejemplos prácticos

1. Diagrama de clases (Sistema de comercio electrónico)

@startuml ECommerceClassDiagram

class Cliente {
  -clienteId: Long
  -nombre: String
  -email: String
  -direccion: String
  +getClienteId(): Long
  +realizar(productoId: Long, cantidad: Int): Pedido
  +getPedidos(): List<Pedido>
}

class Pedido {
  -pedidoId: Long
  -fechaPedido: Date
  -totalPedido: Decimal
  -estado: String
  +calcularTotalPedido(): Decimal
  +setEstado(estado: String): void
  +getLineas(): List<LineaPedido>
}

class Producto {
  -productoId: Long
  -nombre: String
  -precio: Decimal
  -stock: Int
  +getPrecio(): Decimal
  +verificarDisponibilidad(cantidad: Int): Boolean
  +reducirStock(cantidad: Int): void
}

class LineaPedido {
  -lineaId: Long
  -cantidad: Int
  -precioUnitario: Decimal
  +calcularPrecioTotal(): Decimal
}

' Relaciones
Cliente "1" -- "0..*" Pedido : realiza >
Pedido "1" -- "1..*" LineaPedido : contiene >
Pedido "1" -- "*" Producto : hace referencia >
Producto "0..*" -- "0..*" LineaPedido : es pedido >

@enduml

2. Diagrama de secuencia (Proceso de pedido)

@startuml PedidoSecuenciaDiagrama

actor Cliente
participant "ServicioPedido" as Servicio
participant "ServicioProducto" as Producto
participant "ServicioPago" as Pago
participant "ServicioAlmacen" as Almacen

Cliente -> Servicio: realizarPedido(productos, cantidad)
activate Servicio

Servicio -> Producto: verificarProductos(productos)
activate Producto
Producto --> Servicio: infoDisponibilidad
deactivate Producto

alt todos los productos disponibles
    Servicio -> Almacen: reservarAlmacen(productos, cantidad)
    activate Almacen
    Almacen --> Servicio: confirmacionReserva
    deactivate Almacen
    
    Servicio -> Pago: procesarPago(cliente, monto)
    activate Pago
    Pago --> Servicio: confirmacionPago
    deactivate Pago
    
    Servicio -> Almacen: confirmarReserva(idReserva)
    activate Almacen
    Almacen --> Servicio: confirmacionExitosa
    deactivate Almacen
    
    Servicio --> Cliente: confirmacionPedido(idPedido)
else productos no disponibles
    Servicio --> Cliente: errorDisponibilidad(productos)
end

deactivate Servicio

@enduml

3. Diagrama de actividades (Procesamiento de pedidos)

@startuml PedidoActividadesDiagrama

start

:Pedido recibido;

if (Producto disponible?) then (sí)
  :Verificar stock;
  
  fork
    :Procesar pago;
  fork again
    :Verificar dirección de entrega;
  end fork
  
  if (Pago exitoso?) then (sí)
    :Confirmar pedido;
    :Reducir stock;
    :Gestionar envío;
    stop
  else (no)
    :Rechazar pedido;
    :Cancelar reserva de almacén;
    stop
  endif
else (no)
  :Reportar error de disponibilidad;
  :Sugerir productos alternativos;
  stop
endif

@enduml

4. Diagrama de casos de uso (Sistema de comercio electrónico)

@startuml ECommerceUseCaseDiagram

actor Cliente
actor Administrador
actor Proveedor

rectangle "Sistema de Comercio Electrónico" {
  usecase "Buscar producto" as UC1
  usecase "Ver producto" as UC2
  usecase "Gestionar carrito" as UC3
  usecase "Realizar pedido" as UC4
  usecase "Rastrear pedido" as UC5
  usecase "Dejar reseña" as UC6
  usecase "Gestionar productos" as UC7
  usecase "Procesar pedidos" as UC8
  usecase "Gestionar entregas" as UC9
}

' Relaciones
Cliente --> UC1
Cliente --> UC2
Cliente --> UC3
Cliente --> UC4
Cliente --> UC5
Cliente --> UC6

Administrador --> UC7
Administrador --> UC8

Proveedor --> UC9

' Relaciones de inclusión
UC4 --> UC3 : <<include>>
UC4 --> UC2 : <<include>>

' Relaciones de extensión
UC6 --> UC4 : <<extend>>

@enduml

5. Código Java generado desde diagrama de clases

// Cliente.java
public class Cliente {
    private Long clienteId;
    private String nombre;
    private String email;
    private String direccion;
    private List<Pedido> pedidos = new ArrayList<>();
    
    public Long getClienteId() {
        return clienteId;
    }
    
    public Pedido realizar(Long productoId, int cantidad) {
        Pedido pedido = new Pedido();
        pedido.setFechaPedido(new Date());
        // Agregar línea de pedido
        LineaPedido linea = new LineaPedido();
        linea.setCantidad(cantidad);
        pedido.addLinea(linea);
        
        pedidos.add(pedido);
        return pedido;
    }
    
    public List<Pedido> getPedidos() {
        return new ArrayList<>(pedidos);
    }
}

// Pedido.java
public class Pedido {
    private Long pedidoId;
    private Date fechaPedido;
    private BigDecimal totalPedido;
    private String estado;
    private List<LineaPedido> lineas = new ArrayList<>();
    
    public BigDecimal calcularTotalPedido() {
        return lineas.stream()
            .map(LineaPedido::calcularPrecioTotal)
            .reduce(BigDecimal.ZERO, BigDecimal::add);
    }
    
    public void setEstado(String estado) {
        this.estado = estado;
    }
    
    public List<LineaPedido> getLineas() {
        return new ArrayList<>(lineas);
    }
    
    public void addLinea(LineaPedido linea) {
        lineas.add(linea);
    }
}

// Producto.java
public class Producto {
    private Long productoId;
    private String nombre;
    private BigDecimal precio;
    private int stock;
    
    public BigDecimal getPrecio() {
        return precio;
    }
    
    public boolean verificarDisponibilidad(int cantidad) {
        return stock >= cantidad;
    }
    
    public void reducirStock(int cantidad) {
        if (verificarDisponibilidad(cantidad)) {
            stock -= cantidad;
        } else {
            throw new IllegalArgumentException("Stock insuficiente");
        }
    }
}

// LineaPedido.java
public class LineaPedido {
    private Long lineaId;
    private int cantidad;
    private BigDecimal precioUnitario;
    
    public BigDecimal calcularPrecioTotal() {
        return precioUnitario.multiply(new BigDecimal(cantidad));
    }
}

Relaciones UML en detalle

Asociación

Cliente 1..* --* Pedido
  • Ambas clases son interdependientes
  • Ciclo de vida independiente

Agregación

Vehículo 1 --* Rueda
  • Las ruedas pueden existir sin el vehículo
  • Relación “tiene-un”

Composición

Auto 1 --* Motor
  • El motor existe solo con el auto
  • Relación “es-parte-de”

Herencia

Vehículo <|-- Auto
  • Auto hereda de Vehículo
  • Relación “es-un”

Implementación

Interfaz <|.. Clase
  • Clase implementa interfaz
  • Relación de realización

Multiplicidades

SímboloSignificadoEjemplo
1Exactamente uno1 cliente
0..1Cero o uno0..1 dirección
*Cero o más* pedidos
1..*Mínimo uno1..* líneas
0..*Cero a cualquier cantidad0..* productos
2..4Entre 2 y 42..4 ruedas

Modificadores de visibilidad

SímboloSignificadoDescripción
+publicAccesible desde cualquier lugar
-privateSolo dentro de la clase
#protectedDentro de la clase y subclases
~packageDentro del paquete

Ventajas y desventajas

Ventajas de UML

  • Estandarización: Notación uniforme para todos
  • Visualización: Relaciones complejas comprensibles
  • Comunicación: Lenguaje común para el equipo
  • Documentación: Generación automática posible
  • Generación de código: Implementación directa

Desventajas

  • Complejidad: Poco manejable en sistemas muy grandes
  • Curva de aprendizaje: Requiere tiempo de capacitación
  • Sobre-ingeniería: Modelado demasiado detallado
  • Mantenimiento: Los cambios requieren actualizar diagramas

Preguntas frecuentes de examen

  1. ¿Cuál es la diferencia entre agregación y composición? Agregación: “tiene-un” (las partes pueden existir independientemente), Composición: “es-parte-de” (las partes existen solo con el todo).

  2. Explica las multiplicidades 1.. y 0..1.* 1..*: Mínimo uno, cantidad cualquiera. 0..1: Cero o exactamente uno.

  3. ¿Cuándo se utilizan diagramas de secuencia? Para representar secuencias temporales e interacciones entre objetos.

  4. ¿Cuál es el propósito de los diagramas de casos de uso? Modelar requisitos desde la perspectiva de usuarios y actores.

Fuentes principales

  1. https://www.uml.org/
  2. https://de.wikipedia.org/wiki/Unified_Modeling_Language
  3. https://plantuml.com/
Volver al blog
Share:

Entradas relacionadas