Pular para o conteúdo

Resumo do Clean Code Para Quem Está Com Pressa

Eu considero o Clean Code um dos maiores clássicos do mundo do desenvolvimento de software. Tem os que gostam e tem os que criticam, mas, com certeza, todo mundo conhece alguns conceitos que vieram desse livro.

O livro começa explicando o que significa Código Limpo, ressaltando que o código é lido MUITO mais vezes do que escrito. Então uma das principais preocupações de um bom programador é a qualidade do código que ele está escrevendo.

Seu código tem que ser:

  • Fácil de entender
  • Fácil de modificar
  • Fácil de estender

Pense que seu código pode durar por vários anos e até décadas! Código é um ativo de valor da empresa, não só o programa que ele gera.

O tio Bob ressalta a importância de escolher bem nomes para suas variáveis, métodos e classes. Nomes com significado economizam muito tempo e espaço, já que torna os comentários praticamente desnecessários.

Bons nomes ajudam o programador, que não vai precisar analisar várias linhas de código para entender o que cada objeto significa ou o que cada método realiza.

# ❌ Ruim
def p(l):
r = []
for x in l:
if x > 5:
r.append(x)
return r
# ✅ Bom
def filtrar_pares_maiores_que_cinco(lista):
pares_filtrados = []
for numero in lista:
if numero > 5:
pares_filtrados.append(numero)
return pares_filtrados

Funções devem ser pequenas e ter uma única função. Elas devem ter nomes claros que indicam exatamente o que elas fazem.

Regra do ouro: Se uma função está crescendo demais, ela provavelmente está errada.

Ele fala sobre o Princípio da Responsabilidade Única, o “S” do SOLID. Uma função não deve fazer várias coisas, deve fazer uma coisa bem feita.

# ❌ Ruim - faz muita coisa
def processar_usuario(usuario):
validar_email(usuario['email'])
salvar_no_banco(usuario)
enviar_email_confirmacao(usuario['email'])
registrar_log(usuario['id'])
# ✅ Bom - cada coisa em seu lugar
def salvar_novo_usuario(usuario):
validar_usuario(usuario)
salvar_no_banco(usuario)
notificar_novo_usuario(usuario)

Comentários devem ser evitados ao máximo, e quando utilizados, devem explicar o “porquê” de algo, e não o “como” o código funciona.

Prefira sempre código claro e autoexplicativo. E quando usar comentários, mantenha-os atualizados — comentário desatualizado é pior que nenhum comentário.

# ❌ Ruim - comentário óbvio
total = 0 # inicializa total em zero
for item in items:
total += item.preco # adiciona preço ao total
# ✅ Bom - código claro
preco_total = sum(item.preco for item in items)
# ✅ Bom - comentário útil
# Aplicar desconto progressivo para pedidos acima de 1000
# baseado em regra de negócio definida em RPA-2024
if preco_total > 1000:
preco_total *= 0.95

Um código profissional de qualidade deve ser fácil de ler.

Deve seguir uma formatação constante em todo o projeto, seguindo regras definidas pela empresa ou padrões do mercado.

Um código mal formatado fica difícil de ler e pode esconder erros com mais facilidade do que um código limpo e organizado.

Fala sobre a diferença entre objetos e estruturas de dados, aprofundando nos conceitos de Orientação à Objetos.

Importante: Separação de responsabilidades.

  • Objetos são entidades que encapsulam tanto dados quanto comportamentos
  • Estruturas de dados são apenas coleções de dados

Não misture os dois conceitos!

Implementar um tratamento de erros claro e robusto é super importante para ter um software confiável.

Erros vão acontecer, e seu código deve estar preparado para lidar com eles. Crie um fluxo seguro para que o programa continue funcionando bem independente das exceções que possam ocorrer.

# ❌ Ruim - ignora erros
resultado = operacao_risky()
# ✅ Bom - trata explicitamente
try:
resultado = operacao_risky()
except ConexaoError:
logger.error("Falha na conexão, tentando novamente...")
resultado = retry_operacao()
except Exception as e:
logger.critical(f"Erro inesperado: {e}")
raise

Ressalta a importância de definir bem e com clareza as suas interfaces, ou seja, o que cada classe ou API vai expor para o restante do sistema.

O código deve sempre depender de uma abstração, para se proteger de mudanças externas.

Testes unitários são muito valiosos para manter a qualidade do código, e ele deve ser tratado como código de produção.

Uma boa cobertura de testes permite que o código seja refatorado sem riscos de quebrar.

Aprofunda na questão da responsabilidade única. Classes devem ser pequenas e ter uma única responsabilidade.

Se sua classe tem múltiplas razões para mudar, ela violou o Princípio da Responsabilidade Única.

Os sistemas devem ser divididos em partes que podem ser gerenciadas de forma independente.

A comunicação e coordenação entre essas partes deve ser simples e clara.

Ele descreve 4 regras para facilitar a criação de um bom projeto:

  1. Efetuar todos os testes
  2. Sem código duplicado (DRY)
  3. Expressar o propósito do programador
  4. Minimizar o número de classes e métodos

(Nessa ordem!)

Programação multithread exige simplicidade e clareza para facilitar a manutenção.

Mantenha o código nas áreas de concorrência o mais simples possível e evite data races.

Código não envelhece, mas precisa estar em constante refatoração e evolução para se manter atualizado.

Uma seção prática onde o autor aplica os princípios do Clean Code para refatorar um sistema legado, demonstrando as técnicas discutidas.

Código limpo é uma filosofia que transforma a maneira como escrevemos e mantemos software.

A adoção desses princípios resulta em software mais:

  • Sustentável
  • Confiável
  • Fácil de evoluir

Clean Code fala da importância de escrever um código que tenha valor além do programa que ele gera. É um ativo da empresa.

Recomendo demais a leitura do livro completo — ele traz muito mais valor e conteúdo do que consegui resumir aqui.

E você, tem uma opinião formada sobre Clean Code?