Saltar a contenido

3.3.-Identificación de clases

3.3 Identificación de Clases y Buenas Prácticas

1. Introducción

La identificación de clases es uno de los pasos más importantes y desafiantes en el diseño orientado a objetos. Un buen modelo de clases es la base para un sistema bien estructurado, mantenible y escalable.

Principio fundamental

Cada comportamiento que requiera el sistema debe ser proporcionado por los objetos de las clases que elijamos

Este documento se centra en cómo identificar clases, cómo relacionarlas y las buenas prácticas para crear diagramas de clases efectivos.

2. Fundamentos de la Identificación

2.1. ¿Qué buscamos al identificar clases?

Al identificar clases, buscamos representar:

  1. Entidades del dominio: Objetos que existen en el mundo real o conceptual del problema
  2. Responsabilidades: Qué debe hacer cada clase en el sistema
  3. Colaboraciones: Cómo las clases trabajan juntas para cumplir los requisitos

2.2. Consideraciones importantes

Es importante recordar que los objetos son realmente cosas dentro de un programa de computador. Cuando hablamos sobre "libros" y "copias", por ejemplo, realmente nos referimos a la representación de estas cosas dentro de nuestro sistema.

Las consecuencias de esto son que hay que tener cuidado:

  • No almacenar información que es definitivamente irrelevante para nuestro sistema
  • No perder la visión del hecho de que ¡los objetos son el sistema!
  • Mantener el enfoque en lo que el sistema necesita, no en todo lo que existe en el mundo real

3. Objetivos de un Buen Modelo de Clases

La construcción de un modelo de clases incluye dos objetivos fundamentales:

3.1. Objetivo 1: Construcción eficiente

Construir, lo más rápido y barato posible, un sistema que satisfaga nuestros requisitos actuales.

Principio

Cada comportamiento que requiera el sistema debe ser proporcionado por los objetos de las clases que elijamos

Estrategias: - Identificar las clases mínimas necesarias - Enfocarse en los requisitos actuales - Evitar sobre-ingeniería prematura

3.2. Objetivo 2: Mantenibilidad

Construir un sistema que sea fácil de mantener y adaptar a futuros requisitos.

Principio

Un buen modelo de clases está formado por módulos encapsulados, con acoplamiento débil (pocas dependencias entre módulos) y cohesión fuerte

Características clave: - Alta cohesión: Cada clase tiene una responsabilidad clara y bien definida - Bajo acoplamiento: Las clases tienen pocas dependencias entre sí - Encapsulamiento: Los detalles internos están ocultos

4. Proceso Iterativo de Identificación

En la práctica, es improbable que construya correctamente un modelo de clases la primera vez. La colección de clases en su modelo de diseño es una de las cosas que probablemente cambiará a lo largo de las iteraciones de desarrollo.

4.1. Patrón común de desarrollo

  1. Primera iteración: Identificar las clases más importantes de los objetos del dominio
  2. Aquellas que pertenecen de manera obvia al problema
  3. Sustantivos principales del enunciado

  4. Segunda iteración: Añadir clases que se introducen para resolver el problema

  5. Más difíciles de identificar
  6. Controladores, gestores, servicios

  7. Iteraciones posteriores: Refinar y ajustar

  8. Eliminar redundancias
  9. Mejorar relaciones
  10. Ajustar responsabilidades

5. Técnica de Identificación de Nombres

La técnica más común y efectiva para identificar clases es el análisis de sustantivos. Procede en dos etapas fundamentales:

5.1. Etapa 1: Identificar clases candidatas

5.1.1. Estrategias principales
  1. Análisis de documentos textuales
  2. Obtener descripción del problema (requisitos, casos de uso, historias de usuario)
  3. Puede ser documentación formal o informal
  4. Entrevistas con usuarios y stakeholders

  5. Extracción de sustantivos

  6. Extraer todos los sustantivos de la descripción
  7. Los sustantivos son candidatos a clases de objetos
  8. Hacer una lista completa sin descartar nada al principio

  9. Identificación de candidatos

  10. Listar todos los sustantivos encontrados
  11. Incluir tanto entidades físicas como conceptuales
5.1.2. Ejemplo práctico

Enunciado: "En un sistema de reservaciones que vende boletos para funciones en varios teatros..."

Sustantivos encontrados (clases candidatas): - Sistema de Reservaciones - Boletos - Función - Teatro - Venta - Cliente (implícito)

5.1.3. Reglas iniciales
  • Considérelos en forma singular: "Boleto" en lugar de "Boletos"
  • No incluya frases que contengan "o" como candidatas (son alternativas, no clases)
  • Durante esta etapa, no diferenciar entre clases y atributos todavía

5.2. Etapa 2: Descartar candidatas inapropiadas

Esta es la etapa más crítica. Hay que analizar cada candidata y determinar si realmente debe ser una clase.

5.2.1. Razones para descartar una clase candidata

1. Redundante

Cuando a la misma clase se le ha dado más de un nombre.

Ejemplo: - "préstamo" y "préstamo a corto plazo" - "usuario" y "cliente"

Acción: Probablemente solo difieren en valores de atributos. Elija un nombre que abarque todas las descripciones.

2. Impreciso

Cuando no se puede indicar de forma no ambigua lo que significa un nombre.

Ejemplo: - "Cuenta" (¿Cuenta bancaria? ¿Cuenta de usuario? ¿Cuenta de ahorros?) - "Registro" (demasiado genérico)

Acción: Eliminar la ambigüedad antes de considerarla clase. Renombrar a algo específico como "CuentaBancaria" o "RegistroAcceso".

3. Un evento u operación

Cuando el nombre hace referencia a algo que se hace para, por o en el sistema.

Ejemplo: - "Reserva de asiento" - "Compra de boleto" - "Validación"

Pregunta clave: ¿La instancia del evento u operación tiene estado, comportamiento e identidad?

Conceptos fundamentales: - Estado: Todos los datos (atributos) que encapsula un objeto en un momento determinado - Comportamiento: La manera como actúa y reacciona un objeto - Identidad: A los objetos se les hace referencia por un nombre

Decisión: - Si solo representa una acción momentánea → Probablemente sea un método, no una clase - Si tiene datos que persisten → Puede ser una clase (ej: "Reserva" con fecha, asiento, cliente)

4. Metalenguaje

Cuando el nombre forma parte de la manera en que se definen las cosas, no del dominio del problema.

Ejemplo: - "requisitos" - "sistema" - "modelo" - "diagrama"

Acción: Eliminar estos términos de la lista de candidatas.

5. Fuera del alcance del sistema

Cuando el nombre es relevante para describir cómo funciona el sistema pero no hace referencia a algo interno del sistema.

Ejemplo: - "Usuario del sistema" (la persona que usa el sistema) - "Administrador del sistema" (rol externo) - "Cliente externo"

Decisión: - Si el sistema gestiona información sobre estos → Sí es una clase - Si solo interactúan con el sistema → No es una clase interna

6. Un atributo

Cuando está claro que un nombre hace referencia a algo sencillo, sin un comportamiento interesante, que es un atributo de otra clase.

Ejemplo: - "Color" - "Tamaño" - "Precio" - "Nombre" - "Fecha"

Acción: Estos serán atributos de otras clases, no clases por sí mismos.

Excepción: Si el atributo tiene comportamiento complejo o múltiples propiedades propias, puede ser una clase (ej: "Dirección" con calle, ciudad, código postal, país).

5.3. Identificación de clases relevantes

A partir de las clases candidatas se deben seleccionar las clases relevantes tomando en cuenta:

  1. Relevancia al problema: Todas las clases deben tener sentido en el área de la aplicación.

  2. Eliminar redundancias: Se deben eliminar clases redundantes, si expresan la misma información.

  3. Agrupar características: Se agrupan las características que definen a un sustantivo.

  4. Considerar clases implícitas: Añadir clases que no se mencionan explícitamente pero son necesarias por conocimiento del dominio.

5.4. Buena práctica: Dos listas

Si se duda si mantener una clase, una buena práctica es mantener dos listas:

  1. Lista de candidatos firmes: Clases de las que se está seguro
  2. Tienen responsabilidades claras
  3. Aparecen frecuentemente en los requisitos
  4. Son conceptos centrales del dominio

  5. Lista de candidatos dudosos: Clases que tienen que ser definidas todavía

  6. Pueden ser útiles pero no está claro
  7. Requieren más análisis
  8. Podrían convertirse en atributos o métodos

Ventaja

Evita perder información mientras se está distinguiendo las cosas seguras de las que están por fijar.

6. Fuentes de Clases

Los objetos y su división en clases a menudo derivan de las siguientes fuentes:

6.1. Cosas tangibles o "del mundo real"

Ejemplos: Avión, auto, televisor, computador, libro, producto

Características: - Fáciles de identificar - Corresponden a objetos físicos - Suelen ser sustantivos concretos

6.2. Roles o Papeles

Ejemplos: Gerente, cliente, vendedor, profesor, estudiante, usuario

Características: - Representan personas con un rol específico - Pueden tener comportamientos asociados al rol - Importante definir qué hace ese rol en el sistema

6.3. Organizaciones

Ejemplos: Universidad, empresa, departamento, equipo

Características: - Agrupan otros objetos - Tienen estructura jerárquica - Pueden tener responsabilidades colectivas

6.4. Interacciones

Ejemplos: Transacción, matrícula, contrato, pedido, reserva

Características: - Representan relaciones entre otras clases - Suelen tener fecha/hora - Almacenan información sobre la interacción

6.5. Eventos o incidencias

Ejemplos: Vuelo, accidente, suceso, notificación

Características: - Ocurren en un momento específico - Pueden tener consecuencias en el sistema - Menos comunes que las otras categorías

Nota importante

Las categorías 1 y 2 (tangibles y roles) son fuentes mucho más comunes que las últimas.

7. Errores Comunes al Identificar Clases

7.1. Error: La clase "System"

Descripción: Crear una clase que representa el sistema en su totalidad, a menudo llamada [Cualquier_cosa]System, que implementa todo el comportamiento interesante del sistema.

Ejemplo:

┌─────────────────────┐
│  BibliotecaSystem   │
├─────────────────────┤
│ - libros            │
│ - usuarios          │
│ - prestamos         │
├─────────────────────┤
│ + prestarLibro()    │
│ + devolverLibro()   │
│ + buscarLibro()     │
│ + registrarUsuario()│
└─────────────────────┘

¿Por qué está mal? - Concentra toda la lógica en una sola clase - Viola el principio de responsabilidad única - Difícil de mantener y extender - Tiene presunciones sobre cómo será utilizado el sistema

Solución correcta: Distribuir responsabilidades entre múltiples clases: - Libro con sus atributos y métodos propios - Usuario con su información - Prestamo como clase de interacción - Biblioteca como contenedor, si es necesario

7.2. Error: Clases demasiado genéricas

Ejemplos: "Objeto", "Item", "Cosa", "Elemento"

Problema: No aportan significado al modelo

Solución: Usar nombres específicos del dominio

7.3. Error: Clases que son solo datos

Descripción: Clases sin comportamiento, solo con getters y setters

Problema: Violan el principio de encapsulamiento

Solución: Añadir lógica de negocio relevante a cada clase

7.4. Error: Incluir detalles de implementación prematuramente

Ejemplos: "ArrayList", "HashMap", "Database"

Problema: Mezclar diseño con implementación

Solución: Enfocarse en el dominio del problema, no en la tecnología

8. Cómo Identificar Relaciones entre Clases

Una vez identificadas las clases, el siguiente paso es determinar cómo se relacionan.

8.1. Preguntas clave para identificar relaciones

Para Asociación: - ¿Una clase necesita conocer o usar otra clase? - ¿Hay una conexión lógica entre ellas?

Para Agregación: - ¿Una clase "tiene" objetos de otra clase? - ¿Las partes pueden existir sin el todo?

Para Composición: - ¿Una clase es "parte integral" de otra? - ¿Las partes desaparecen si el todo desaparece?

Para Herencia: - ¿Una clase "es un tipo de" otra clase? - ¿Comparte características y comportamiento?

Para Dependencia: - ¿Una clase usa temporalmente otra? - ¿La usa solo como parámetro o variable local?

8.2. Análisis de verbos para relaciones

Al igual que los sustantivos identifican clases, los verbos en los requisitos ayudan a identificar:

  1. Métodos: Acciones que realiza una clase
  2. "El usuario envía un mensaje" → método enviar() en clase Usuario

  3. Relaciones: Conexiones entre clases

  4. "El profesor imparte cursos" → relación entre Profesor y Curso

8.3. Ejemplo práctico de identificación de relaciones

Enunciado: "Un cliente compra productos de diferentes categorías. Cada producto tiene un precio y un stock. El cliente añade productos a su carrito de compras antes de finalizar la orden."

Relaciones identificadas:

  1. Cliente - CarritoCompras: Composición (1:1)
  2. El carrito pertenece al cliente y desaparece con él

  3. CarritoCompras - Producto: Asociación (1:*)

  4. El carrito contiene múltiples productos

  5. Producto - Categoria: Asociación (1:1 o *:1)

  6. Un producto pertenece a una categoría

  7. Cliente - Orden: Asociación (1:*)

  8. Un cliente puede tener múltiples órdenes

9. Buenas Prácticas para Crear Diagramas de Clases

9.1. Principios de diseño

1. Principio de Responsabilidad Única (SRP)

Cada clase debe tener una única razón para cambiar.

Ejemplo correcto:

Clase Usuario
- Atributos de usuario
- Métodos de gestión de usuario

Clase AutenticacionService
- Validar credenciales
- Gestionar sesiones

Ejemplo incorrecto: Una clase Usuario que también maneja autenticación, persistencia en base de datos y envío de emails.

2. Principio Abierto/Cerrado (OCP)

Las clases deben estar abiertas para extensión pero cerradas para modificación.

Técnica: Usar herencia e interfaces para añadir funcionalidad sin modificar código existente.

3. Principio de Sustitución de Liskov (LSP)

Las subclases deben ser sustituibles por sus clases base.

Ejemplo: Si tienes una clase Ave, y creas Pinguino que hereda de Ave, pero no puede implementar volar(), entonces la jerarquía está mal diseñada.

4. Principio de Segregación de Interfaces (ISP)

Es mejor tener múltiples interfaces específicas que una interfaz general grande.

5. Principio de Inversión de Dependencias (DIP)

Depender de abstracciones, no de implementaciones concretas.

9.2. Cohesión y acoplamiento

Alta Cohesión

Las responsabilidades de una clase están fuertemente relacionadas.

Ejemplo de alta cohesión:

Clase Libro
- titulo
- autor
- isbn
- obtenerTitulo()
- obtenerAutor()

Ejemplo de baja cohesión ❌:

Clase Utilidades
- validarEmail()
- calcularFactorial()
- conectarBaseDatos()
- enviarEmail()

Bajo Acoplamiento

Las clases tienen pocas dependencias entre sí.

Técnicas para reducir acoplamiento: - Usar interfaces - Inyección de dependencias - Patrones de diseño (Factory, Strategy, Observer)

9.3. Nomenclatura efectiva

Nombres de clases: - Sustantivos en singular - Descriptivos y específicos - PascalCase: CarritoCompras, OrdenDeCompra

Evitar: - Nombres genéricos: Gestor, Manager, Handler (a menos que sean realmente necesarios) - Abreviaturas confusas - Nombres muy largos

Nombres de atributos: - Sustantivos descriptivos - camelCase: nombreCompleto, fechaNacimiento - Evitar prefijos innecesarios: strNombre ❌, nombre

Nombres de métodos: - Verbos que describen la acción - camelCase: calcularTotal(), enviarEmail() - Getters/Setters: getNombre(), setNombre()

9.4. Organización visual del diagrama

1. Distribución espacial

  • Herencia: Clases padre arriba, hijas abajo
  • Composición/Agregación: Contenedor a la izquierda, contenido a la derecha
  • Asociaciones: Minimizar cruces de líneas

2. Agrupación lógica

  • Agrupar clases relacionadas cerca unas de otras
  • Usar colores o regiones para separar módulos
  • Capas: Presentación, Lógica de Negocio, Datos

3. Niveles de abstracción

  • Diagrama de alto nivel: Solo nombres de clases
  • Diagrama detallado: Con atributos y métodos principales
  • Diagrama completo: Todos los detalles

Ejemplo de progresión:

Nivel 1 - Alto nivel:

┌──────────┐     ┌──────────┐
│ Cliente  │────→│ Pedido   │
└──────────┘     └──────────┘

Nivel 2 - Medio:

┌──────────────┐     ┌────────────────┐
│   Cliente    │     │    Pedido      │
├──────────────┤     ├────────────────┤
│ - nombre     │────→│ - fecha        │
│ - email      │     │ - total        │
└──────────────┘     └────────────────┘

Nivel 3 - Detallado: Con todos los métodos

9.5. División de diagramas grandes

Estrategias:

  1. Por módulos funcionales
  2. Diagrama de gestión de usuarios
  3. Diagrama de gestión de productos
  4. Diagrama de gestión de pedidos

  5. Por capas

  6. Diagrama de capa de presentación
  7. Diagrama de capa de lógica de negocio
  8. Diagrama de capa de acceso a datos

  9. Por paquetes

  10. Cada paquete tiene su propio diagrama
  11. Un diagrama general muestra las relaciones entre paquetes

9.6. Uso efectivo de colores

Convención sugerida:

  • 🔵 Azul: Clases del dominio (entidades principales)
  • 🟢 Verde: Servicios y controladores
  • 🟡 Amarillo: Utilidades y helpers
  • 🔴 Rojo: Excepciones y errores
  • 🟣 Morado: Interfaces
  • 🟠 Naranja: Clases abstractas

Beneficios: - Identificación rápida del tipo de clase - Mejor comprensión visual - Facilita la navegación en diagramas complejos

10. Proceso Completo: Ejemplo Paso a Paso

Veamos un ejemplo completo del proceso de identificación de clases para un Sistema de Gestión de Biblioteca.

10.1. Paso 1: Análisis del enunciado

Enunciado:

"La biblioteca necesita un sistema para gestionar sus libros y préstamos. Los usuarios pueden registrarse proporcionando su nombre, dirección y teléfono. Cada libro tiene un título, autor, ISBN y una o más copias físicas. Los usuarios registrados pueden solicitar el préstamo de una copia disponible por un período de 14 días. El bibliotecario puede extender el período de préstamo si no hay reservas pendientes. El sistema debe registrar la fecha de préstamo y devolución."

10.2. Paso 2: Extraer sustantivos

Sustantivos encontrados: - Biblioteca - Sistema - Libros - Préstamos - Usuarios - Nombre - Dirección - Teléfono - Título - Autor - ISBN - Copias físicas - Período - Días - Bibliotecario - Reservas - Fecha de préstamo - Fecha de devolución

10.3. Paso 3: Analizar cada candidato

Candidato ¿Clase? Razón
Biblioteca ❌ No Contenedor general, puede ser opcional
Sistema ❌ No Metalenguaje
Libros ✅ Sí Entidad principal del dominio
Préstamos ✅ Sí Interacción importante con estado
Usuarios ✅ Sí Rol principal
Nombre ❌ No Atributo de Usuario
Dirección ⚠️ Quizás Podría ser clase si es compleja
Teléfono ❌ No Atributo de Usuario
Título ❌ No Atributo de Libro
Autor ⚠️ Quizás Podría ser clase si almacenamos más info
ISBN ❌ No Atributo de Libro
Copias físicas ✅ Sí Importante distinguir libro de copia
Período ❌ No Atributo calculado
Días ❌ No Valor numérico
Bibliotecario ✅ Sí Rol con permisos especiales
Reservas ✅ Sí Funcionalidad importante
Fecha préstamo ❌ No Atributo de Préstamo
Fecha devolución ❌ No Atributo de Préstamo

10.4. Paso 4: Clases finales

Clases firmes: 1. Libro - Información del libro 2. CopiaLibro - Ejemplar físico específico 3. Usuario - Usuario registrado 4. Bibliotecario - Usuario con permisos especiales (¿herencia de Usuario?) 5. Prestamo - Registro de préstamo 6. Reserva - Registro de reserva

Clases opcionales para considerar: - Autor - Si necesitamos más información sobre autores - Direccion - Si la dirección es compleja (calle, ciudad, código postal, país)

10.5. Paso 5: Identificar relaciones

  1. Libro 1:* CopiaLibro (Composición)
  2. Un libro tiene múltiples copias

  3. Usuario 1:* Prestamo (Asociación)

  4. Un usuario puede tener múltiples préstamos

  5. CopiaLibro 1:* Prestamo (Asociación)

  6. Una copia puede estar en múltiples préstamos (en diferentes momentos)

  7. Bibliotecario es un Usuario (Herencia)

  8. Bibliotecario hereda de Usuario con permisos adicionales

  9. Usuario 1:* Reserva (Asociación)

  10. Un usuario puede hacer múltiples reservas

  11. Libro 1:* Reserva (Asociación)

  12. Un libro puede tener múltiples reservas

10.6. Paso 6: Definir atributos y métodos

Clase Usuario:

+ nombre: String
+ direccion: String
+ telefono: String
+ email: String
+ fechaRegistro: Date
+ prestarLibro(copia: CopiaLibro): Prestamo
+ reservarLibro(libro: Libro): Reserva

Clase Libro:

+ isbn: String
+ titulo: String
+ autor: String
+ editorial: String
+ anioPublicacion: Int
+ obtenerCopiasDisponibles(): List<CopiaLibro>
+ estaDisponible(): Boolean

Clase Prestamo:

+ fechaPrestamo: Date
+ fechaDevolucionPrevista: Date
+ fechaDevolucionReal: Date?
+ usuario: Usuario
+ copia: CopiaLibro
+ extenderPeriodo(dias: Int): Boolean
+ marcarDevuelto(): void
+ estaVencido(): Boolean

11. Validación del Modelo de Clases

Una vez creado el modelo, es importante validarlo:

11.1. Preguntas de validación

Para cada clase: - ¿Tiene una responsabilidad clara? - ¿Tiene sentido en el dominio del problema? - ¿Es necesaria para cumplir los requisitos? - ¿Puede existir independientemente?

Para el modelo completo: - ¿Cubre todos los requisitos funcionales? - ¿Es extensible para futuros requisitos? - ¿Hay clases redundantes? - ¿Las relaciones tienen sentido?

11.2. Técnicas de validación

1. Walkthrough de escenarios

Recorrer casos de uso con el diagrama: - "Un usuario quiere tomar prestado un libro" - ¿Qué clases se involucran? - ¿Tienen los métodos necesarios?

2. Revisión por pares

  • Presentar el diagrama a otros desarrolladores
  • Explicar las decisiones de diseño
  • Recibir feedback

3. Prototipado

  • Implementar las clases principales
  • Verificar que el diseño funciona en la práctica
  • Ajustar según necesidad

12. Checklist Final

Antes de finalizar tu diagrama de clases, verifica:

Identificación de Clases ✅ - [ ] He analizado todos los sustantivos del enunciado - [ ] He descartado candidatos inapropiados - [ ] Cada clase tiene una responsabilidad clara - [ ] No hay clases redundantes - [ ] Los nombres son descriptivos y específicos

Relaciones ✅ - [ ] He identificado todas las relaciones necesarias - [ ] La multiplicidad está correctamente especificada - [ ] He elegido el tipo de relación apropiado - [ ] No hay relaciones innecesarias

Atributos y Métodos ✅ - [ ] Cada clase tiene los atributos necesarios - [ ] Los métodos reflejan las responsabilidades - [ ] La visibilidad está correctamente definida - [ ] No hay atributos que deberían ser clases

Principios de Diseño ✅ - [ ] Alta cohesión en cada clase - [ ] Bajo acoplamiento entre clases - [ ] Responsabilidad única por clase - [ ] Buen encapsulamiento

Representación Visual ✅ - [ ] El diagrama es claro y legible - [ ] Las líneas no se cruzan excesivamente - [ ] Hay una organización lógica - [ ] Uso efectivo de colores (si aplica)

13. Conclusiones

  • La identificación de clases es un proceso iterativo y fundamental en el diseño OO
  • La técnica de análisis de sustantivos es una herramienta poderosa pero requiere criterio
  • Es importante distinguir entre clases, atributos y métodos
  • Un buen modelo busca alta cohesión y bajo acoplamiento
  • Las buenas prácticas ayudan a crear sistemas mantenibles y escalables
  • La validación del modelo es tan importante como su creación
  • No existe un modelo "perfecto", pero sí modelos buenos y malos
  • La experiencia mejora la capacidad de identificar clases correctamente

14. Ejercicios Prácticos

Para practicar la identificación de clases, intenta analizar estos enunciados:

Ejercicio 1: Sistema de Reserva de Vuelos

"Los clientes pueden buscar vuelos por origen, destino y fecha. Cada vuelo tiene un número, origen, destino, hora de salida y llegada. Los clientes pueden reservar asientos en clase turista o ejecutiva. Cada reserva debe confirmarse mediante pago con tarjeta de crédito."

Tarea: Identifica clases, relaciones, atributos y métodos.

Ejercicio 2: Sistema de Clínica Veterinaria

"La clínica atiende mascotas cuyos dueños están registrados en el sistema. Cada mascota tiene un historial médico con visitas, tratamientos y vacunas. Los veterinarios pueden prescribir medicamentos y agendar citas de seguimiento."

Tarea: Crea un diagrama de clases completo.

Ejercicio 3: Red Social Simple

"Los usuarios pueden crear perfiles, publicar mensajes, seguir a otros usuarios y dar 'me gusta' a publicaciones. Las publicaciones pueden contener texto, imágenes o ambos. Los usuarios reciben notificaciones de nuevas actividades."

Tarea: Identifica las clases y sus relaciones, prestando especial atención a las relaciones de muchos a muchos.

15. Recursos y Referencias

Libros recomendados

  • "UML Distilled" - Martin Fowler (identificación práctica de clases)
  • "Applying UML and Patterns" - Craig Larman (análisis orientado a objetos)
  • "Object-Oriented Analysis and Design" - Grady Booch
  • "Domain-Driven Design" - Eric Evans (modelado del dominio)

Sitios web útiles

Herramientas

  • Draw.io / diagrams.net: Para crear diagramas
  • PlantUML: Para diagramas como código
  • Visual Paradigm: Herramienta profesional
  • Lucidchart: Herramienta online colaborativa

16. Siguiente Paso

Una vez que domines la identificación de clases, el siguiente paso es estudiar:

  • Patrones de diseño: Soluciones probadas a problemas comunes
  • Refactorización: Cómo mejorar diseños existentes
  • Arquitectura de software: Organización de alto nivel del sistema
  • Principios SOLID: Fundamentos del buen diseño OO