2010-08-18 15 views
8

Ok, il titolo potrebbe sembrare un po 'vago ma non riesco davvero a pensare a qualcosa di più chiaro qui.Quanto è importante il contesto implicito da un namespace?

Recentemente sono stato nella posizione in cui avevo bisogno di una classe Point, semplicemente con due proprietà, X e Y e un Point(int x, int y) ctor. Nulla di bello. Ora questa cosa esiste già in .NET, ma questo era in una libreria che gestiva determinati oggetti su una mappa e trascinava System.Drawing in questo appena sentito ... sbagliato in qualche modo. Anche se System.Drawing.Point si adattava perfettamente a ciò di cui avevo bisogno, ora creavo di nuovo quella struttura in quel progetto.

Ora mi chiedo se sia stata una cosa giusta o ragionevole da fare. System.Drawing.Point sarebbe venuto con un riferimento a tale assembly, se non ricordo male. E mettere qualcosa in System.Drawing in un contesto totalmente non di disegno era in qualche modo strano.

Pensieri? Cosa accadrebbe se non avesse implicito un riferimento a un altro assemblaggio?

+0

Per me, la sua cosa sensata da fare. – VinayC

risposta

3

Il contesto del namespace è fondamentale per avvicinarsi alla funzione precisa di una classe; una classe Connection sarà una bestia molto diversa da uno spazio dei nomi all'altro. Una classe Web.Cache sarà adatta per il caching in altre applicazioni o ha una dipendenza fondamentale dall'infrastruttura web?

MSDN descrive System.Drawing.Point struttura come segue:

"Rappresenta una coppia ordinata di interi xey coordinate che definisce un punto in un piano bidimensionale."

Con tale descrizione generale, si potrebbe sostenere che questa struttura è solo incidentalmente correlata al disegno e appartiene davvero a uno spazio dei nomi più fondamentale.

Tuttavia, dal momento che vive in System.Drawing, l'implicazione è che rappresenta un punto all'interno di uno spazio di disegno bidimensionale. Pertanto, utilizzarlo per scopi diversi dal disegno è un uso non corretto della classe; potrebbe funzionare per i tuoi bisogni, ma non viene utilizzato per il suo scopo originale.

1

Non direi che ciò che hai fatto è sbagliato, ma uno spazio dei nomi è in realtà solo un contenitore di dichiarazioni all'interno del quale ogni nome è univoco, il nome dello spazio dei nomi fornisce un contesto per aiutarti a trovare la funzione giusta per le tue necessità ma non restare impigliati nel contesto, non adattandoti al tuo uso, se l'oggetto è ideale, allora è l'ideale. A parte l'istruzione using probabilmente non farai mai più attivamente riferimento allo spazio dei nomi.

+0

Ho downvoted da 2 a 1 per aiutare a ridurre l'impatto della risposta e, auspicabilmente, fornire maggiore attenzione alle risposte più votate, perché questa Q/A è molto importante. Soprattutto perché questa è una domanda molto generalizzata. In un esempio specifico, a seconda del peso delle dipendenze e di altri fattori da prendere in considerazione, potrebbe effettivamente trattarsi di un problema che non implichi. Ma mentre ogni sviluppatore dovrebbe essere nella mentalità di "Non reinventare la ruota.", Penso che sia un modo di pensare in stile VB utilizzare impropriamente gli spazi dei nomi, e dovrebbe essere evitato se possibile. – Suamere

+0

@Suamere Anche se ovviamente hai diritto alla tua opinione, questa è solo la tua opinione e se non senti che la risposta è in realtà sbagliata, allora il down-voting di "fornire equilibrio" è un atto molto strano.Sicuramente dovresti down-votare ogni risposta che non si adatta alla tua visione di 'corretta'. – Lazarus

+0

Sì. Io metto a discapito tutte le risposte che non sono d'accordo con la mia opinione e elaboro tutte le risposte che concordo con la mia opinione. Buona osservazione Mi è capitato di commentare il tuo perché hai avuto una buona risposta, ma non è stata la risposta giusta a questa domanda. – Suamere

0

Avrei appena usato System.Drawing.Point. Perché ricreare qualcosa che esiste già? A chi importa cosa viene chiamato lo spazio dei nomi se fornisce la funzionalità di cui hai bisogno. Solo i miei 2 cent ...

0

Se non stai importando alcun "bagaglio" (come dover intializzare cose che non usi), è esattamente quello di cui hai bisogno, sceglierei il codice esistente. Non ha senso ricreare il codice esistente. Le probabilità sono anche che potresti scoprire le funzioni in un secondo momento in cui eseguire le funzioni necessarie e si aspettano quella particolare classe.

Tuttavia, posso identificare con la sensazione strana di avere un oggetto "alieno" nel codice. Un modo per aggirare questo sarebbe sottoclassi con il proprio punto. Sembrerà un po 'strano se non stai cambiando nulla nella sottoclasse, ma questo è visibile solo nell'origine di quella classe, e dove lo usi, viene costantemente chiamato. Inoltre inizierà a sembrare davvero intelligente non appena ti ritrovi ad aggiungere funzionalità al tuo Punto personalizzato.

+3

Avere una dipendenza addizionale (qui per l'assieme contenente 'System.Drawing.Point' è anche una sorta di bagaglio extra –

+0

Vero. Dipende da quanto" pesante "quel bagaglio viene confrontato con i costi extra di codifica. – Nicolas78

1

Se il tuo scopo per il punto non era in alcun modo legato al disegno, penso che tu abbia fatto la cosa giusta. L'utilizzo di un System.Drawing.Point nel codice che non fa in modo che il disegno sia in alcun modo correlato può confondere le persone con il pensiero che sia usato per alcune funzionalità di disegno.

6

Non sono d'accordo con le altre risposte finora e dico che conta davvero. L'esempio Point è semplice, ma in generale l'utilizzo di una classe in un contesto per il quale non è stato progettato potrebbe avere effetti indesiderati.

Una classe può essere stata implementata solo per un particolare caso d'uso, ad es. nessun supporto per la sicurezza del thread, che richiede l'uso all'interno di un framework o l'esposizione di funzionalità indesiderate nel codice.

Ciò potrebbe causare problemi quando viene distribuita una versione più recente dell'assieme, che non è più compatibile con il modo in cui viene utilizzata, oppure la versione più recente porta membri aggiuntivi e dipendenze che non si desidera avere nel tuo codice.

+0

Purtroppo non posso accettare due risposte: – Joey

+0

Sono d'accordo di più con questa risposta .. Su un argomento correlato, non voglio sottolineare il commento "Non reinventare la ruota". significa spazi dei nomi incrociati e costruisci codice spaghetti: significa che se il codice esiste già (di cui hai il controllo) ed è comune a due progetti, lo elabora a un livello superiore dello spazio dei nomi per il riutilizzo. namespace, e NON è così comune che questo può essere fatto, allora perché stai condividendo il codice? In questo esempio, come implicito nella tua risposta, il codice che lo usa in un modo potrebbe richiedere che esso venga modificato in questo modo, e romperà chiunque altro idiota. – Suamere

1

Mi trovavo in una situazione simile di recente. Non ho bisogno della classe Point, ma la userò come esempio.

Ho creato la mia propria classe Point perché System.Drawing.Point utilizza ints, quando avevo bisogno del doppio. In seguito mi sono reso conto che era una buona idea, anche se avevo solo bisogno di ints perché posso quindi estendere la classe in base alle necessità e aggiungere metodi, interfacce e attributi ecc. Considerando che non avrei potuto dovrei usare il sistema .Drawing.Point.

C'è il principio che non si dovrebbe duplicare la conoscenza nei programmi, ma in alcuni casi come questo, non può essere evitato.


Per quanto riguarda implica riferimento a un altro assieme, è possibile fare questo:

using Point = System.Drawing.Point; // or whatever your namespace is called 
+0

Per 'double's c'è System.Windows.Point, però. Che proviene da un altro assemblaggio e da un altro sottosistema (WPF). – Joey

+0

Oops! Non lo sapevo. – Nobody

0

Mi preoccuperei molto poco di portare qualcosa nella dallo spazio dei nomi dato che sia funzionalmente e concettualmente (come viene descritto nei documenti) si adatta all'obiettivo.

Tuttavia, potrei esitare a presentare una nuova assemblea. In questo caso il fatto che Point sia così veloce da rotolare i propri che potrei considerare il fastidio di farlo meno di quello di aggiungere un'altra dipendenza all'assembly che stavo scrivendo.

In caso contrario, purché non lo stia usando come chiave (il punto di impl. GetHashCode non è grande nel modo in cui si scontra per es. Tutti di {0,1}, {1,0}, {2,3} e {3,2} se hai un sacco di punti con valori bassi o distribuiti in modo rettilineo) Lo userei.

Problemi correlati