Code smells e refactoring

Diagnosticar dificuldades de mudança e transformar o código preservando os seus contratos.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Refatoração e diagnóstico

Refactoring muda a estrutura preservando resultados, efeitos, erros e ordem relevante. Corrigir defeito é outra operação. Testes detetam diferenças, não provam equivalência.

  1. Fixa o contrato e corre os testes.
  2. Acrescenta casos em falta antes de mexer.
  3. Transforma em passos pequenos, compilando e testando cada um.
  4. Confere efeitos e exceções que os testes não cobrem.

Smell é sinal, não veredicto. Cinco famílias: inchado, abusos de OO, entraves à mudança, dispensável, acoplamento.

DificuldadeTransformação
Método com intenções misturadasExtract Method com nomes de intenção.
Classe muda por razões independentesExtract Class.
Regra dispersa por vários sítiosReunir num responsável comum.
Operação vive dos dados de outro objetoMove Method, se a regra pertence lá.
Valores viajam juntos; primitivos com regrasParameter Object ou tipo do domínio.
Subclasse recusa promessas da baseRever hierarquia, considerar composição.

Serializador que lê muitos atributos não se move por contagem de chamadas: formato e domínio são responsabilidades distintas. a.getB().getC().getX() expõe estrutura interna. Intermediário que esconde fronteira fica; código morto e abstração especulativa saem.

A tarifa preservada

0 a 1000 unidades; primeiras cinco a 200 cêntimos, restantes a 150:

static int calcular(int n) {
    if (n < 0 || n > 1000)
        throw new IllegalArgumentException("quantidade invalida");
    return Math.min(n, 5) * 200 + Math.max(0, n - 5) * 150;
}

Confere 0 → 0, 5 → 1000, 6 → 1150, 1000 → 150250; -1 e 1001 lançam a mesma exceção e mensagem. Cobrar 150 em todas as seis daria 900: outra regra. Passos: extrai tal como está, move para Tarifa, só depois simplifica. Transformação completa.

Condições de cada transformação

  • Extract Variable conserva número e momento de avaliações com efeitos.
  • Guard Clauses conservam a ordem que escolhe o primeiro erro.
  • Move Method começa delegando no local antigo.
  • Encapsulate Collection: vista acompanha a origem, cópia separa a coleção.
  • Replace Conditional with Polymorphism exige contrato comum útil; não elimina todas as condições.

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.