Transaction Script
Propósito
Transaction Script organiza la lógica de negocio por procedimientos donde cada procedimiento maneja una única
solicitud de la presentación.
Explicación
Ejemplo del mundo real
Necesitas crear un sistema de reservas de habitaciones de hotel. Dado que los requisitos son bastante simples
utilizar el patrón Transaction Script.
En palabras sencillas
Transaction Script organiza la lógica de negocio en transacciones que el sistema necesita llevar a cabo.
Ejemplo programático
La clase Hotel
se encarga de reservar y cancelar las reservas de habitaciones.
@Slf4j
public class Hotel {
private final HotelDaoImpl hotelDao;
public Hotel(HotelDaoImpl hotelDao) {
this.hotelDao = hotelDao;
}
public void bookRoom(int roomNumber) throws Exception {
Optional<Room> room = hotelDao.getById(roomNumber);
if (room.isEmpty()) {
throw new Exception("Room number: " + roomNumber + " does not exist");
} else {
if (room.get().isBooked()) {
throw new Exception("Room already booked!");
} else {
Room updateRoomBooking = room.get();
updateRoomBooking.setBooked(true);
hotelDao.update(updateRoomBooking);
}
}
}
public void cancelRoomBooking(int roomNumber) throws Exception {
Optional<Room> room = hotelDao.getById(roomNumber);
if (room.isEmpty()) {
throw new Exception("Room number: " + roomNumber + " does not exist");
} else {
if (room.get().isBooked()) {
Room updateRoomBooking = room.get();
updateRoomBooking.setBooked(false);
int refundAmount = updateRoomBooking.getPrice();
hotelDao.update(updateRoomBooking);
LOGGER.info("Booking cancelled for room number: " + roomNumber);
LOGGER.info(refundAmount + " is refunded");
} else {
throw new Exception("No booking for the room exists");
}
}
}
}
La clase Hotel
tiene dos métodos, uno para reservar y otro para cancelar una habitación respectivamente. Cada uno de ellos
transacción en el sistema, haciendo que Hotel
implemente el patrón Transaction Script
Transaction Script.
El método bookRoom
consolida todos los pasos necesarios como comprobar si la habitación ya está reservada
o no, si no está reservada entonces reserva la habitación y actualiza la base de datos utilizando el DAO.
El método cancelRoom
consolida pasos como comprobar si la habitación está reservada o no,
si está reservada, calcula el importe del reembolso y actualiza la base de datos utilizando el DAO.
Diagrama de clases
Aplicabilidad
Utilice el patrón Transaction Script cuando la aplicación tenga sólo una pequeña cantidad de lógica y esa
lógica no será extendida en el futuro.
Consecuencias
- A medida que la lógica de negocio se complica,
se hace progresivamente más difícil mantener el script de transacción
en un estado bien diseñado. - Puede ocurrir duplicación de código entre scripts de transacciones.
- Normalmente no es fácil refactorizar el script de transacciones a otros patrones de lógica de dominio.
del dominio.
Patrones relacionados
- Domain Model
- Table Module
- Service Layer