Domanda

Il mio background è principalmente quello di sviluppatore Java, ma ultimamente ho lavorato in .NET.Quindi ho provato a realizzare alcuni semplici progetti a casa per migliorare il lavoro con .NET.Sono stato in grado di trasferire gran parte della mia esperienza Java nel lavoro con .NET (in particolare C#), ma l'unica cosa che mi ha davvero lasciato perplesso sono gli spazi dei nomi.

So che gli spazi dei nomi sono simili ai pacchetti Java, ma da quello che posso dire la differenza principale è che con i pacchetti Java utilizzano cartelle di file effettive per mostrare la separazione, mentre in .NET no e tutti i file risiedono in un'unica cartella e lo spazio dei nomi viene semplicemente dichiarato in ogni classe.

Lo trovo strano, perché ho sempre visto i pacchetti come un modo per organizzare e raggruppare il codice correlato, rendendone più facile la navigazione e la comprensione.Poiché in .NET non funziona in questo modo, nel tempo il progetto appare più sovraffollato e non così facile da navigare.

Mi sto perdendo qualcosa qui?Devo essere.Dovrei suddividere le cose in progetti separati all'interno della soluzione?Oppure esiste un modo migliore per mantenere le classi e i file organizzati all'interno di un progetto?

Modificare:Come ha sottolineato Blair, si tratta più o meno della stessa domanda Qui.

È stato utile?

Soluzione

Non posso affermare che sia una procedura consigliata, ma spesso vedo i file organizzati in una gerarchia di directory che rispecchia lo spazio dei nomi.Se si adatta meglio al tuo modello mentale del codice, fallo: non riesco a pensare a nulla di male.Solo perché il modello .NET non impone relazioni tra spazi dei nomi, progetti e struttura di directory non significa che non puoi avere tali relazioni se lo desideri.

Sarei un po' diffidente nel suddividere il codice in più progetti del necessario, poiché ciò può rallentare la compilazione e aggiungere un po' di sovraccarico quando devi gestire più assembly.

MODIFICARE:Tieni presente che questa domanda è quasi un duplicato di le cartelle in una soluzione dovrebbero corrispondere allo spazio dei nomi?

Altri suggerimenti

Sì, nello spazio dei nomi .NET non dipende dal file system o da qualsiasi altra cosa.È un grande vantaggio secondo me.Ad esempio puoi dividere il tuo codice tra diversi assembly che consentono una distribuzione flessibile.

Quando si lavora in Visual Studio, l'IDE tende a introdurre un nuovo spazio dei nomi quando si aggiunge una nuova cartella all'albero del progetto.

Ecco un collegamento utile da MSDN:

Linee guida per la denominazione degli spazi dei nomi

La regola generale per la denominazione degli spazi dei nomi è utilizzare il nome dell'azienda seguito dal nome della tecnologia e facoltativamente la funzione e il design come segue.
NomeAzienda.NomeTecnologia[.Funzionalità][.Design]

Naturalmente puoi utilizzare gli spazi dei nomi nel modo che ritieni più adatto.Tuttavia, se hai intenzione di condividere il tuo codice, ti consiglierei di seguire gli standard accettati.

MODIFICARE:

Consiglio vivamente a qualsiasi sviluppatore .net di procurarsene una copia Linee guida per la progettazione del quadro Questo libro ti aiuterà a capire Come E Perché .NET è progettato.

Una soluzione VS contiene normalmente uno o più progetti.Questi progetti hanno spazi dei nomi predefiniti (di solito lo spazio dei nomi è solo il nome del progetto).Normalmente, se aggiungi una cartella all'interno del progetto, tutte le classi in essa contenute verranno nominate come segue:

DefaultNamespace.FolderName.ClassName

Naturalmente, puoi modificare lo spazio dei nomi predefinito del progetto e nominare le tue classi nel modo che preferisci.

Per quanto riguarda quando/come suddividere le cose nei progetti, è una questione di esperienza e/o preferenza.Tuttavia, dovresti assolutamente suddividere le cose in progetti all'interno di una soluzione, per mantenere il tuo progetto organizzato.Se gestire troppe assemblee diventa complicato (come suggerito da Blair), puoi sempre farlo ILMerge i vostri assiemi in un unico assieme.La cosa fantastica di ILMerge è che anche se ti ritrovi con un solo assembly, tutte le tue classi mantengono i nomi completi originali.

È anche importante ricordare che una soluzione VS non ha alcuna influenza sul codice, ad es.non vengono costruiti.Le VS Solutions non sono altro che un modo per raggruppare progetti;sono i progetti che vengono creati e trasformati in DLL.

Infine, VS ti consente di aggiungere cartelle "virtuali" ovunque nella soluzione.Queste cartelle non vengono mappate a una cartella nel file system e vengono utilizzate semplicemente come un altro mezzo per aiutarti a organizzare i tuoi progetti e altri artefatti all'interno della soluzione.

Gli spazi dei nomi sono un raggruppamento logico, mentre i progetti sono un raggruppamento fisico.

Perché questo è importante?Pensa a .NET 2.0, 3.0 e 3.5..NET 3.0 è fondamentalmente .NET 2.0 con alcuni assembly aggiuntivi e 3.5 aggiunge alcuni altri assembly.Quindi, ad esempio, .NET 3.5 aggiunge il file DataPager control, che è un controllo Web e deve essere raggruppato System.Web.UI.WebControls.Se gli spazi dei nomi e le posizioni fisiche fossero identici, non potrebbe essere perché si trovano in un assembly diverso.

Quindi avere spazi dei nomi come entità logiche indipendenti significa che puoi avere membri di diversi assembly che sono tutti raggruppati logicamente insieme perché sono pensati per essere usati insieme tra loro.

(Inoltre, non c'è niente di sbagliato nell'avere layout fisici e logici abbastanza simili.)

In effetti, l'ambiente .Net ti consente di lanciare il tuo codice nell'IDE/filesystem come spaghetti contro un muro.

Ciò non significa tuttavia che questo approccio sia sensato.In genere è una buona idea attenersi all'approccio project.foldername.Class menzionato in precedenza.È anche un'ottima idea mantenere tutte le classi di uno spazio dei nomi nella stessa classe.

In Java, puoi anche fare cose assurde come questa e ottenere tutta la "flessibilità" che desideri, ma gli strumenti tendono a scoraggiarlo fortemente.Onestamente, una delle cose che più mi ha confuso quando sono stato introdotto nel mondo .Net è stato quanto questo possa essere sciatto/incoerente grazie alla guida relativamente scarsa.Tuttavia, è facile organizzare le cose in modo sensato con un po' di riflessione.:)

la differenza è che gli spazi dei nomi .net non hanno molto a che fare con i pacchetti Java.

Gli spazi dei nomi .net servono esclusivamente per gestire l'ambito dichiarativo e non hanno nulla a che fare con file, progetti o le loro posizioni.

È molto semplice che tutto ciò che è stato dichiarato in un particolare spazio dei nomi è accessibile quando si include un "utilizzo" per quello spazio dei nomi.

molto facile.

la scelta del nome e se/quanti "." I seperatori che usi dipendono interamente da te.

Per impostazione predefinita, VS aggiunge .foldernames ai tuoi spazi dei nomi solo per cercare di essere utile.

questo articolo spiega abbastanza bene gli spazi dei nomi:http://www.blackwasp.co.uk/Namespaces.aspx

Ha anche un esempio di convenzione di denominazione verso la fine, anche se la convenzione di denominazione è la tua scelta!;)

detto questo, la maggior parte dei posti in cui ho lavorato e delle persone con cui ho lavorato iniziano con il nome dell'azienda, il che è sensato, poiché rende distinti i nomi dei tipi per quell'azienda (separati da altri, biblioteche, fornitori, progetti opensource ecc.)

Puoi aggiungere cartelle alla tua soluzione per ogni spazio dei nomi.Anche se verrà comunque compilato in un singolo eseguibile, organizza i file sorgente e dà (quello che penso sia) l'effetto desiderato?

In genere aggiungo una cartella per ogni spazio dei nomi nel mio progetto e li annido secondo la stessa gerarchia (MyApp.View.Dialogs ad esempio)

Gli spazi dei nomi sono puramente semantici.Sebbene di solito riflettano una struttura di cartelle, almeno quando si utilizza l'IDE di Visual Studio, non è necessario.

Puoi avere lo stesso spazio dei nomi referenziato in più librerie, brutto ma vero.

Ho sempre considerato l'organizzazione dei file sorgente e l'assegnazione di identificatori a classi e oggetti come due problemi separati.Tendo a mantenere le classi correlate in gruppi, ma non tutti i gruppi dovrebbero essere uno spazio dei nomi.Gli spazi dei nomi esistono (più o meno) per risolvere il problema dei conflitti di nomi: nei linguaggi con spazi dei nomi semplici come il C, non puoi camminare per un metro senza inciampare in identificatori come mycompany_getcurrentdate O MYCGetCurrentDate, perché il rischio di un conflitto con un'altra funzione in una libreria di terze parti (o di sistema) è molto inferiore.Se creassi un pacchetto o uno spazio dei nomi per ogni separazione logica, otterresti (esempio Java) nomi di classe come java.lang.primitivewrapper.numeric.Integer, il che è praticamente eccessivo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top