Boas práticas e padrões · Padrões estruturais · 4 min de leitura
Facade
Oferece uma porta de entrada simples para um subsistema complicado, escondendo a ordem das chamadas.
Arraste para o lado para ver o diagrama inteiro.
Quando usar
Quando um fluxo exige várias chamadas em ordem certa a classes diferentes (e o cliente erraria a ordem). A fachada não impede o acesso direto aos subsistemas — só oferece o caminho fácil para o caso comum.
Facade x caso de uso
Em arquiteturas com camada de domínio, o caso de uso (interactor) costuma cumprir o papel de fachada: FinalizarCompra coordena repositórios e serviços. Cuidado para a fachada não virar uma "classe deus" com todas as regras.
No código
class FinalizarCompra(
private val estoque: Estoque,
private val pagamento: Pagamento,
private val fiscal: NotaFiscal,
private val envio: Envio,
) {
suspend operator fun invoke(c: Carrinho): Pedido {
val reserva = estoque.reservar(c.itens)
try {
val recibo = pagamento.cobrar(c.total)
val nota = fiscal.emitir(c, recibo)
return envio.agendar(c, nota)
} catch (e: Exception) {
estoque.liberar(reserva) // compensação em caso de falha
throw e
}
}
} A tela chama finalizarCompra(carrinho). A ordem e a compensação (liberar o estoque se o pagamento falhar) vivem em um só lugar.
Em resumo
- Uma entrada simples para um subsistema complexo.
- Esconde a ordem e os detalhes das chamadas.
- Não proíbe o acesso direto aos subsistemas.
- Casos de uso costumam ser fachadas.