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?
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?
Respostas:
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.
É 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.
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
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.
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!
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.
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.
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.