A refatoração é - e deve ser - um processo contínuo. Não basta simplesmente atender aos requisitos com uma implementação testada e funcional que ainda está um pouco incompleta.
"Faça funcionar, depois faça funcionar melhor" .
Não me lembro onde li essa citação, mas essa é a chave para aplicar bem a refatoração, e considero pouco profissional fazer o contrário.
A refatoração contínua é como limpar os derramamentos durante o cozimento e limpar a louça após a refeição. A refatoração direcionada é como encontrar uma cozinha suja, mas ter apenas tempo para lavar um ou dois copos sujos. Você prefere viver com uma cozinha continuamente suja ou prefere manter as coisas limpas à medida que avança?
Você faz com que o código funcione e refatorá-lo para garantir que você tenha a melhor implementação possível. Se você estiver fazendo algo familiar, pode ser que você implemente o melhor código pela primeira vez, no entanto, demorará um momento para verificar novamente seu trabalho para ter certeza. Se parece que você pode melhorar seu código, tente refatorar para garantir que seu código seja no mínimo o mais enxuto e limpo possível. Isso significa que você está reduzindo o montante da dívida técnica que deixa para trás e facilita a leitura e a refatoração na próxima vez que o código precisar ser tratado. Esse é o valor principal por trás do mantra do TDD "Red-Green-Refactor", exceto que, no TDD, você refatora principalmente para remover a duplicação, vale a pena revisar também outros itens que podem ser refatorados, como classes grandes, métodos longos,
Se você se deparar com uma grande reformulação, talvez seja possível adiá-la por um tempo, principalmente se estiver com muito pouco tempo na sua programação. Porém, isso é fornecido desde que a funcionalidade do seu código não seja comprometida e também que a implementação continue atendendo aos requisitos. Esse tipo de situação deve ser uma ocorrência rara, e você pode ajudar a garantir que seja ainda mais raro se estiver refatorando continuamente à medida que avança. Ainda mais importante, porém, é que você não pode se arriscar a deixar suas grandes alterações por muito tempo; caso contrário, você acabará criando uma carga de trabalho ainda maior posteriormente, que pode ser muito mais dispendiosa para consertar ou pode resultar em um custo ainda mais caro. falha no projeto.
Tenho a impressão de que muitas pessoas tendem a confundir as definições de refatoração e reengenharia . Os dois termos descrevem estratégias para gerenciar situações muito diferentes. Se você deseja reprojetar, está assumindo o compromisso de fazer uma mudança drástica que alterará o comportamento de um sistema. Isso invalidará alguns testes e também exigirá novos testes. Ao refatorar, você garante que o sistema continue se comportando exatamenteda mesma forma que antes da alteração, no entanto, você também garante que seu código tenha longevidade e que será mais fácil manter com o tempo. Você não está "aprimorando" seu código, está comprometendo-se com um padrão profissional de código limpo que reduzirá o risco de falha e garantirá que seu código continue sendo um prazer trabalhar com ele e de um padrão profissional .
Voltando à analogia das janelas quebradas, se você quebrar a janela, deve repará-la imediatamente. Se você não percebeu que uma janela está quebrada, será necessário decidir o custo para você se deixar a janela quebrada. Agora, repita as duas frases anteriores, mas substitua Bug por window. Você acaba precisando de uma estratégia diferente. Se você criou um bug ao codificar, corrige-o imediatamente ou vê se as alterações exigirão um esforço de reengenharia e toma uma decisão comercial sobre quando será melhor resolver o problema. Para não refatorar para corrigir um problema, refatorar para garantir que seja mais fácil encontrar e corrigir problemas. Não me importo com o quão incrível você acha que seu código é, sistemas complexos sempre terão problemas que precisam ser tratados com o tempo. É disso que se trata a dívida técnica e por que a refatoração precisa ser um processo contínuo à medida que você implementa seu código , e não é deixada por um tempo arbitrário no futuro.
Portanto, em suma, a resposta que, em momentos raros, é aceitável adiar grandes alterações no código para estabelecer um prazo, no entanto, não deve ser considerada uma prática normal tratar a refatoração como um exercício independente do seu trabalho diário de implementação e certamente nunca usado como desculpa por equipes não familiarizadas com a base de código como uma opção para evitar garantir que sua implementação seja tão enxuta e limpa quanto possível, de acordo com as circunstâncias.