Script de transação: Patrón simples para lógica de Negocio (Catálogo de Padrões de EAA – Martin Fowler)

Cuando se Dearrollan Aplicaciones Empresariales, Uno de Los Mayores Reto es Cómo Organizador LA LÓGICA DE NEGOCIO. Existir Muchas Formas de Hacerlo, Y Martin Fowler, EN SU FAMoso Libro Padrões de Aplicativo Enterprise Architecture (2003), ProPuso Un Catálo de Patrones para Enfrentar Este Tipo de Problemas. Ente Artículo Exploraremos El Patrón Script de transação, Uno de Los Más Simples y Directos del Catálo, Acompañado de Un ejemplo Práctico en Python. Script de transação de qué es? El Patrón Script de transação Organiza la légica de Negocio en Procedimientos Indivíduos, Donde Cada Procedimiente Maneja Una Única Transacción O Petición del Sistema. EN OTRAS PALABRAS: Si Un Cliente Quiere Crear Una Reserva → Existe Script Un On para eso. Si Un Cliente Quiere Cancellar Una Reserva → Existe Dedicado de Script Oro. Script CADA Contiene: Valaciones de Entrada. Reglas de Negocio. Operacionas de lectura/escritura em base de dados. La Confirmación de la Transacción. ¿Cuándo Usarlo? Scripts de transação são ideais Cuando: La Aplicación es Relativatete Pequeña. Las Reglas de Negocio Sonples y fácciles de descrevendo paso a paso. SE BUSCA Rapidez em El DeSarrollo. Nenhuma justifica Todavía Invertir en Arquitectutuas Complejas como modelo de domínio. Ejemplos de Uso Típico: Prototipos Rápidos. Aplicaciones Crud Sencillas. Servicios que Procesan Peticiones Claras y lineales. “Cuándo Evitarlo? NO ES SI RECOMENDÁVEL SI: EL DOMINIO ES COMPLEJO Y LA LÓGICA EMPIEZA A REPETIRSE EN VARIOS SCRIPTS. Hay Muchas Reglas Compartidas Operationas Entre. Se necesita reutilización de lógica o comportamiento rico en objetos. En Estos casos, es mejor migrar a patones como modelo de domínio o camada de serviço. EJEMPLO PRÁCTICO: Sistema simples de reservas supengamos que estamos CreaRdo una pequeña api que liMite: Crear Una Reserva. LISTAR RESERVAS ativas. Cancelar UNA Reserva. USAREMOS Python + Flask + Sqlite para Mostar El Patrón en Acción. 1. CREAR LA BASE DE DATOS ARQUIVO DB_INIT.PY: importar sqlite3 def init_db (path = ‘reservas.db’): conn = sqlite3.connect (caminho) c = conn.cursor () c.execute (” ‘crie tabela se não existe em que não existe (ida integro -text) c.Execute (‘ ” ”, se não existe uma tabela de reserves ‘. Texto nulo, end_time não nulo, texto de status NÃO padrão ‘ativo’, criou -se texto não nulo (DATETIME (‘agora’))); Transação Scripts Archivo Transactions.py: importar sqlite3 do contextlib Importar contextManager db_path = ‘reservas.db’ @ContextManager def get_conn (): conn = sqlite.connect (db_path) try: rende Conn.Commit () exceto: Conn.rollback () Raise Finalmente: finalmente: como conn: c = conn.cursor () c.execute (“Selecione id, client_name, recurso, start_time, end_time, status, criado_at de reservas onde status = ‘ativo'”) return c.FetchAll () def (start_Reservive_tx_tx (clustery_name, recurso, start_time, end (end_time): start_time> com get_conn () como conn: c = conn.cursor () c.execute (” ‘selecione contagem <= ? OR start_time >De reservas onde recurso =? E status = ‘ativo’ e não (end_time[0] =?) ” ‘, (Recurso, start_time, end_time)) (sobreposição_count,) = c.FetchOne () se overlap_count> 0: Raise ValueError (“YA existe una reservas que solapa _), solapa? ” ‘, (Customer_Name, Resource, start_time, end_time)) retornar C.Lastrowid def Cancel_Reserving_TX (Reserva_ID): com get_conn () como conn: c = Conn.Cursor () C.Execute (‘ Selecione Status de Reservations Where Id = (Reservation_Id)) Row = C. Encontrada “) se linha[‘POST’]! = ‘Ativo’: Raise ValueError (“La Reserva Ya No Está Activa”) C.Execute (‘Atualizar reservas Definir status =? Onde ID =?’, (‘Cancelado’, Reserva_id)) Retorno True, digite o modo de tela cheia, exite o modo de tela completa 3. Cancel_Reservive_TX, SELECT_ACTIVO_RESERVAÇÕES DO DB_INIT IMPREST INIT_DB APP = FLASK (__ Name__) init_db () @app.Route (‘/Reservations’, Methods =[‘customer_name’]) def create_Reserving (): Payload = request.get_json () Try: res_id = create_reserving_tx (Customer_name = Paylow[‘resource’]recurso = carga útil[‘start_time’]start_time = carga útil[‘end_time’]
end_time = carga útil[‘GET’]) retornar jsonify ({“id”: res_id}), 201, exceto exceção como e: return jsonify ({“error”: str (e)}), 400 @app.Route (‘/reservas’, métodos = [
{
“id”: r[0]) DEF LIST_RESERVATIONS (): linhas = SELECT_ACTIVO_RESERVATIONS () Reservações =[1]”Customer_name”: r[2]”Recurso”: r[3]”start_time”: r[4]”end_time”: r[5]”Status”: r[6]
“Created_at”: r[‘POST’]} para r em linhas]Return jsonify (reservas), 200 @app.Route (‘/reservas // cancel’, métodos =) def cancel_reserving (res_id): tente: cancel_reserverving_tx (res_id) retorna jsonify ({“status”: “cancelado”}), 200, exceto exceção e: return jsonify (fullscrel (error “: str (e)}), 400 se __name __name == ‘__mAin’: Prueba rápida con curl crear una reserva: curl -x post \ -h “content -type: Application/json” \ -d ‘{“Customer_name”: “Ana Perez “,” Recurso “:” Sala-a “,” start_time “:” 2025-09-20T10: 00 “,” end_time “:” 2025-09-20T11: 00 “} ‘Modo de tela completa Modo FullScreen Modo Ventajas Simples y Dirto. Fáccil de Leer por Cualquier Desarrollador. Prototipos ideais o proyectos pequeños. Desventajas Tiende A Duplicar Lógica Si Crece Demasiado. Sem Escala Bien en Dominios compleimentos. PoCo Reutilizable A Medida Que Aumentan Las Reglas. Conclusão Patrón Script de transação ES Una Excelente Puerta de Entrada al Diseño de Aplicaciones Empresariales. Si tu sistema es pequeño, Este patrón deprece Claridad y Rapidez. Sin Embargo, Si tu Aplicación Crece en Grandejidad, Tarde o Temprano necesitarás evolucionário a otros patrones como modelo de domínio ou camada de serviço.

Fonte

Você pode ter perdido