terminal

codeando_simple

terminal

menu

terminal

search_module

guest@codeandosimple: ~/system/search $ grep -r "" .

Press [ENTER] to execute search

Status

Engine: Ready

Database: Online

Index: V2.1.0_LATEST

bash — cat uml-clases.md
guest@codeandosimple: ~/blog/uml $ cat diagrama-clases.md

Diagrama de Clases_

// "Somos lo que hacemos repetidamente. La excelencia, entonces, no es un acto, es un hábito." - Aristóteles

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.

Representación de una clase

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.

Relación de Asociación
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):

Navegabilidad en Asociación

# Herencia

Una línea que termina en un triángulo apuntando hacia una superclase, indicando que una clase hereda de otra.

Relación de Herencia
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.

Agregación

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.

Composición

# 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.

Interfaz en UML

Símbolos de Visibilidad:

  • + Público
  • - Privado
  • # Protegido

# Diagrama Completo

Diagrama de clases 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.