Eu estou me perguntando se há algum motivo (além de organizar o código-fonte) para os desenvolvedores usarem o Usings
recurso "Remover Não Usado " no Visual Studio 2008?
Eu estou me perguntando se há algum motivo (além de organizar o código-fonte) para os desenvolvedores usarem o Usings
recurso "Remover Não Usado " no Visual Studio 2008?
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!
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
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.
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
{
public static class Example
{
private static string 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,
private static string temporaryPath = System.IO.Path.GetTempFileName();
ou podemos simplesmente remover a linha using System.Windows.Shapes;
.
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.
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.
O código compila mais rápido.
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 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 B
qual 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 B
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.
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 a using
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 de using
alias sempre que possível.