Pular para o conteúdo

apps/service-design/builder-pattern

165 · Padrões de Design de Serviço · ≈ 6 min de estudo

Builder

Monta um objeto complexo passo a passo, com chamadas nomeadas e em qualquer ordem, e só valida quando tudo está preenchido. As regras que cruzam campos rodam uma vez em build(), que devolve todas as violações juntas ou um objeto final imutável. Use quando o objeto tem muitos campos opcionais e regras que dependem da combinação deles.

passos
6
arquivos
3
testes
0
tecnologias
3
Lógica puraTypeScriptBunStryker
Baixar cartão

Cenário

A fintech monta propostas de crédito com valor, prazo, carência, garantia e seguro opcionais. Prazo acima de 24 meses exige garantia, a garantia precisa cobrir 120% do valor, seguro só a partir de R$ 5.000,00 e a carência vai até 6 meses e é menor que o prazo. A proposta aprovada sai com a taxa (com desconto por garantia e seguro) e a parcela calculada.

Planta

Sequência
8/8
alt[alguma regra violada][tudo valido]withTerm(48)1withCollateral(vehicle, R$ 96.000,00)2withAmount(R$ 80.000,00)3withGracePeriod(2)4withX so guarda o valor, nada e validado aindabuild()5ErrorCreditProposalInvalid com todas as violacoes6taxa com descontos, parcela Price, Object.freeze7proposta imutavel8Canal de creditoBuilderCreditProposalCreditProposal (congelada)
8

8 passos — reproduza para seguir o fluxo

Como funciona

6 passos

Monta objeto complexo passo a passo.

Esconde cada passo: lembre antes de tocar para revelar.

Vocabulário compartilhado

build()+1
  1. 01

    Cada withX() só grava o valor e devolve o builder — nenhuma validação acontece fora de build(), então a ordem das chamadas não importa

  2. 02

    build() roda todas as regras com os campos completos: valor, prazo com e sem garantia, cobertura da garantia, mínimo para seguro, carência

  3. 03

    Todas as violações saem juntas em ErrorCreditProposalInvalid.violations — o cliente corrige o formulário numa tentativa

  4. 04

    A taxa parte de 2,50% a.m., cai 0,50 p.p. com garantia e 0,20 p.p. com seguro, nunca abaixo de 1,90%

  5. 05

    A parcela segue a tabela Price, com os juros da carência capitalizados antes das parcelas

  6. 06

    O resultado é congelado (Object.freeze), inclusive garantia e seguro; o builder é descartável

Trade-offs

O que se ganha, o que se paga

4 vantagenscada ganho tem um preço4 custos

Vantagens

  • Chamadas nomeadas, legíveis com muitos opcionais

  • Regras cruzadas num lugar só, com todos os campos

  • Todas as violações de uma vez

  • Resultado imutável e reutilizável

Custos

  • Uma classe a mais por objeto construído

  • Erro só aparece no build(), não na chamada errada

  • Builder mutável não deve ser compartilhado

  • Excesso para objeto sem opcionais nem regra cruzada

apps/service-design/builder-pattern

3 arquivos

src/

  • builder_credit_proposal.tsO builder, as regras cruzadas e o cálculo da parcela
  • credit_proposal.tsO produto: proposta imutável em centavos e pontos-base
  • demo.tsdemoPropostas aceitas e uma recusada com todas as violações

Executar · só Bun

  1. bun install# dependências
  2. bun run demo# roda o cenário
  3. bun run test# testes unitários
  4. bun run test:mutation# mutação com Stryker
Requisitos
Bun

Por que se relacionam

Teste rápido

Qual destes combina com Builder Pattern?

Próximo projeto · Padrões de Design de ServiçoMediator
Esc

↑ ↓ navegarEnter abrir191 resultados