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.
Arraste para o lado para ver o diagrama inteiro.
Nomes
- Revele a intenção:
diasDesdeUltimoAcesso, nãod. - Evite desinformação:
listaClientesque é 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,obterepegarpara 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
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;
} 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
- Nomes revelam intenção; abreviações cobram juros.
- Funções pequenas, um nível de abstração cada.
- Flags booleanas costumam esconder duas funções.
- Comente o porquê, não o quê.