Files
2024-10-20 10:22:52 +03:00

119 lines
3.8 KiB
Markdown

---
title: Transaction Script
shortTitle: Transaction Script
category: Behavioral
language: es
tag:
- Data access
---
## 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.
```java
@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
![alt text](./etc/transaction-script.png "Transaction script model")
## 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
## Créditos
* [Transaction Script Pattern](https://dzone.com/articles/transaction-script-pattern#:~:text=Transaction%20Script%20(TS)%20is%20the,need%20big%20architecture%20behind%20them.)
* [Transaction Script](https://www.informit.com/articles/article.aspx?p=1398617)
* [Patterns of Enterprise Application Architecture](https://www.amazon.com/gp/product/0321127420/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=0321127420&linkId=18acc13ba60d66690009505577c45c04)