Los casos de uso pertenecen principalmente al análisis funcional: describen qué necesita lograr un actor y cómo debe responder el sistema. El diseño de clases, servicios y componentes pertenece a la solución técnica: define cómo se organizará internamente el software para cumplir ese comportamiento.
Ambos niveles están relacionados, pero no son lo mismo. Un caso de uso no debe convertirse en una descripción de clases, tablas o servicios internos. Sin embargo, sí aporta información muy valiosa para tomar decisiones de diseño.
En este tema veremos cómo los casos de uso pueden orientar el diseño sin reemplazarlo.
El análisis responde qué debe hacer el sistema. El diseño responde cómo se organizará la solución para hacerlo. Los casos de uso se ubican como puente entre ambos mundos.
Por ejemplo, si el caso de uso Solicitar turno indica que el sistema debe validar disponibilidad, registrar una reserva y enviar una confirmación, el diseño deberá contemplar responsabilidades para buscar horarios, crear reservas, aplicar reglas y comunicarse con un servicio de notificaciones.
Un caso de uso aporta:
Estos elementos ayudan a identificar responsabilidades, interfaces y componentes necesarios.
El caso de uso orienta el diseño al mostrar qué responsabilidades deben existir. A partir de sus pasos, reglas, datos e integraciones pueden identificarse clases del dominio, servicios de aplicación, componentes de infraestructura e interfaces con sistemas externos.
Las clases del dominio representan conceptos importantes del negocio. Se descubren a partir del modelo de dominio y de los casos de uso.
En un sistema de turnos, podrían aparecer clases como:
Estas clases no se definen solo porque aparezcan sustantivos en un texto, sino porque representan conceptos relevantes con reglas y relaciones propias.
Un servicio de aplicación coordina pasos para cumplir un caso de uso. No debería contener todos los detalles del negocio si esos detalles pertenecen a clases del dominio, pero puede orquestar la operación.
Por ejemplo, un servicio SolicitudDeTurnoService podría coordinar la búsqueda de disponibilidad, la validación de reglas, la creación del turno y el envío de confirmación.
Un componente agrupa responsabilidades relacionadas y puede corresponder a una parte más grande del sistema. Por ejemplo:
Los paquetes de casos de uso pueden sugerir componentes, aunque no siempre coinciden exactamente.
Cuando un caso de uso menciona actores secundarios que son sistemas externos, el diseño debe considerar interfaces o adaptadores para comunicarse con ellos.
Ejemplos:
Las reglas de negocio identificadas en los casos de uso deben ubicarse en el diseño de forma coherente. Algunas reglas pueden estar en clases del dominio, otras en servicios de aplicación o políticas específicas.
Por ejemplo, la regla "un profesional no puede tener dos turnos en el mismo horario" debe implementarse en un lugar central y probado, no repetirse de manera desordenada en varias pantallas.
Los datos de entrada y salida del caso de uso ayudan a diseñar objetos de transferencia, formularios, respuestas de servicios o contratos de API.
Por ejemplo, Solicitar turno puede requerir un comando o solicitud con paciente, especialidad, profesional opcional, fecha y horario seleccionado. También puede devolver una respuesta con código de reserva, fecha, hora y estado.
Las excepciones documentadas en el caso de uso ayudan a diseñar respuestas robustas. Si el horario ya no está disponible, el diseño debe contemplar cómo detectar esa situación y cómo informar una respuesta adecuada.
Si un servicio externo no responde, el diseño debe decidir si reintenta, registra pendiente, cancela la operación o muestra un mensaje específico.
Los requisitos no funcionales asociados a casos de uso pueden influir fuertemente en la arquitectura. Por ejemplo, requisitos de rendimiento, disponibilidad, seguridad o auditoría pueden modificar decisiones técnicas.
Si Solicitar turno debe soportar muchas reservas simultáneas, el diseño debe considerar concurrencia y consistencia. Si maneja datos sensibles, debe contemplar permisos y privacidad.
Un caso de uso Solicitar turno podría orientar este diseño:
| Elemento del caso de uso | Posible decisión de diseño |
|---|---|
| Paciente selecciona horario. | Objeto de solicitud con paciente, profesional, fecha y horario. |
| El sistema valida disponibilidad. | Servicio de disponibilidad o método del agregado Agenda. |
| El sistema registra turno. | Entidad Turno y repositorio de turnos. |
| El sistema envía confirmación. | Componente de notificaciones. |
| Horario tomado por otro usuario. | Manejo de concurrencia y respuesta de conflicto. |
Aunque los casos de uso orientan el diseño, no conviene introducir decisiones técnicas antes de entender el comportamiento. Si el análisis se llena de nombres de clases, tablas o frameworks, puede perder claridad para los usuarios.
Primero se debe comprender qué debe hacer el sistema. Luego se decide cómo organizar la solución.
No todo sustantivo de un caso de uso debe convertirse en clase. Algunos términos son datos simples, estados, mensajes, filtros o detalles temporales.
El diseño requiere criterio: se crean clases cuando representan conceptos con identidad, comportamiento, reglas o relaciones importantes.
Una forma útil de pasar del caso de uso al diseño es identificar responsabilidades. Por ejemplo:
Luego el diseño decide qué clases, servicios o componentes asumen esas responsabilidades.
Al relacionar casos de uso y diseño, suelen aparecer estos errores:
Antes de pasar de casos de uso a diseño, conviene revisar:
Los casos de uso son una entrada fundamental para el diseño, porque explican qué comportamiento debe soportar el sistema. A partir de ellos se identifican responsabilidades, datos, reglas, integraciones y escenarios que la solución técnica debe cubrir.
La clave es mantener separados análisis y diseño, pero conectados. En el próximo tema estudiaremos cómo derivar casos de prueba desde casos de uso.