Refatoração de código
Gabarito: letra E. A melhor abordagem para refatorar o código é dividi-lo em funções especializadas com nomes descritivos, substituir loops complexos por compreensões de lista e adicionar um docstring — exatamente o que a alternativa E propõe. Refatoração é o processo de modificar a estrutura interna do código sem alterar seu comportamento externo, e essas técnicas melhoram a legibilidade, a coesão e a manutenibilidade, que são os objetivos centrais da prática.
A refatoração é uma técnica fundamental da engenharia de software, especialmente valorizada em metodologias ágeis como o Extreme Programming (XP). O conceito central é que você reorganiza o código para torná-lo mais claro e fácil de manter, sem adicionar ou remover funcionalidades. Martin Fowler, autor do livro clássico sobre o tema, define refatoração como "o processo de mudar um sistema de software de tal forma que não altere o comportamento externo do código, embora melhore sua estrutura interna". Isso significa que, após a refatoração, o programa deve produzir exatamente os mesmos resultados de antes, mas com um código mais limpo, mais legível e mais fácil de modificar no futuro.
Na prática, a refatoração envolve uma série de técnicas específicas, como extrair métodos (transformar blocos de código em funções separadas), renomear variáveis e funções para nomes mais descritivos, simplificar condicionais, eliminar código duplicado e substituir construções complexas por alternativas mais expressivas da linguagem. No caso de Python, uma técnica idiomática é usar compreensões de lista (list comprehensions) para substituir loops que apenas constroem listas, tornando o código mais conciso e legível. Adicionar docstrings (strings de documentação) também é uma boa prática, pois documenta o propósito e o comportamento de cada função, facilitando o entendimento por outros desenvolvedores.
Um exemplo concreto: imagine um código que calcula a média de uma lista de notas, depois filtra as notas acima da média e, por fim, imprime o resultado. Sem refatoração, tudo isso pode estar em um único bloco com loops aninhados e variáveis com nomes genéricos como x, y e z. Após a refatoração, você poderia ter funções como calcular_media(notas), filtrar_acima_da_media(notas, media) e exibir_resultado(notas_filtradas), cada uma com um docstring explicando o que faz. O comportamento externo permanece idêntico, mas o código fica muito mais fácil de ler, testar e manter.
A pegadinha que a banca explora nesta questão é a confusão entre refatoração e outras atividades de desenvolvimento. Muitos candidatos podem pensar que melhorar nomes de variáveis e adicionar comentários é suficiente, ou que adicionar tratamento de exceções é a prioridade, ou até mesmo que combinar loops para "otimizar" é uma boa ideia. No entanto, a refatoração vai além de simples renomeação e comentários — ela busca melhorar a estrutura do código como um todo. Tratamento de exceções é uma preocupação válida, mas não é o foco da refatoração, que se concentra na estrutura e legibilidade. Combinar loops pode até melhorar a eficiência, mas geralmente à custa da legibilidade, o que contraria o espírito da refatoração. E trocar de linguagem de programação não é refatoração, é reescrita do sistema.
Guarde o critério decisivo: refatoração melhora a estrutura interna sem alterar o comportamento externo, e as técnicas mais comuns são extrair funções, usar construções idiomáticas da linguagem e documentar adequadamente. É exatamente isso que a alternativa E descreve, e é por isso que ela é a resposta correta.
Alternativa A — ❌ Incorreta
Apenas melhorar nomes de variáveis e adicionar comentários é uma parte da refatoração, mas não é a abordagem completa. A refatoração busca melhorar a estrutura do código, o que inclui dividir em funções, eliminar duplicação e simplificar construções complexas. Renomear e comentar ajuda na legibilidade, mas não resolve problemas estruturais como loops complexos ou código duplicado. A alternativa é incompleta e superficial.
Alternativa B — ❌ Incorreta
Manter a estrutura atual e apenas adicionar tratamento de exceções para divisão por zero é uma correção pontual de um possível bug, não uma refatoração. A refatoração não se preocupa apenas com erros específicos, mas com a estrutura geral do código. Além disso, o tratamento de exceções é uma preocupação de robustez, que pode ser adicionada durante a refatoração, mas não é o foco principal. A alternativa não aborda a melhoria da estrutura e legibilidade do código.
Alternativa C — ❌ Incorreta
Combinar todos os loops em um único loop para melhorar a eficiência, mesmo que torne o código mais complexo, contraria o princípio fundamental da refatoração. A refatoração prioriza a clareza e a manutenibilidade, não a eficiência a qualquer custo. Um código mais complexo é mais difícil de entender, testar e manter, o que vai contra os objetivos da refatoração. Além disso, a otimização prematura é uma má prática, e a eficiência só deve ser buscada quando há evidência de que é necessária.
Alternativa D — ❌ Incorreta
Converter o código para uma linguagem mais eficiente, como C++, não é refatoração. Refatoração é uma mudança interna no mesmo código, sem alterar o comportamento externo. Trocar de linguagem de programação é uma reescrita completa do sistema, que envolve muito mais riscos e esforço, e não é o que se espera de uma refatoração. Além disso, a eficiência da linguagem não é o foco da refatoração, que busca melhorar a estrutura e legibilidade do código existente.
Alternativa E — ✅ Correta ⟵ GABARITO
Dividir o código em funções especializadas com nomes descritivos é uma técnica clássica de refatoração chamada "extrair método" (extract method). Substituir loops complexos por compreensões de lista é uma prática idiomática em Python que torna o código mais conciso e legível. Adicionar um docstring documenta o propósito e o comportamento de cada função, facilitando o entendimento e a manutenção. Todas essas ações melhoram a estrutura interna do código sem alterar seu comportamento externo, exatamente o que define a refatoração. A alternativa E é a abordagem mais completa e alinhada com as boas práticas de programação.
Gabarito: letra E