Ir al contenido
angel.library

Facade

Algunas operaciones no son un solo paso: son varios servicios que siempre se ejecutan juntos, en un orden concreto. Si cada caller repite esa coreografía, un cambio en el orden o un paso olvidado se convierte en un bug esparcido por todo el código. Facade la encierra en una sola función.

services/checkout.ts
import { validarStock } from "./inventory"
import { enviarConfirmacion } from "./notifications"
import { crearOrden } from "./orders"
import { cobrar } from "./payments"
interface CheckoutResult {
orderId: string
}
export async function checkout(
cart: Cart,
usuario: Usuario
): Promise<CheckoutResult> {
await validarStock(cart.items)
const cobro = await cobrar(usuario.metodoPago, cart.total)
const orden = await crearOrden(usuario.id, cart.items, cobro.id)
await enviarConfirmacion(usuario.email, orden)
return { orderId: orden.id }
}

Quien llama a checkout(cart, usuario) no necesita saber que por dentro hay cuatro servicios coordinándose. Si mañana se agrega un paso (reservar puntos de fidelidad, por ejemplo), se agrega adentro de checkout() y ningún caller cambia.

Esto es, en la práctica, lo que hace la capa de services/ en una estructura MVC de Express: el service es la facade que el controller llama sin conocer los detalles.

Si la “simplificación” es una función que solo delega a otra función sin coordinar nada más, no hace falta el nombre del patrón — es simplemente una función bien nombrada. Facade vale la pena cuando de verdad orquesta múltiples pasos o servicios independientes que tienen que ejecutarse en orden, no como excusa para agregar una capa extra a todo.