2009-03-10 7 views
101

Mi chiedo se ci sono motivi (a parte il riordinamento del codice sorgente) perché gli sviluppatori utilizzano la funzionalità "Rimuovi non utilizzato Usings" in Visual Studio 2008?Perché rimuovere inutilizzato utilizzando le direttive in C#?

+0

Credo che sia una funzionalità di PowerCommands per Visual Studio, non di Visual Studio stesso. –

+3

In VS2008 è sicuramente una funzionalità (insieme alla possibilità di ordinare le istruzioni usando) di VS stesso. – Richard

+1

@Hosam: PowerCommands consente di farlo per l'intero progetto/soluzione. Facendo quello per file è una funzionalità di VS stesso. – configurator

risposta

166

Ci sono alcuni motivi per cui vorresti portarli fuori.

  • È inutile. Non aggiungono alcun valore.
  • È confuso. Cosa viene utilizzato da quel namespace?
  • Se non lo fai, accumulerai gradualmente le inutili affermazioni using mentre il codice cambia nel tempo.
  • L'analisi statica è più lenta.
  • La compilazione del codice è più lenta.

D'altra parte, non ci sono molti motivi per lasciarli dentro. Immagino che tu ti risparmi lo sforzo di doverli eliminare. Ma se sei così pigro, hai problemi più grandi!

+56

Un buon programmatore È pigro, massimizza il lavoro per NON farlo. : D –

+0

CodeRush consente di spostare tutti quelli non utilizzati con un singolo clic del mouse. – BenAlabaster

+24

Non sono d'accordo sul fatto che un buon programmatore sia pigro, ma sono d'accordo con il sentimento della tua affermazione. Un buon programmatore li cancellerà per mantenere pulito il suo codice, evitando così il lavoro/i problemi/problemi futuri per sé e per gli altri. – Allan

2

Il codice viene compilato più rapidamente.

+5

Hai qualche prova per confermare ciò? – cjk

+14

Oh CK - mi hai catturato di nuovo. Ho mentito. Rimozione di testo non necessario in realtà rende più lento la compilazione del codice. Pensaci :) –

+0

@ck: Ho verificato che la rimozione di istruzioni inutilizzate da un progetto al lavoro ha migliorato il tempo di compilazione di una quantità notevole. Ovviamente sarebbe - meno byte da leggere dal disco rigido. – configurator

23

Direi il contrario: è estremamente utile rimuovere istruzioni inutili e non necessarie.

Immagina di dover tornare al tuo codice in 3, 6, 9 mesi - o qualcun altro deve prendere in consegna il tuo codice e mantenerlo.

Se si dispone di una lunga lista di istruzioni per l'uso che non sono realmente necessarie, la visualizzazione del codice potrebbe essere piuttosto confusa. Perché usa quella parte, se non viene usato nulla da quel namespace?

Immagino in termini di manutenibilità a lungo termine in un ambiente professionale, suggerisco caldamente di mantenere il vostro codice il più pulito possibile - e ciò include il dumping di materiale non necessario da esso. Meno ingombro equivale a una minore confusione e quindi a una maggiore manutenibilità.

Marc

12

Meno opzioni nel popup Intellisense (in particolare se gli spazi dei nomi contengono un sacco di metodi di estensione).

In teoria, anche Intellisense dovrebbe essere più veloce.

+1

+1 per intellisense. In realtà è lento all'avvio (vedo regolarmente "Costruire la cache, riprova più tardi"), quindi potrebbe essere davvero significativo. Compilare il tempo di cui parlano tutti gli altri ... devo ancora vedere i numeri. – Luc

14

Questa mi sembra una domanda molto sensata, che viene trattata in modo piuttosto irriverente dalle persone che rispondono.

Direi che qualsiasi modifica al codice sorgente deve essere giustificata. Questi cambiamenti possono avere costi nascosti e la persona che pone la domanda desidera essere messa al corrente di questo. Non hanno chiesto di essere chiamati "pigri", come una persona inimicata.

Ho appena iniziato a utilizzare Resharper e sta iniziando a dare avvertimenti e suggerimenti di stile sul progetto di cui sono responsabile. Tra questi c'è la rimozione della direttiva ridondante usando, ma anche qualificatori ridondanti, maiuscole e molti altri. Il mio istinto è quello di riordinare il codice e risolvere tutti i suggerimenti, ma il capo della mia attività mi mette in guardia contro modifiche ingiustificate.

Utilizziamo un processo di compilazione automatizzato, pertanto qualsiasi modifica al nostro repository SVN genererebbe modifiche che non potremmo collegare a progetti/bug/problemi e innescherebbe build e release automatici che non hanno apportato modifiche funzionali alle versioni precedenti .

Se consideriamo la rimozione di qualificatori ridondanti, questo potrebbe causare confusione agli sviluppatori come classi i nostri livelli Dominio e Dati sono differenziati solo dai qualificatori.

Se osservo l'uso corretto di lettere maiuscole degli anonimi (ad esempio ABCD -> Abcd), allora devo tenere presente che Resharper non rifatta alcun file Xml che usiamo come nomi di classi di riferimento.

Quindi, seguire questi suggerimenti non è così semplice come sembra e dovrebbe essere trattato con rispetto.

+6

Good Point, ma non bisogna dimenticare che mantenere un codice semplice e pulito migliora la manutenibilità, che è anche un obiettivo aziendale. Devi pesare entrambi. Idealmente, si desidera eseguire questo tipo di refactoring subito dopo il rilascio in modo da poter avere una lista il più pulita possibile per iniziare una nuova attività e avere tutto il tempo necessario per rilevare eventuali regressioni. –

4

Aiuta anche a prevenire le false dipendenze circolari, assumendo che sia anche possibile rimuovere alcuni riferimenti a dll/progetto dal progetto dopo aver rimosso gli utilizzi inutilizzati.

5

Rimuovere. Meno codice per guardare e meravigliarsi fa risparmiare tempo e confusione. Vorrei che più persone MANTENGONO COSE SEMPLICI, NEAT e TIDY. È come avere camicie e pantaloni sporchi nella tua stanza. È brutto e ti devi chiedere perché è lì.

11

Oltre ai motivi già indicati, impedisce conflitti di denominazione non necessari. Considerate questo file:

using System.IO; 
using System.Windows.Shapes; 

namespace LicenseTester 
{ 
    public static class Example 
    { 
     private static string temporaryPath = Path.GetTempFileName(); 
    } 
} 

Questo codice non compila perché entrambi gli spazi dei nomi System.IO e System.Windows.Shapes contengono ciascuno una classe chiamata Path. Potremmo risolvere il problema utilizzando il percorso completo della classe,

 private static string temporaryPath = System.IO.Path.GetTempFileName(); 

o potremmo semplicemente rimuovere la linea using System.Windows.Shapes;.

2

Almeno in teoria, se ti è stato fornito un file C# .cs (o qualsiasi singolo file di codice sorgente del programma), dovresti essere in grado di guardare il codice e creare un ambiente che simuli tutto ciò di cui ha bisogno. Con alcune tecniche di compilazione/analisi è anche possibile creare uno strumento per farlo automaticamente. Se questo è fatto da te almeno in mente, puoi assicurarti di capire tutto ciò che dice il file di codice.

Considerate ora, se vi è stato fornito un file .cs con 1000 using direttive che solo 10 erano effettivamente utilizzate. Ogni volta che guardi un simbolo che è stato introdotto di recente nel codice che fa riferimento al mondo esterno, dovrai passare attraverso quelle 1000 righe per capire di cosa si tratta. Questo ovviamente rallenta la procedura sopra descritta. Quindi se riesci a ridurli a 10, ti sarà d'aiuto!

A mio parere, la direttiva C# using è molto molto debole, dal momento che non è possibile specificare solo simbolo generico senza genericità sta perdendo, e non è possibile utilizzare direttiva using alias per utilizzare metodi di estensione. Questo non è il caso in altri linguaggi come Java, Python e Haskell, in quelle lingue è possibile specificare (quasi) esattamente ciò che si desidera dal mondo esterno. Ma poi, ti suggerirò di usare l'alias using quando possibile.

2

Recentemente ho ottenuto un altro motivo per cui l'eliminazione delle importazioni inutilizzate è molto utile e importante.

Immaginate di avere due gruppi, in cui uno fa riferimento all'altro (per ora chiamiamo il primo A e il riferimento B). Ora quando hai il codice in A che dipende da B, tutto va bene. Tuttavia, ad un certo punto del tuo processo di sviluppo ti accorgi che non hai più bisogno di quel codice, ma lasci l'istruzione using dove era.Ora non solo hai una direttiva senza senso using ma anche un riferimento di assemblaggio a B che non viene utilizzato da nessuna parte ma nella direttiva obsoleta. Ciò innalza in primo luogo la quantità di tempo necessaria per la compilazione di A, in quanto è necessario caricare anche B.

Quindi questo non è solo un problema su più pulito e più facile da leggere il codice, ma anche sul mantenimento di assemblaggio riferimenti nella produzione-codice in cui non tutte queste assemblee si fa riferimento anche esistono.

Infine nel nostro esempio abbiamo dovuto spedire B e A insieme, anche se B non è utilizzato da nessuna parte in A ma nella sezione using. Ciò influirà in modo massiccio sul runtime -performance di A quando carico l'assembly.

Problemi correlati