Pular para o conteúdo

Boas práticas e padrões · Clean Code · 6 min de leitura

Clean Code: nomes e funções

Código é lido muito mais vezes do que escrito: nomes que revelam intenção e funções pequenas com um nível de abstração.

processarMatricula() → validarDocumentos()1processarMatricula() → calcularMensalidade()2processarMatricula() → enviarBoasVindas()3processarMatricula() — conta a históriaprocessarMatricula()conta a históriavalidarDocumentos()validarDocumentos()calcularMensalidade()calcularMensalidade()enviarBoasVindas()enviarBoasVindas()

Arraste para o lado para ver o diagrama inteiro.

A função de cima lê como um índice; cada passo numerado é uma função com nome que explica o que faz.

Nomes

  • Revele a intenção: diasDesdeUltimoAcesso, não d.
  • Evite desinformação: listaClientes que é um Map engana.
  • Classes são substantivos (Fatura), funções são verbos (emitirFatura).
  • Booleanos como perguntas: estaAtivo, temSaldo.
  • Um termo por conceito: não misture buscar, obter e pegar para a mesma coisa.

Funções

  • Pequenas, fazendo uma coisa, em um nível de abstração (não misture regra de negócio com parsing de string).
  • Poucos parâmetros; flags booleanas (salvar(true)) costumam esconder duas funções.
  • Sem efeitos colaterais escondidos: verificarSenha() não deveria iniciar a sessão.
  • Separe comando de consulta: ou muda estado, ou responde algo.

Comentários

Prefira código que se explica; comente o porquê (uma decisão, um limite legal, um bug do fornecedor), não o quê. Comentário desatualizado é pior que nenhum.

No código: antes e depois

✗ AntesTypeScript
function proc(d: any[], f: boolean) {
  let t = 0;
  for (const x of d) {
    if (x.s === 1 && (!f || x.v > 100)) t += x.v * 1.1; // ???
  }
  return t;
}
✓ DepoisTypeScript
const TAXA_SERVICO = 1.1; // contrato 2026, cláusula 4

function totalComTaxa(pedidos: Pedido[], somenteGrandes: boolean): number {
  return pedidos
    .filter(estaPago)
    .filter((p) => !somenteGrandes || ehPedidoGrande(p))
    .reduce((soma, p) => soma + p.valor * TAXA_SERVICO, 0);
}

const estaPago = (p: Pedido) => p.status === Status.Pago;
const ehPedidoGrande = (p: Pedido) => p.valor > 100;

Mesma lógica, mas cada condição tem nome e o número mágico ganhou contexto. O leitor não precisa simular o loop na cabeça.

Em resumo

Referências

Continue aprendendo

Todos os temas de boas práticas e padrões →