Guia

Código Sustentável

Como programar código fácil de manter.

Em vídeo

Código Sostenible

Capítulo 1

O que é Código Sustentável?

Fundamentos para escrever código sustentável e duradouro

Definição

Código fácil de manter, com design intuitivo e complexidade mínima

  • Design intuitivo
  • Complexidade essencial mínima
  • Boa cobertura de testes

Escrever para Humanos

O código deve ser legível e compreensível para outros desenvolvedores

  • Priorizar a legibilidade
  • Usar nomes descritivos
  • Documentar decisões complexas

Degeneração do Código

Como evitar que o código se deteriore com o tempo

  • Complexidade Acidental vs. Fundamental
  • Refatoração contínua
  • Manter a arquitetura limpa

As Pessoas em Primeiro Lugar

A empatia como princípio fundamental do desenvolvimento

  • Considerar a equipe
  • Facilitar a manutenção
  • Reduzir a carga cognitiva
Capítulo 2

Refatoração

A prática diária de melhorar o código existente

Prática Diária

A refatoração deve fazer parte do fluxo de trabalho diário

  • Pequenas melhorias constantes
  • Não esperar por grandes refatorações
  • Integrar ao desenvolvimento normal

Melhorias de Legibilidade

Focar em tornar o código mais fácil de ler e entender

  • Renomear variáveis e funções
  • Extrair métodos complexos
  • Simplificar expressões

Code Smells

Identificar e eliminar padrões problemáticos no código

  • Métodos muito longos
  • Classes com muitas responsabilidades
  • Código duplicado
  • Comentários excessivos
Capítulo 3

Fundamentos

Princípios básicos para código sustentável

Projetar para o Presente

Evitar a super-engenharia e focar nas necessidades atuais

  • YAGNI (You Aren't Gonna Need It)
  • Soluções simples primeiro
  • Evolução incremental

Uso Concreto vs Reutilização

Priorizar soluções específicas em vez de abstrações prematuras

  • Resolver o problema atual
  • Abstrair quando há padrões claros
  • Evitar generalização prematura

Regras do Código Sustentável

Quatro regras fundamentais para manter código de qualidade

  • 1. Coberto por testes
  • 2. Os testes são sustentáveis
  • 3. As abstrações fazem sentido
  • 4. Intencionalidade explícita
Capítulo 4

Técnicas para Escolher Nomes

A arte de nomear elementos no código

Características de Bons Nomes

Propriedades que os nomes no código devem ter

  • Fáceis de pronunciar
  • Sem informação técnica
  • Concretos e específicos
  • Formam frases naturais (is, has)

Evitar Más Práticas

O que não fazer ao nomear elementos

  • Sem apelidos confusos
  • Evitar abreviações
  • Não usar números em sequência
  • Evitar nomes genéricos

Estratégias de Naming

Técnicas para criar nomes eficazes

  • Apoiar-se no contexto
  • Usar substantivos, verbos e adjetivos apropriados
  • Nomear valores literais
  • Renomear no dia seguinte, se necessário
Capítulo 5

Princípio da Menor Surpresa

A bússola do código sustentável

Definição do Princípio

O código deve se comportar como os desenvolvedores esperam

  • Comportamento previsível
  • Consistência na API
  • Seguir convenções estabelecidas

Aplicação Prática

Como implementar esse princípio no dia a dia

  • Métodos que fazem o que o nome indica
  • Parâmetros em ordem lógica
  • Valores de retorno esperados

Evitar Efeitos Colaterais

Minimizar comportamentos inesperados

  • Funções puras sempre que possível
  • Documentar efeitos colaterais necessários
  • Separar comandos de consultas
Capítulo 6

Coesão e Acoplamento

A estrela-guia do design de software

Alta Coesão

Elementos relacionados devem estar juntos

  • Responsabilidades relacionadas
  • Funções que trabalham juntas
  • Dados e comportamentos unidos

Baixo Acoplamento

Minimizar dependências entre módulos

  • Lei de Demeter
  • Diga, não pergunte (Tell, Don't Ask)
  • Interfaces bem definidas

Connascence

Medida da força de dependência entre elementos

  • Connascence de nome
  • Connascence de tipo
  • Connascence de significado
  • Connascence de algoritmo
Capítulo 7

Princípios SOLID

Cinco princípios fundamentais do design orientado a objetos

SRP - Responsabilidade Única

Uma classe deve ter apenas um motivo para mudar

  • Uma responsabilidade por classe
  • Facilita a manutenção
  • Reduz o acoplamento

OCP - Aberto-Fechado

Aberto para extensão, fechado para modificação

  • Extensível sem modificar código existente
  • Uso de abstrações
  • Polimorfismo e herança

LSP - Substituição de Liskov

Os objetos derivados devem ser substituíveis por suas classes base

  • Contratos bem definidos
  • Pré-condições não mais fortes
  • Pós-condições não mais fracas

ISP - Segregação de Interfaces

Muitas interfaces específicas são melhores que uma geral

  • Interfaces coesas
  • Evitar dependências desnecessárias
  • Clientes não dependem de métodos que não usam

DIP - Inversão de Dependências

Depender de abstrações, não de implementações concretas

  • Módulos de alto nível não dependem dos de baixo nível
  • Ambos dependem de abstrações
  • Facilita testes e flexibilidade
Capítulo 8

Implementação Sustentável

Técnicas práticas para escrever código sustentável

Estrutura e Formatação

Organização visual do código

  • Indentação consistente
  • Reduzir o escopo ao máximo
  • Cláusulas de guarda e simetria

Composição vs Herança

Preferir composição em vez de herança

  • Maior flexibilidade
  • Menos acoplamento
  • Mais fácil de testar

Construtores e Funções

Boas práticas para métodos e construtores

  • Construtores simples
  • Construtores nomeados
  • Separar controle de fluxo e lógica
  • Preferir funções puras

Parâmetros e CQS

Gestão de parâmetros e separação de responsabilidades

  • Sem parâmetros de configuração
  • Reduzir a aridade
  • CQS: Separar Consultas e Comandos
Capítulo 9

Gestão e Prevenção de Erros

Estratégias para código robusto e resiliente

Prevenção de Erros Humanos

Projetar sistemas que minimizem erros

  • Compreender a linguagem profundamente
  • Valores, referências, objetos
  • Comparação (equals, hashCode)
  • Cópia rasa vs profunda

Áreas de Concentração de Acidentes

Zonas do código mais propensas a erros

  • Gestão do estado
  • Assincronismo e concorrência
  • Gerenciamento de recursos
  • Validação de entrada

Código Resiliente vs Defensivo

Estratégias para lidar com situações inesperadas

  • Fail fast vs fail safe
  • Validação nas fronteiras
  • Recuperação elegante

Gestão de Ausência e Erros

Padrões para lidar com valores ausentes e erros

  • Padrão Objeto Nulo
  • Tipo Optional/Maybe
  • Tipo Either
  • Padrão Notificação
  • Tipo Try
Capítulo 10

Tipos Específicos do Domínio

Expressividade e coesão por meio de tipos

Vantagens de Tipos Específicos

Por que criar tipos próprios do domínio

  • Maior expressividade
  • Melhor coesão
  • Anti-Primitive Obsession
  • Validação em tempo de compilação

Objetos de Valor vs Entidades

Diferenças fundamentais no design

  • Objetos de Valor: imutáveis, sem identidade
  • Entidades: mutáveis, com identidade
  • Quando usar cada um

Genéricos e Tipos Algébricos

Ferramentas avançadas de tipagem

  • Genéricos para reutilização
  • Tipos Soma (Union Types)
  • Tipos Produto (Record Types)
  • Composição de tipos
Capítulo 11

Princípios Mal Interpretados

Desmistificando regras obsoletas de programação

Contexto Histórico

Por que certas regras surgiram e por que já não se aplicam

  • Limitações de hardware antigo
  • Ferramentas de desenvolvimento primitivas
  • Evolução de linguagens e paradigmas

Regras Obsoletas

Princípios que já não são relevantes ou são contraproducentes

  • Um único return por função
  • Definir variáveis no início
  • Interfaces sempre desacoplam
  • Getters e Setters para tudo

Otimização Prematura

O equilíbrio entre legibilidade e desempenho

  • O código deve ser ótimo (mito)
  • Legibilidade primeiro, otimização depois
  • Medir antes de otimizar
  • Comentar apenas o necessário
Capítulo 12

Créditos

Livro

Baseado no livro

  • Autor: Carlos Blé Jurado
  • Prefácio: Javier Ferrer

Resumo

Pontos principais

  • Autor: Daniel Boggiano

Áudio

Podcast gerado com IA

  • Autor: Daniel Boggiano
  • YouTube: