O que você pode fazer para uma base de código legado que terá o maior impacto na melhoria da qualidade?

StackOverflow https://stackoverflow.com/questions/146936

  •  02-07-2019
  •  | 
  •  

Pergunta

Como você trabalha em uma base de código legado que vai ter o maior impacto ao longo do tempo que irá melhorar a qualidade da base de código?

  • Remover código não utilizado
  • Remover código duplicado
  • Adicionar testes de unidade para melhorar a cobertura de teste onde a cobertura é baixa
  • Criar formatação consistente em arquivos
  • Atualização de software 3rd party
  • Reduzir avisos gerados por ferramentas de análise estática (i.e.Findbugs)

A base de código foi escrito por muitos desenvolvedores com diferentes níveis de experiência ao longo de muitos anos, com um monte de áreas não testados e alguns não testáveis ??sem gastar um tempo significativo em escrever testes.

Foi útil?

Solução

Este é um grande livro.

Se você não gosta que a resposta, então o melhor conselho que posso dar seria:

  • Em primeiro lugar, faz o batente novo código legado [1]

[1]: código legado = código sem testes de unidade e, por conseguinte, um desconhecido

Alterar código legado sem uma suite de testes automatizados no lugar é perigoso e irresponsável. Sem cobertura de teste boa unidade, você não pode saber o que afeta essas mudanças terão. Penas recomenda uma abordagem de "estrangulamento", onde você isolar áreas de código que você precisa mudar, escrever alguns testes básicos para verificar pressupostos básicos, fazer pequenas mudanças apoiados por testes de unidade, e trabalhar a partir daí.

NOTA: Não estou dizendo que você precisa parar tudo e passar semanas escrevendo testes para tudo. Muito pelo contrário, apenas testar em torno das áreas que você precisa para testar e trabalhar a partir daí.

Jimmy Bogard e Ray Houston fez um elenco tela interessante sobre um assunto muito semelhante a esta: http: // www .lostechies.com / blogs / jimmy_bogard / Arquivo / 2008/05/06 / pablotv-eliminando-static-dependências-screencast.aspx

Outras dicas

Eu trabalho com um legado aplicação LOC 1M escrito e modificado por cerca de 50 programadores.

* Remove unused code

Quase inútil ... simplesmente ignorá-la. Você não vai obter um grande retorno sobre o investimento (ROI) do que um.

* Remove duplicated code

Na verdade, quando eu corrigir algo que eu sempre procurar duplicado. Se eu encontrasse algum eu coloquei uma função genérica ou comentar todas as ocorrências de código para duplicação (em algum momento, o esforço para colocar uma função genérica não vale a pena). A idéia principal é que eu odeio fazer a mesma ação mais de uma vez. Outra razão é porque há sempre alguém (poderia ser eu) que se esqueça de verificar se há outra ocorrência ...

* Add unit tests to improve test coverage where coverage is low

testes de unidade automatizados é maravilhoso ... mas se você tem um grande atraso, a tarefa em si é difícil promover a menos que você tenha problema de estabilidade. Vá com a parte que você está trabalhando e esperança de que em poucos anos você tem cobertura decente.

* Create consistent formatting across files

IMO a diferença na formatação é parte do legado. Ele dará uma dica sobre quem ou quando o código foi escrito. Isto pode lhe deu alguma pista sobre como se comportar em que parte do código. Fazendo o trabalho de reformatação, não é divertido e não dá qualquer valor para o seu cliente.

* Update 3rd party software

Faça isso somente se houver recurso de novo muito bom ou a versão que você não é suportado pelo novo sistema operacional.

* Reduce warnings generated by static analysis tools

Pode valer a pena. Algum aviso pode esconder um bug potencial.

testes Add unidade para melhorar a cobertura de teste. Ter uma boa cobertura de teste permitirá que você refatorar e melhorar a funcionalidade sem medo.

Há um bom livro sobre este escrito pelo autor de CppUnit, Working efetivamente com legacy Code .

Adicionando testes ao código legado é certianly mais desafiador do que criá-los do zero. O conceito mais útil que eu já retirado do livro é a noção de "costuras", que Penas define como

"um lugar onde você pode alterar o comportamento em seu programa sem editar naquele lugar."

Às vezes o seu valor refatoração para criar costuras que farão futuro testar mais fácil (ou possível em primeiro lugar.) A google testes blogue tem vários posts interessantes sobre o assunto, principalmente gira em torno do processo de Dependency Injection .

Eu diria 'remover código duplicado' praticamente significa que você tem o código de puxar para fora e abstraí-lo para que ele possa ser usado em vários lugares - isso, em teoria, faz erros mais fáceis de resolver, porque você só tem que corrigir um pedaço de código, ao contrário de muitas peças de código, para corrigir um bug nele.

Eu posso relacionar a esta pergunta como eu tenho atualmente no meu colo um dos 'aqueles' código base da velha escola. Não é realmente legado, mas a sua certamente não seguiu a tendência dos anos.

Eu vou te dizer as coisas que eu gostaria de fixar nele como eles bug me todos os dias:

  • Documento as variáveis ??de entrada e saída
  • Refactor os nomes das variáveis ??para que eles realmente significam algo diferente e alguns prefixo notação húngara seguido por uma sigla de três letras com algum significado obscuro. CammelCase é o caminho a percorrer.
  • Eu estou morrendo de medo de mudar qualquer código como ele vai afetar centenas de clientes que usam o software e alguém vai notar ainda o efeito colateral mais obscura. Quaisquer testes de regressão repetíveis seria uma bênção já que não são zero agora.

O resto é realmente amendoim. Estes são os principais problemas com uma base de código legado, eles realmente comer toneladas de tempo.

Eu diria que em grande parte depende do que você quer fazer com o código legado ...

Se ele vai permanecer indefinidamente no modo de manutenção e está funcionando bem, não fazer nada é a sua melhor aposta. "Se não está quebrado, não conserte."

Se ele não está funcionando bem, removendo o código não utilizado e refatoração do código duplicado vai fazer a depuração muito mais fácil. No entanto, eu só iria fazer essas alterações no código errando.

Se você está pensando em versão 2.0, adicionar testes de unidade e limpar o código irá apresentar

Uma boa documentação. Como alguém que tem de manter e estender o código legado, que é o problema número um. É difícil, se não francamente perigoso para alterar o código que você não entende. Mesmo se você for o suficiente sorte de ser entregue código documentada, como você está certo de que a documentação está certo? Que abrange todo o conhecimento implícito do autor original? Que fala a todos os "truques" e casos de ponta?

Uma boa documentação é o que permite que aqueles que não o autor original de entender, corrigir e estender ainda código ruim. Vou levar cortado código ainda bem documentado que eu posso entender sobre aperfeiçoar código ainda inescrutável em qualquer dia da semana.

A única coisa mais importante que eu fiz para o código legado que eu tenho que trabalhar com é construir uma verdadeira API em torno dele. É um COBOL API 1970 estilo que eu construí um modelo de objeto .NET ao redor, de modo que todo o código inseguro é em um só lugar, toda a tradução entre tipos de dados nativos da API e tipos de dados .NET está em um lugar, o métodos primários voltar e aceito DataSets, e assim por diante.

Este foi imensamente difícil de fazer direito, e ainda há alguns defeitos nele que eu sei sobre. Não é terrivelmente eficiente tanto, com toda a triagem que se passa. Mas, por outro lado, eu posso construir um DataGridView que-idas dados para uma aplicação 15-year-old que persiste seus dados Btrieve (!) Em cerca de meia hora, e ele funciona. Quando os clientes vêm a mim com projetos, minhas estimativas estão em dias e semanas em vez de meses e anos.

Como um paralelo com o que Josh Segall disse, eu diria comentário o inferno fora dele. Eu trabalhei em vários sistemas legados muito grandes que tem despejado no meu colo, e eu achei o maior problema foi manter o controle do que eu já aprendi sobre uma determinada seção de código. Depois que eu comecei colocando notas como eu ir, incluindo notas "para fazer", eu parei de re-descobrir o que eu já descobri. Então eu poderia concentrar em como esses segmentos de código fluir e interagem.

Eu diria apenas deixá-lo sozinho em sua maior parte. Se ele não está quebrado, então não corrigi-lo. Se ele está quebrado, então vá em frente e corrigir e melhorar a parte do código que está quebrado e seu código imediatamente circundante. Você pode usar a dor do bug ou recurso muita falta para justificar o esforço ea despesa de melhorar essa parte.

Eu não recomendaria qualquer tipo de atacado de reescrita, refatorar, reformatar, ou colocar em de testes de unidade que não é guiado pela necessidade do negócio ou real do usuário final.

Se você começar a oportunidade de corrigir alguma coisa, em seguida, fazê-lo direito (a chance de fazê-lo logo na primeira vez já pode ter passado, mas desde que você está tocando essa parte de novo poderia muito bem fazê-lo hora certa ao redor) e isso inclui todos os itens que você mencionou.

Então, em resumo, não há nenhuma única ou apenas algumas coisas que você deve fazer. Você deve fazer tudo, mas em pequenas porções e de forma oportunista.

atrasado para a festa, mas a seguir pode valer a pena fazer em uma função / método é usado ou mencionado muitas vezes:

  • As variáveis ??locais, muitas vezes tendem a ser mal chamado em código legado (muitas vezes devido ao seu âmbito de expansão quando um método é modificado, e não está sendo atualizado para refletir isso). Renomeando-los em linha com o seu objectivo real pode ajudar a esclarecer o código legado.
  • Mesmo apenas colocar para fora o método ligeiramente diferente pode fazer maravilhas -. Por exemplo, colocando todas as cláusulas de um if em uma linha
  • Pode haver obsoleto / confundindo comentários de código já existe. Removê-los se eles não são necessários, ou alterá-las se você absolutamente necessário. (Claro, eu não estou defendendo a remoção de comentários úteis, apenas os que são um obstáculo.)

Estes podem não ter o impacto enorme manchete que você está procurando, mas eles são de baixo risco, especialmente se o código não pode ser unidade testada.

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