Ilustração de um computador em um ambiente de teste, blocos de código e um manual.
Ferramentas5 min de leitura

Como refatorar uma função com IA sem mudar seu comportamento

Refatorar uma função com IA sem mudar seu comportamento exige definir primeiro o que deve permanecer igual. A aparência do código pode melhorar enquanto uma comparação sutil altera o resultado para entradas que ninguém testou.

Neste exercício, vamos simplificar uma função que conta registros marcados explicitamente como ativos. O exemplo usa apenas estruturas nativas do Python e dados fictícios, sem conexão com sistemas externos.

Identifique o contrato antes da alteração

Escreva quais entradas são aceitas e qual saída a função deve produzir. Inclua o tratamento de campos ausentes e valores que parecem equivalentes, mas não são a mesma condição.

No nosso contrato, somente o valor booleano True conta como ativo. O número 1, a palavra "sim" e um campo ausente não devem entrar na contagem.

def contar_ativos(registros):
    total = 0
    for registro in registros:
        if registro.get("ativo") is True:
            total += 1
    return total

Essa regra é deliberadamente específica para mostrar uma diferença de comparação. Se o seu produto quiser aceitar outras representações, isso será uma mudança de comportamento a discutir separadamente.

1. Crie exemplos que protejam a regra

Monte casos normais e casos de fronteira antes de enviar o código à IA. Use resultados esperados calculados a partir do contrato, não resultados copiados de outra proposta.

Entrada fictícia Contagem esperada
Lista vazia 0
Um registro com True 1
Um registro com False 0
Um registro com 1 0
Um registro sem o campo 0

A documentação de unittest descreve recursos de teste para conferir respostas específicas a entradas. Você pode usar essa biblioteca ou começar com verificações pequenas no exercício.

Não confunda passar em poucos exemplos com uma prova completa de equivalência. Os casos iniciais tornam explícitas algumas condições importantes e ajudam a encontrar regressões comuns.

2. Peça uma refatoração limitada

Informe à IA qual é o objetivo da mudança: reduzir repetição, melhorar nomes ou facilitar a leitura. Proíba alterações de assinatura e comportamento que não foram solicitadas.

Refatore esta função preservando o contrato fornecido.
Somente o booleano True conta como ativo; 1 e “sim” não contam.
Não acrescente dependências, conversões ou novos formatos aceitos.
Explique cada alteração e compare a versão proposta com os casos esperados.
Se encontrar uma decisão ambígua, pergunte antes de mudar a regra.

A proposta deve ser pequena o suficiente para você revisar. Uma reescrita com novas classes e bibliotecas pode aumentar o trabalho sem resolver o objetivo original.

3. Procure mudanças escondidas

Um erro provável seria trocar is True por uma condição de valor verdadeiro. Em Python, valores como 1 e textos não vazios podem satisfazer essa condição, alterando nossa regra.

Uma alternativa curta que preserva o critério do exercício é contar exatamente a mesma comparação. Ainda assim, ela precisa ser revisada com os casos definidos.

def contar_ativos(registros):
    return sum(1 for registro in registros if registro.get("ativo") is True)

Compare clareza, não apenas quantidade de linhas. Uma versão mais curta não é automaticamente mais fácil de manter para sua equipe.

4. Execute os mesmos casos nas duas versões

Mantenha uma cópia da função original e compare as saídas para cada entrada. Se houver exceções previstas pelo contrato, confira também se a proposta as preserva.

Verifique efeitos além do retorno, como alteração da lista recebida ou escrita em arquivo. Uma refatoração que produz o mesmo número, mas modifica a entrada, pode continuar sendo uma regressão.

5. Registre o que foi preservado

O critério de conclusão é explicar a alteração e mostrar que os exemplos de comportamento acordados continuam passando. Guarde o contrato e os testes junto da função.

Erros comuns são aceitar conversões convenientes, remover validações sem investigar e avaliar qualidade apenas pelo tamanho do código.

Se surgir uma exceção durante a comparação, siga o guia para entender erros de Python com IA antes de ampliar a mudança.

Perguntas frequentes

O que definir antes de refatorar uma função com IA?

Defina entradas aceitas, saídas, exceções e efeitos que precisam permanecer iguais.

Uma função mais curta é automaticamente melhor?

Não. Compare clareza e preservação do comportamento, não somente quantidade de linhas.

Passar em poucos exemplos prova equivalência completa?

Não. Os exemplos protegem condições conhecidas, mas a revisão precisa considerar o contrato e os efeitos da função.