Pergunta

Digamos que você tenha um programa que atualmente funciona da forma como é suposto. A aplicação tem muito pobre código por trás disso, comer uma grande quantidade de memória, é unscalable e levaria grande reescrita para implementar quaisquer alterações na funcionalidade.

Em que ponto refatoração tornar-se menos lógico, então um total reconstruir?

Foi útil?

Solução

Joel escreveu um belo ensaio sobre esse mesmo tema:

coisas que você deve nunca faço, Parte 1

A principal lição que eu tenho com isso é que, embora o código antigo é horrível, fere seus olhos e seu senso estético, há uma boa chance bonita que um monte de que o código é remendar erros não documentados e problemas. Ie., Tem um monte de conhecimento de domínio embutido nele e ele vai ser difícil ou impossível para você reproduzi-la. Você vai ser constantemente batendo contra bugs-de-omissão.

Um livro eu achei extremamente útil é trabalhar efetivamente com Legacy Code por Michael C. das penas. Ele oferece estratégias e métodos para se aproximar de código legado, mesmo realmente feio.

Outras dicas

Um dos benefícios da refatoração mais de reconstrução é que se você pode fazer refatoração passo a passo, ou seja, em incrementos, você pode testar os incrementos no contexto de todo o sistema, tornando o desenvolvimento e depuração mais rápida.

Antigo e do código implementado, mesmo quando feio e lento, tem a vantagem de ter sido testado exaustivamente, e este benefício é perdido se você começar do zero.

Uma abordagem refatoração incrementais também ajuda a garantir que existe sempre um produto disponível, que pode ser enviado (e está melhorando constantemente).

Há um artigo agradável na web sobre como Netscape 6 foi escrito a partir do zero e foi business-wise uma idéia ruim .

Bem, a resposta mais simples é se ele vai demorar mais tempo para refatorar do que ele para reconstruir, então você deve apenas reconstruir.

Se é um projeto pessoal, então você pode querer reconstruí-lo de qualquer maneira, como você provavelmente vai aprender mais com a construção a partir do zero do que você faria de refatoração, e isso é um grande objetivo dos projetos pessoais.

No entanto, em um ambiente de tempo limitado profissional, você deve sempre ir com o que custa a empresa a menor quantidade de dinheiro (para a mesma recompensa) no longo prazo, o que significa escolher o que leva menos tempo.

Claro, ele pode ser um pouco mais complicado do que isso. Se outras pessoas podem estar trabalhando em funções enquanto a refatoração está sendo feito, então isso pode ser uma escolha melhor sobre ter todos espera para uma versão completamente nova a ser construída. Nesse caso reconstrução pode demorar menos tempo do que apenas a refatoração teria tomado, mas você precisa tomar todo o projeto e todos os contribuintes do projeto em conta.

Quando você gasta mais tempo refatoração do que realmente escrevendo código.

No ponto onde o software não faz o que é suposto fazer. Refatoração (mudando o código sem alterar a funcionalidade) faz sentido se e somente se a funcionalidade é "como pretendido".

Se você pode pagar o tempo para reconstruir completamente o aplicativo, não precisam para melhorar a funcionalidade de forma incremental, e não desejam reter qualquer do código existente, em seguida, reescrever é certamente uma alternativa viável. Você pode, por outro lado, o uso de refatoração para fazer uma reescrita incremental lentamente substituindo as funções existentes com funções equivalentes que são melhor escrito e mais eficientes.

Se o aplicativo é muito pequeno, então você pode reescrever a partir do zero. Se a aplicação é grande, não fazê-lo. Reescrevê-lo progressivamente, um passo de cada vez validar você não quebrar nada.

A aplicação é a especificação. Se a sua reescrita a partir do zero você provavelmente irá correr em um monte de erros insidiosos porque "ninguém sabia que a chamada para esta função deveria retornar 3, nesse caso muito específico" (comportamento em situação irregular ...).

É sempre mais divertido para reescrever a partir do zero para que o seu cérebro pode te enganar e pensar que é a escolha certa. Tenha cuidado, é mais provável que não.

Eu tenho trabalhado com essas aplicações no passado. A melhor abordagem que eu encontrei é gradual: Quando você está trabalhando sobre o código, encontrar coisas que são feitas várias vezes, agrupá-los em funções. Manter um notebook (você sabe, um real, com papel e um lápis ou caneta) para que você possa marcar o seu progresso. Use que, em combinação com o seu VCS, não em vez dele. O notebook pode ser usado para fornecer uma visão geral das novas funções que você criou como parte da refatoração, eo VCS de preenchimentos curso os espaços em branco para os detalhes.

Com o tempo, você vai ter consolidado um monte de código em lugares mais apropriados. duplicação de código durante este período de tempo vai ser quase impossível, por isso, apenas fazê-lo da melhor forma que puder até que tenha atingido um ponto onde você pode realmente iniciar o processo de refatoração, auditar a toda base de código e trabalhar nele como um todo.

Se você tem tempo suficiente para esse processo (que vai demorar um tempo muito longo), em seguida, reescrever a partir do zero usando uma abordagem de teste anterior é provavelmente melhor.

Tio Bob pesa com o seguinte:

Quando é um redesenho da estratégia certa?

Estou feliz que você fez essa pergunta. Aqui está a resposta. Nunca.

Olha, você fez a bagunça, agora limpá-lo.

Uma opção seria a de testes de unidade de gravação para cobrir a aplicação existente e, em seguida, começar a refatorar-lo pouco a pouco, usando os testes de unidade para garantir que tudo funciona como antes.

Em um mundo ideal você já teria testes de unidade para o programa, mas dado os seus comentários sobre a qualidade do aplicativo que eu estou supondo que você não ...

No documento, nenhum escritor original, nenhum caso de teste, e um monte de erros restantes.

Eu não tive muita sorte com pequenas mudanças incrementais quando o código que eu herdar é muito ruim. Em teoria, o pequeno incremento sons abordagem boa, mas na prática tudo o que acaba com um melhor, mas ainda mal projetado aplicativo que todo mundo acha que é agora o seu design. Quando as coisas quebram, as pessoas já não acho que é por causa do código anterior, torna-se agora SUA falha. Então, eu não usaria a palavra redesign, refatorar ou qualquer outra coisa que implica a um gerente tipo que você está mudando as coisas a sua maneira, a menos que eu estava indo realmente fazer do meu jeito. Caso contrário, dezenas mesmo que você pode ter fixos de problemas, todos os problemas que ainda existiam (mas não foram descobertos) vão agora ser atribuído à sua retrabalho. E ter a certeza de que, se o código é ruim, então suas correções vai descobrir muito mais erros que foram simplesmente ignorados antes porque o código foi tão ruim para começar.

Se você realmente sabe como desenvolver sistemas de software, em seguida, eu faria uma reformulação de todo o sistema. Se você realmente não sabe como criar um bom software então eu diria que ficar com as pequenas mudanças incrementais como você pode de outra maneira acabar com uma base de código que é tão ruim quanto o original.

Um erro que é muitas vezes feita quando redesenho é que as pessoas ignoram a base de código original. No entanto, redesenho não tem de significar ignorar totalmente o código antigo. O código antigo ainda tinha que fazer o que o novo código tem a ver, por isso, em muitos casos, os passos que você precisa já está no código antigo. Copiar e colar, em seguida, obras Tweak maravilhas quando redesenhar sistemas. Eu descobri que em muitos casos, redesenhar e reescrevendo um aplicativo e roubar trechos do código original é muito mais rápido e muito mais confiável do que pequenas mudanças incrementais.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top