O problema de fazer uma grande refatoração é que você pode e, às vezes, segue um caminho que o leva a perceber que você mordeu mais do que pode mastigar. Refatorações gigantes são um erro. Se o design do sistema é defeituoso em primeiro lugar, a refatoração pode levar você tão longe antes que você precise tomar uma decisão difícil. Deixe o sistema como está e resolva-o ou planeje redesenhar e fazer algumas mudanças importantes.
Existe, no entanto, outro caminho. O benefício real do código de refatoração é tornar as coisas mais simples, fáceis de ler e ainda mais fáceis de manter. Onde você aborda um problema sobre o qual você tem incerteza, gera uma mudança, vai tão longe para ver aonde ele pode levar a fim de aprender mais sobre o problema, depois joga fora o aumento e aplica uma nova refatoração com base no que o aumento ensinei você. O fato é que você realmente pode melhorar seu código apenas com certeza se as etapas forem pequenas e seus esforços de refatoração não ultrapassarem sua capacidade de escrever seus testes primeiro. A tentação é escrever um teste, depois codificar e depois codificar um pouco mais, porque uma solução pode parecer óbvia, mas logo você percebe que sua alteração mudará muitos outros testes; portanto, você deve tomar cuidado para mudar apenas uma coisa de cada vez.
A resposta, portanto, é nunca tornar sua refatoração maior. Passos de bebê. Comece extraindo métodos e tente remover a duplicação. Em seguida, passe para a extração de classes. Cada um em pequenos passos, uma pequena alteração de cada vez. Se você estiver extraindo código, escreva um teste primeiro. Se você estiver removendo o código, remova-o e execute seus testes, e decida se algum dos testes quebrados será mais necessário. Um pequeno passo de bebê de cada vez. Parece que levará mais tempo, mas reduzirá consideravelmente o tempo de refatoração.
A realidade é, no entanto, que cada pico é aparentemente um potencial desperdício de esforço. As alterações de código às vezes não levam a lugar algum, e você se restaura restaurando seu código de seus vcs. Esta é apenas uma realidade do que fazemos no dia a dia. Todo pico que falha não é desperdiçado, no entanto, se ele lhe ensina algo. Todo esforço de refatoração que falhar lhe ensinará que você está tentando fazer muito rapidamente ou que sua abordagem pode estar errada. Isso também não é perda de tempo, se você aprender algo com isso. Quanto mais você faz essas coisas, mais aprende e mais eficiente se tornará. Meu conselho é usá-lo por enquanto, aprender a fazer mais fazendo menos e aceitar que é assim que as coisas provavelmente precisam ser até que você melhore a identificação de quão longe deve dar um pico antes que ele não o leve a lugar nenhum.