Localizar código não utilizado [fechado]

208

Preciso refatorar um aplicativo C # grande e encontrei muitas funções que nunca são usadas. Como posso verificar o código não utilizado, para remover todas as funções não utilizadas?

Andre
fonte
Estou surpreso que isso seja rotulado como fora do tópico, achei a pergunta e as respostas úteis 11 anos após a pergunta ter sido escrita. o link off-topic fornecido diz que "... ferramentas de software comumente usadas por programadores; e é ..." é definitivamente relevante para o SO !.
shelbypereira 16/01

Respostas:

218

Sim, o ReSharper faz isso. Clique com o botão direito na sua solução e selecione "Localizar Problemas de Código". Um dos resultados é "Símbolos não utilizados". Isso mostra classes, métodos, etc., que não são usados.

Jarrett Meyer
fonte
20
isso é ótimo. poucas pessoas sabem disso. Você também precisa ativar o Solution Wide Analysis para que tudo apareça.
precisa saber é o seguinte
16
O compartilhador é uma ótima ferramenta, mas achei que não era confiável para esta tarefa. Eu tenho um método público em que removi todas as referências. Se clicar com o botão direito do mouse no método e selecionar Mostrar usos, não há nenhum, mas os problemas de código do Resharper não o listam como não utilizados.
user890155
9
Estamos usando injeção de dependência. Como resultado, tudo parece acostumado a recarregar porque mesmo tipos não utilizados ainda estão sendo registrados com unidade.
Montgomery 'monty' Jones
11
@ user890155 Isso ocorre porque o método é público, a biblioteca pode ser consumida por outro aplicativo que não está na solução atual. Acredito que apenas sinalizará métodos internos e privados como problemas de código, se não forem utilizados.
Lukazoid
3
@elggarc Em relação à injeção de dependência, dê uma olhada no plugin Agent Mulder mencionado aqui: blogs.jetbrains.com/dotnet/2012/08/resharper-70-plug-ins Página inicial do projeto: hmemcpy.github.com/AgentMulder Agent Mulder - suporte para Estruturas de injeção de dependência, como Autofac, Castle Windsor, Unity. Como o ReSharper não conhece esses contêineres, as classes podem frequentemente ser marcadas como não utilizadas ou não instanciadas. O agente Mulder diz ao ReSharper quando essas classes estão sendo usadas e fornece navegação para o ponto de registro de cada classe.
Grzegorz Smulko
29

É uma ótima pergunta, mas esteja avisado de que você está pisando em águas perigosas aqui. Ao excluir o código, você deverá certificar-se de que está compilando e testando com frequência.

Uma ótima ferramenta vem à mente:

NDepend - esta ferramenta é simplesmente incrível. Demora um pouco para grocar, e após os primeiros 10 minutos, acho que a maioria dos desenvolvedores apenas diz "Dane-se!" e exclua o aplicativo. Depois de ter uma boa idéia do NDepend, ele fornece uma visão incrível de como seus aplicativos são acoplados. Confira: http://www.ndepend.com/ . Mais importante, esta ferramenta permitirá que você visualize métodos que não possuem chamadores diretos. Também mostrará a inversa, uma árvore de chamadas completa para qualquer método na montagem (ou mesmo entre montagens).

Qualquer que seja a ferramenta que você escolher, não é tarefa fácil. Especialmente se você estiver lidando com métodos públicos em assemblies de tipo de biblioteca, como você nunca saberá quando um aplicativo os está referenciando.

Jeff Schumacher
fonte
4
Outra palavra de cautela, se seu aplicativo for asp.net, com o NDepend, você precisará pré-compilar seu site para poder analisar os códigos por trás e o NDepend não pode cobrir / conhecer as chamadas das páginas aspx (ou seja, chamadas de método em ObjectDataSources e like)
Jaime
16

O compartilhador é bom para isso, como outros já declararam. Tenha cuidado, porém, essas ferramentas não acham o código usado pela reflexão, por exemplo, não podem saber se algum código NÃO é usado pela reflexão.

mmiika
fonte
15

Como apontou Jeff, a ferramenta NDepend pode ajudar a encontrar métodos, campos e tipos não utilizados.

Para elaborar um pouco, o NDepend propõe escrever Regra de Código sobre a Consulta LINQ (CQLinq) . São propostas cerca de 200 regras de código padrão , 3 delas dedicadas à detecção de código morto / não utilizado

Basicamente, essa regra para detectar métodos não utilizados, por exemplo, se parece com:

// <Name>Dead Methods</Name>
warnif count > 0 
from m in Application.Methods where !m.MethodsCallingMe.Any()
select m

Regra NDepend para encontrar métodos não utilizados (métodos mortos)

Mas essa regra é ingênua e retornará falsos positivos triviais. Existem muitas situações em que um método nunca é chamado, mas não é usado (ponto de entrada, construtor de classe, finalizador ...), é por isso que as três regras padrão são mais elaboradas:

O NDepend integra-se no Visual Studio 2017,2015, 2013, 2012, 2010, portanto, essas regras podem ser verificadas / navegadas / editadas diretamente no IDE . A ferramenta também pode ser integrada ao seu processo de IC e pode criar relatórios que mostrarão regras violadas e elementos de código culpados. O NDepend também possui uma extensão do VS Team Services .

Se você clicar nesses 3 links acima em direção ao código fonte dessas regras, verá que os tipos e métodos são um pouco complexos. Isso ocorre porque eles detectam não apenas tipos e métodos não utilizados, mas também tipos e métodos usados apenas por tipos e métodos mortos não utilizados (recursivos).

Esta é uma análise estática , daí o prefixo Potencialmente nos nomes das regras. Se um elemento de código for usado apenas através da reflexão, essas regras poderão considerá-lo como não utilizado, o que não é o caso.

Além de usar essas três regras, aconselho a medir a cobertura do código por meio de testes e nos esforçando para ter cobertura total. Frequentemente, você verá que o código que não pode ser coberto por testes é realmente não utilizado / inoperante código que pode ser descartado com segurança. Isso é especialmente útil em algoritmos complexos, nos quais não está claro se uma ramificação de código é acessível ou não.

Isenção de responsabilidade: trabalho para o NDepend.

Patrick da equipe NDepend
fonte
6

Eu também mencionaria que o uso do COI, também conhecido como Unity, pode tornar essas avaliações enganosas. Posso ter errado, mas várias classes muito importantes que são instanciadas via Unity parecem não ter instanciação, tanto quanto o ReSharper pode dizer. Se eu seguisse as recomendações do ReSharper, seria processado!

Allen Marshall
fonte
4

O ReSharper faz um ótimo trabalho ao encontrar código não utilizado.

No VS IDE, você pode clicar com o botão direito do mouse na definição e escolher 'Localizar todas as referências', embora isso funcione apenas no nível da solução.

Mitch Wheat
fonte
1

A verdade é que a ferramenta nunca pode fornecer uma resposta 100% certa, mas a ferramenta de cobertura pode oferecer uma boa corrida pelo dinheiro.

Se você contar com um conjunto abrangente de testes de unidade, poderá usar a ferramenta de cobertura de teste para ver exatamente quais linhas de código não foram executadas durante a execução do teste. Você ainda precisará analisar o código manualmente: elimine o que você considera código morto ou escreva teste para melhorar a cobertura do teste.

Uma dessas ferramentas é o NCover , com precursor de código aberto no Sourceforge . Outra alternativa é o PartCover .

Confira esta resposta no stackoverflow.

Dan
fonte
1

Me deparei com o AXTools CODESMART..Tente isso uma vez. Use o analisador de código na seção de revisões. Ele listará as funções locais e globais inoperantes, além de outros problemas.

ramu
fonte
0

FXCop é um analisador de código ... Faz muito mais do que encontrar código não utilizado. Eu usei o FXCop por um tempo e fiquei tão perdido em suas recomendações que o desinstalei.

Eu acho que o NDepend parece um candidato mais provável.


fonte