Pular para o conteúdo

apps/patterns/command-pattern

006 · Padrões Fundamentais · ≈ 5 min de estudo

Command Pattern

Encapsula cada operação num objeto que sabe se executar (execute) e se desfazer (undo). Quem emite não precisa saber como a operação funciona para enfileirar, desfazer, refazer ou reverter um lote inteiro. Use quando uma operação financeira precisa de desfazer e de histórico auditável.

passos
6
arquivos
9
testes
2
tecnologias
4
Infraestrutura realTypeScriptBunPostgreSQLDocker
Baixar cartão

Cenário

Um core bancário executa duas transferências, desfaz a última e a refaz. Depois roda um lote de três transferências em que a última estoura o saldo: as duas primeiras são desfeitas e os saldos voltam exatamente ao valor anterior ao lote. Cada execução e cada undo ficam na tabela transfer_command_log.

Planta

Sequência
12/12
cria com o valor capturado (valida antes de enfileirar)1execute(comando)2execute()3BEGIN, FOR UPDATE nas duas contas, débito, crédito, log executed, COMMIT4empilha no histórico5undo()6undo() do último (LIFO)7BEGIN, movimento inverso, log undone, COMMIT8batchRun(lote)9execute() de cada comando10falha no último (saldo insuficiente)11undo() dos já executados, do último ao primeiro12demo.tsInvokerTransferComando de transferênciaPostgreSQL
12

12 passos — reproduza para seguir o fluxo

  1. 01

    ComandocommandTransferCreate valida o valor e captura contas e montante na criação; o undo nunca relê estado

  2. 02

    Execute atômicoBEGIN, FOR UPDATE nas duas contas em ordem de id (sem deadlock), débito condicionado ao saldo, crédito, log, COMMIT

  3. 03

    UndoO movimento inverso do mesmo valor, na mesma transação que marca o log como undone

  4. 04

    InvokerInvokerTransfer guarda o histórico (LIFO) e a pilha de redo; um comando novo descarta o redo

  5. 05

    Lote tudo ou nadabatchRun desfaz em ordem inversa os comandos já executados quando um falha

  6. 06

    Auditoriatransfer_command_log sobrevive ao processo

apps/patterns/command-pattern

9 arquivos

sql/

  • 01_schema.sqlschemaTabelas accounts e transfer_command_log

src/

  • command_transfer.tsContrato Command e o comando de transferência sobre PostgreSQL
  • invoker_transfer.tsHistórico, undo, redo e lote com rollback LIFO
  • pool_bank.tsTransação com rollback e release garantidos; centavos para NUMERIC
  • config_transfer.tsLê e valida o ambiente no boot
  • command_transfer.test.tstesteIntegração contra PostgreSQL real: undo exato, fronteira do saldo, concorrência
  • invoker_transfer.test.tstesteUndo, redo e rollback do lote com comandos de registro
  • demo.tsdemoExecute, undo, redo e lote revertido

./

  • docker.shinfraSobe o PostgreSQL com o schema

Executar · com Docker

  1. ./docker.sh up# sobe PostgreSQL
  2. cp .env.example .env# variáveis de ambiente
  3. bun install# dependências
  4. bun run demo# roda o cenário

Testes: bun run test.

Requisitos
BunDocker
Sobe junto
PostgreSQL

Por que se relacionam

Teste rápido

Qual destes combina com Command Pattern?

Próximo projeto · Padrões FundamentaisCorrelation Tracing
Esc

↑ ↓ navegarEnter abrir191 resultados