- Por Robert C. Martin
- ·
- Publicado 17-abr-2023 9:55:47
Bowling
Resumen Esta kata es bastante avanzada, por lo que recomendamos que intentes resolverla una vez que hayas practicado TDD con otras katas más fáciles.
Debes construir un motor de reservas para hoteles corporativos. Este motor tiene que satisfacer las necesidades de 3 tipos de actores diferentes:
Para lograr esto, el motor debe ofrecer 4 servicios principales que trabajan en estrecha colaboración entre sí.
A continuación se describen estos cuatro servicios. El <?>
indica que puedes utilizar cualquier primitive o type que desees.
Este servicio es utilizado por la manager del hotel para definir los tipos de habitaciones y el número de cada tipo de habitación en el hotel. Con un ID del hotel, este servicio también puede dar información sobre el mismo.
public class HotelService {
// Collaborators(?)
void addHotel(<?> hotelId, <?> hotelName);
void setRoom(<?> hotelId, <?> number, <?> roomType);
<?> findHotelBy(<?> hotelId);
}
Reglas
El método addHotel(...)
debe lanzar una excepción si el ID del hotel ya existe o, de lo contrario, debe crear el hotel.
El método setRoom(...)
debe lanzar una excepción si el hotel no existe. Debe inserir o actualizar una habitación según el número de la habitación.
El findHotelBy(<?> hotelId)
debe dar toda la información sobre el número de habitaciones del ID especificado.
Este servicio le permite a los administradores de la empresa añadir y eliminar empleados.
public class CompanyService {
// Collaborators(?)
void addEmployee(<?> companyId, <?> employeeId);
void deleteEmployee(<?> employeeId);
}
Reglas
Este servicio le permite a los administradores de la empresa crear políticas de reserva para la empresa y sus empleados. Las políticas de reserva determinan si la solicitud de reserva de un empleado está permitida por su empresa. Hay dos tipos de políticas de reserva:
public class BookingPolicyService {
// Collaborators(?)
void setCompanyPolicy(<?> companyId, <?> roomTypes);
void setEmployeePolicy(<?> employeeId, <?> roomTypes);
boolean isBookingAllowed(<?> employeeId, <?> roomType);
}
Reglas del negocio
Reglas técnicas
setCompanyPolicy(...)
y setEmployeePolicy(...)
deben crear una nueva política o actualizar una existente. No se permite duplicar políticas de empresa ni de empleados.isBookingAllowed(...)
debe tener en cuenta al empleado y a la empresa para la que trabaja.Este servicio le permite a los empleados reservar habitaciones en los hoteles.
public class BookingService {
// Collaborators (?)
Booking book(<?> employeeId, <?> hotelId, <?> roomType, Date checkIn, Date checkOut);
}
Reglas
<?>
puede ser sustituido por el type o primitive que prefieras.A continuación presento algunas variaciones de esta kata que puedes mezclar.
1. Servicios definidos, interfaces públicas no definidas
En esta variante sigue siendo necesario utilizar los 4 servicios definidos anteriormente, pero tienes la libertad de crear los métodos que quieras en cada uno de los servicios.
2. Diseño inicial sin definir (Avanzado)
En esta variante, los requisitos empresariales para los tres actores siguen siendo los mismos; sin embargo, tienes la libertad de diseñar a tu gusto. No es necesario aferrarse a los 4 servicios.
3. Política de reservas hoteleras
En los requisitos originales, sólo se tiene en cuenta los tipos de habitaciones. En esta variante, también podemos definir qué hoteles están permitidos por cada empresa o para cada empleado. Por ejemplo, una empresa puede permitir reservas de habitaciones estándar y junior suites para el hotel "1" y sólo permitir habitaciones estándar para el hotel "2". Lo mismo aplica para las políticas de los empleados.
4. Política de overbooking
Regla adicional: algunos hoteles pueden permitir un pequeño porcentaje de overbooking. Por ejemplo, el 5%.
5. Límites estrictos de los componentes
En esta variante, cada servicio representa la interfaz pública de un componente empresarial (área funcional o contexto delimitado). Ningún otro servicio debe poder acceder a todos los componentes internos. Los componentes internos sólo pueden interactuar a través de su interfaz pública. Por ejemplo, el servicio A puede comunicarse con el servicio B, pero no con el repositorio B.
6. Hacer un diagrama de secuencia
En esta variante, no necesitas escribir ninguna prueba o código. Sólo debes crear un diagrama de secuencia a nivel de código (colaboradores, métodos, parámetros, tipo devuelto, estructuras de datos, etc.) que represente la solución detallada. El diagrama de secuencia debe representar la interacción de los 3 actores con los servicios y los componentes internos de cada servicio, incluyendo su colaboración con otros servicios y colaboradores internos.
Resumen Esta kata es bastante avanzada, por lo que recomendamos que intentes resolverla una vez que hayas practicado TDD con otras katas más fáciles.
Introducción Esta versión del clásico juego Acorazados, o Battleships en inglés, cuenta con tres naves: Portaaviones: 4 casillas -..
¿Qué queremos construir? Queremos crear un pequeño juego. El juego consiste en que un jugador intente adivinar un número aleatorio en tres intentos. ..
Suscríbete a nuestra newsletter para que podamos hacerte llegar recomendaciones de expertos y casos prácticos inspiradores