Por que remover não utilizado usando diretivas em C #?
120
Eu estou me perguntando se há algum motivo (além de organizar o código-fonte) para os desenvolvedores usarem o Usingsrecurso "Remover Não Usado " no Visual Studio 2008?
Acredito que seja um recurso do PowerCommands para Visual Studio, não do próprio Visual Studio.
Hosam Aly de
3
No VS2008, certamente é um recurso (junto com a capacidade de classificar as instruções de uso) do próprio VS.
Richard,
1
@Hosam: PowerCommands permite que você faça isso para todo o projeto / solução. Fazer isso por arquivo é um recurso do próprio VS.
configurador
3
BTW, confira Resharper se você deseja um controle mais preciso sobre este tipo de limpeza.
John Feminella,
2
Na verdade, eu realmente não gosto desse recurso - invariavelmente me pego editando um arquivo e tendo que adicionar novamente todos os namespaces do System depois que alguém os limpou (geralmente System, System.Collections.Generic e System.Linq). mais fricção do que economiza. Agora, os seus próprios namespaces de projeto em vez de namespaces de framework - faz mais sentido limpar, para esclarecer a conexão do seu programa. Gostaria que houvesse uma maneira de o VS limpar as importações apenas de determinados namespaces e deixar aqueles do sistema que você precisa com mais frequência.
user1454265
Respostas:
186
Existem alguns motivos pelos quais você deseja retirá-los.
É inútil. Eles não agregam valor.
É confuso. O que está sendo usado a partir desse namespace?
Do contrário, você gradualmente acumulará usinginstruções inúteis conforme o código muda com o tempo.
A análise estática é mais lenta.
A compilação do código é mais lenta.
Por outro lado, não há muitos motivos para deixá-los. Suponho que você se poupe do esforço de ter que excluí-los. Mas se você é preguiçoso, tem problemas maiores!
Um bom programador É preguiçoso, ele maximiza o trabalho para NÃO fazer. : D
Nicolas Dorier
34
Não concordo que um bom programador seja preguiçoso, mas concordo com o sentimento de sua declaração. Um bom programador irá apagá-los para manter seu código limpo e, assim, evitar trabalhos / problemas / questões futuras para ele e para os outros.
Allan
2
Certo, esse é um ótimo link. Acho que meu ponto é apenas que queremos "preguiçoso bom" em vez de "preguiçoso ruim"; sendo o último onde os programadores não se deram ao trabalho de escrever um bom código.
Allan
5
Também há mérito em deixar os namespaces padrão. Em grandes projetos e equipes, deixá-los em funcionamento resulta em menos conflitos de fusão potenciais e menos arquivos para revisão de código. Além disso, muitos desenvolvedores adicionam métodos de extensão confusos e difíceis de encontrar às coisas e, às vezes, localizar os namespaces necessários para esses métodos de extensão é um incômodo. Novos desenvolvedores podem estar acostumados a ter o System.Linq, incluído em seus arquivos de código, e perder muito tempo tentando descobrir por que certos métodos não estão disponíveis antes de pedir ajuda.
Mark At Ramp51
5
Você pode querer manter alguns deles para evitar que o intellisense seja burro como o inferno na codificação futura.
yazanpro
24
Eu diria exatamente o contrário - é extremamente útil remover instruções de uso desnecessárias e desnecessárias.
Imagine que você precise voltar ao seu código em 3, 6, 9 meses - ou outra pessoa terá que assumir o controle do seu código e mantê-lo.
Se você tiver uma longa lista enorme de instruções em uso que não são realmente necessárias, olhar para o código pode ser bastante confuso. Por que isso está usando lá, se nada é usado desse namespace ??
Eu acho que em termos de sustentabilidade de longo prazo em um ambiente profissional, eu sugiro fortemente manter seu código o mais limpo possível - e isso inclui despejar coisas desnecessárias dele. Menos desordem é igual a menos confusão e, portanto, maior facilidade de manutenção.
Esta parece-me uma questão muito sensata, que está a ser tratada de forma bastante irreverente pelas pessoas que respondem.
Eu diria que qualquer mudança no código-fonte precisa ser justificada. Essas alterações podem ter custos ocultos, e a pessoa que fez a pergunta gostaria de ser informada disso. Não pediram para ser chamados de "preguiçosos", como uma pessoa inimada.
Acabei de começar a usar o Resharper, e ele está começando a dar avisos e dicas de estilo no projeto pelo qual sou responsável. Entre eles está a remoção de redundantes usando diretivas, mas também qualificadores redundantes, letras maiúsculas e muito mais. Meu instinto é organizar o código e resolver todas as dicas, mas meu chefe de negócios me avisa contra mudanças injustificadas.
Usamos um processo de construção automatizado e, portanto, qualquer alteração em nosso repositório SVN geraria mudanças que não poderíamos vincular a projetos / bugs / problemas e acionaria compilações e lançamentos automatizados que não entregavam nenhuma mudança funcional às versões anteriores.
Se observarmos a remoção dos qualificadores redundantes, isso pode causar confusão aos desenvolvedores, pois as classes de nosso domínio e de dados são diferenciadas apenas pelos qualificadores.
Se eu olhar para o uso adequado de maiúsculas de anacrônimos (ou seja, ABCD -> Abcd), então tenho que levar em consideração que o Resharper não refatora nenhum dos arquivos Xml que usamos para os nomes de classe de referência.
Portanto, seguir essas dicas não é tão simples quanto parece e deve ser tratado com respeito.
Bom ponto, mas você não deve esquecer que manter um código limpo e descomplicado aumenta a capacidade de manutenção, que também é um objetivo de negócios. Você tem que pesar ambos. Idealmente, você deseja fazer esse tipo de refatoração logo após o lançamento, para que possa ter uma lousa o mais limpa possível para começar uma nova e ter bastante tempo para capturar eventuais regressões.
David Reis,
14
Além das razões já fornecidas, evita conflitos de nomenclatura desnecessários. Considere este arquivo:
using System.IO;
using System.Windows.Shapes;
namespace LicenseTester{publicstaticclassExample{privatestaticstring temporaryPath =Path.GetTempFileName();}}
Este código não é compilado porque os namespaces System.IO e System.Windows.Shapes contêm, cada um, uma classe chamada Path. Poderíamos consertá-lo usando o caminho de classe completo,
1 para intellisense. Na verdade, é lento na inicialização (vejo regularmente "Criando cache, tente novamente mais tarde"), então isso pode ser realmente significativo. Compile o tempo de que todo mundo fala ... Ainda estou para ver os números.
Luc
5
Remova eles. Menos código para olhar e questionar economiza tempo e confusão. Eu gostaria que mais pessoas MANTENHAM AS COISAS SIMPLES, LEGAIS e ORGANIZADAS. É como ter camisas e calças sujas no quarto. É feio e você deve se perguntar por que está ali.
Também ajuda a evitar dependências circulares falsas, supondo que você também seja capaz de remover algumas referências dll / projeto de seu projeto após remover os usos não utilizados.
Oh CK - você me pegou de novo. Eu menti. Remover texto desnecessário torna a compilação do código mais lenta. Pense nisso :)
Conta morta em
@ck: Eu verifiquei que a remoção de declarações não utilizadas de um projeto no trabalho melhorou o tempo de compilação em uma quantidade perceptível. Claro que sim - menos bytes para ler do disco rígido.
configurador
19
Seria bom ver algumas estatísticas reais. Se estivermos economizando apenas alguns milissegundos durante a compilação, a velocidade não é um argumento convincente. No entanto, existem outras razões para remover as declarações desnecessárias.
Greg,
3
Não se trata de mentir ou não. Qualquer pessoa sensata diria que menos desordem significa mais eficiência. A "evidência" para fazer o backup é fornecer valor à sua resposta e apoiar o argumento de que "mais rápido" não significa apenas alguns ms, mas na verdade uma experiência aprimorada para compilar seu projeto mais rapidamente.
Matheus Felipe
3
Recentemente, descobri outro motivo pelo qual excluir importações não utilizadas é muito útil e importante.
Imagine que você tem dois assemblies, onde um referencia o outro (por agora vamos chamar o primeiro Ae o referenciado B). Agora, quando você tem código em A que depende de B, está tudo bem. No entanto, em algum estágio do processo de desenvolvimento, você percebe que não precisa mais desse código, mas deixa a instrução de uso onde estava. Agora você não só tem uma using-diretiva sem sentido, mas também uma referência de assembly para a Bqual não é usada em nenhum lugar, a não ser na diretiva obsoleta. Isso primeiro aumenta a quantidade de tempo necessária para compilar A, pois também Bprecisa ser carregado.
Portanto, esse não é apenas um problema no código mais limpo e fácil de ler, mas também na manutenção de referências de assembly no código de produção, onde nem todos os assemblies referenciados existem .
Finalmente, em nosso exemplo, tivemos que enviar B e A juntos, embora B não seja usado em nenhum lugar em A, mas na usingseção-. Isso afetará enormemente o desempenho do tempo de execuçãoA ao carregar o assembly.
Pelo menos em teoria, se você recebeu um arquivo C # .cs (ou qualquer arquivo de código-fonte de programa único), você deve ser capaz de olhar o código e criar um ambiente que simula tudo o que ele precisa. Com alguma técnica de compilação / análise, você pode até criar uma ferramenta para fazer isso automaticamente. Se isso for feito por você, pelo menos em mente, você pode garantir que entendeu tudo o que o arquivo de código diz.
Agora considere, se você recebeu um arquivo .cs com 1000 usingdiretivas que apenas 10 foram realmente usadas. Sempre que você olhar para um símbolo recém-introduzido no código que faz referência ao mundo externo, você terá que percorrer essas 1000 linhas para descobrir o que é. Isso obviamente retarda o procedimento acima. Portanto, se você puder reduzi-los para 10, isso ajudará!
Em minha opinião, a usingdiretiva C # é muito fraca, uma vez que você não pode especificar um único símbolo genérico sem que a genericidade seja perdida, e você não pode usar a usingdiretiva de alias para usar métodos de extensão. Este não é o caso em outras linguagens como Java, Python e Haskell, nessas linguagens você é capaz de especificar (quase) exatamente o que deseja do mundo exterior. Mas caso então, vou sugerir o uso de usingalias sempre que possível.
Respostas:
Existem alguns motivos pelos quais você deseja retirá-los.
using
instruções inúteis conforme o código muda com o tempo.Por outro lado, não há muitos motivos para deixá-los. Suponho que você se poupe do esforço de ter que excluí-los. Mas se você é preguiçoso, tem problemas maiores!
fonte
Eu diria exatamente o contrário - é extremamente útil remover instruções de uso desnecessárias e desnecessárias.
Imagine que você precise voltar ao seu código em 3, 6, 9 meses - ou outra pessoa terá que assumir o controle do seu código e mantê-lo.
Se você tiver uma longa lista enorme de instruções em uso que não são realmente necessárias, olhar para o código pode ser bastante confuso. Por que isso está usando lá, se nada é usado desse namespace ??
Eu acho que em termos de sustentabilidade de longo prazo em um ambiente profissional, eu sugiro fortemente manter seu código o mais limpo possível - e isso inclui despejar coisas desnecessárias dele. Menos desordem é igual a menos confusão e, portanto, maior facilidade de manutenção.
Marc
fonte
Esta parece-me uma questão muito sensata, que está a ser tratada de forma bastante irreverente pelas pessoas que respondem.
Eu diria que qualquer mudança no código-fonte precisa ser justificada. Essas alterações podem ter custos ocultos, e a pessoa que fez a pergunta gostaria de ser informada disso. Não pediram para ser chamados de "preguiçosos", como uma pessoa inimada.
Acabei de começar a usar o Resharper, e ele está começando a dar avisos e dicas de estilo no projeto pelo qual sou responsável. Entre eles está a remoção de redundantes usando diretivas, mas também qualificadores redundantes, letras maiúsculas e muito mais. Meu instinto é organizar o código e resolver todas as dicas, mas meu chefe de negócios me avisa contra mudanças injustificadas.
Usamos um processo de construção automatizado e, portanto, qualquer alteração em nosso repositório SVN geraria mudanças que não poderíamos vincular a projetos / bugs / problemas e acionaria compilações e lançamentos automatizados que não entregavam nenhuma mudança funcional às versões anteriores.
Se observarmos a remoção dos qualificadores redundantes, isso pode causar confusão aos desenvolvedores, pois as classes de nosso domínio e de dados são diferenciadas apenas pelos qualificadores.
Se eu olhar para o uso adequado de maiúsculas de anacrônimos (ou seja, ABCD -> Abcd), então tenho que levar em consideração que o Resharper não refatora nenhum dos arquivos Xml que usamos para os nomes de classe de referência.
Portanto, seguir essas dicas não é tão simples quanto parece e deve ser tratado com respeito.
fonte
Além das razões já fornecidas, evita conflitos de nomenclatura desnecessários. Considere este arquivo:
Este código não é compilado porque os namespaces System.IO e System.Windows.Shapes contêm, cada um, uma classe chamada Path. Poderíamos consertá-lo usando o caminho de classe completo,
ou podemos simplesmente remover a linha
using System.Windows.Shapes;
.fonte
Menos opções no pop-up do Intellisense (especialmente se os namespaces contiverem muitos métodos de extensão).
Teoricamente, o Intellisense também deveria ser mais rápido.
fonte
Remova eles. Menos código para olhar e questionar economiza tempo e confusão. Eu gostaria que mais pessoas MANTENHAM AS COISAS SIMPLES, LEGAIS e ORGANIZADAS. É como ter camisas e calças sujas no quarto. É feio e você deve se perguntar por que está ali.
fonte
Também ajuda a evitar dependências circulares falsas, supondo que você também seja capaz de remover algumas referências dll / projeto de seu projeto após remover os usos não utilizados.
fonte
O código compila mais rápido.
fonte
Recentemente, descobri outro motivo pelo qual excluir importações não utilizadas é muito útil e importante.
Imagine que você tem dois assemblies, onde um referencia o outro (por agora vamos chamar o primeiro
A
e o referenciadoB
). Agora, quando você tem código em A que depende de B, está tudo bem. No entanto, em algum estágio do processo de desenvolvimento, você percebe que não precisa mais desse código, mas deixa a instrução de uso onde estava. Agora você não só tem umausing
-diretiva sem sentido, mas também uma referência de assembly para aB
qual não é usada em nenhum lugar, a não ser na diretiva obsoleta. Isso primeiro aumenta a quantidade de tempo necessária para compilarA
, pois tambémB
precisa ser carregado.Portanto, esse não é apenas um problema no código mais limpo e fácil de ler, mas também na manutenção de referências de assembly no código de produção, onde nem todos os assemblies referenciados existem .
Finalmente, em nosso exemplo, tivemos que enviar B e A juntos, embora B não seja usado em nenhum lugar em A, mas na
using
seção-. Isso afetará enormemente o desempenho do tempo de execuçãoA
ao carregar o assembly.fonte
Pelo menos em teoria, se você recebeu um arquivo C # .cs (ou qualquer arquivo de código-fonte de programa único), você deve ser capaz de olhar o código e criar um ambiente que simula tudo o que ele precisa. Com alguma técnica de compilação / análise, você pode até criar uma ferramenta para fazer isso automaticamente. Se isso for feito por você, pelo menos em mente, você pode garantir que entendeu tudo o que o arquivo de código diz.
Agora considere, se você recebeu um arquivo .cs com 1000
using
diretivas que apenas 10 foram realmente usadas. Sempre que você olhar para um símbolo recém-introduzido no código que faz referência ao mundo externo, você terá que percorrer essas 1000 linhas para descobrir o que é. Isso obviamente retarda o procedimento acima. Portanto, se você puder reduzi-los para 10, isso ajudará!Em minha opinião, a
using
diretiva C # é muito fraca, uma vez que você não pode especificar um único símbolo genérico sem que a genericidade seja perdida, e você não pode usar ausing
diretiva de alias para usar métodos de extensão. Este não é o caso em outras linguagens como Java, Python e Haskell, nessas linguagens você é capaz de especificar (quase) exatamente o que deseja do mundo exterior. Mas caso então, vou sugerir o uso deusing
alias sempre que possível.fonte