2009-06-13 18 views
18

Non ho seguito la solita rotta CS per imparare la programmazione e spesso sento parlare di spazi dei nomi ma non capisco il concetto. Le descrizioni che ho trovato online sono solitamente nel contesto di C che non mi è familiare.Che cos'è uno spazio dei nomi?

Sto facendo Ruby da 2 anni e sto cercando di ottenere una comprensione più profonda della lingua e OOP.

+7

Non metterti a terra - un diploma di laurea non è un buon predittore di un buon sviluppatore e sospetto che la maggior parte degli sviluppatori a livello globale non sia così afflitta! –

risposta

13

Uno spazio dei nomi fornisce un contenitore per tenere le cose come funzioni, classi e le costanti come un modo per raggrupparli insieme logicamente e per evitare conflitti con funzioni e classi con lo stesso nome che sono state scritte da qualcun altro.

In Ruby questo si ottiene utilizzando i moduli.

3

basti pensare ad esso come un raggruppamento logico di oggetti e funzionalità

2

Wikipedia ha un articolo breve ma utile su spazi dei nomi in generale, così come un molto più dettagliata one per i namespace in informatica, con il linguaggio specifico esempi & c.

Il punto chiave è che, quando non è possibile "logicamente gruppo" nomi in spazi dei nomi, cioè si ha solo un singolo "spazi" indifferenziate, dove tutti i nomi vivono, di evitare gli scontri accidentali si finisce goffamente re-implementare la funzionalità dello spazio dei nomi rudimentale con trucchi come i prefissi telefonici & c. Ad esempio, "disegnare" significa qualcosa di molto diverso da un artista o da un pistolero; se non potessi avere spazi dei nomi separati per artisti e cose da pistolero, ti ritroverei con identificatori come artist_draw e gunslinger_draw e ancora rischiare accidenti accidentali se alcuni autori di librerie usano convenzioni diverse, ecc. ecc.

2

Da php.net:

Quali sono gli spazi dei nomi? Nei più ampi spazi dei nomi di definizione sono disponibili gli elementi di incapsulamento . Questo può essere visto come un concetto astratto in molti posti. Ad esempio, in qualsiasi sistema operativo le directory servono per raggruppare i relativi file e fungono da spazio dei nomi per i file al loro interno. Come esempio concreto , il file foo.txt può esistere in directory/home/greg e in /home/other, ma due copie di foo.txt non possono coesistere nella stessa directory. Inoltre, per accedere al file foo.txt di fuori della casa/greg directory/ , dobbiamo anteporre il nome directory per il nome del file utilizzando il separatore di directory per ottenere /home/greg/foo.txt. Questo stesso principio si estende agli spazi dei nomi nel mondo di programmazione .

Quindi, come un altro poster menzionato, gli spazi dei nomi possono essere utilizzati per raggruppare gli elementi.

Per capire perché questo potrebbe essere utile, si supponga di voler scrivere un plug-in per, ad esempio, Wordpress e si desideri creare una classe denominata "MyClass". Il problema è, però, non hai idea se qualche altro sviluppatore abbia già scritto un altro plug-in di Wordpress usando una classe chiamata "MyClass". Quindi, per evitare conflitti di denominazione, invece si nomina la classe "MyPluginMyClass". Questo è fastidioso, ma probabilmente evita i conflitti di denominazione.

Ma poi arriva il rilascio di PHP 5.3, che finalmente supporta gli spazi dei nomi (assumiamo anche che Wordpress e tutti i server su cui è distribuito passino a PHP 5.3). Ora puoi creare uno spazio dei nomi, pronunciare "MyPlugin" e incapsulare "MyClass" al suo interno. Fatto ciò, puoi pubblicare il tuo plug-in senza preoccuparti che la tua versione di "MyClass" sia in conflitto con la versione di "MyClass" di qualcun altro.

15

Definizione namespace da Wikipedia:

Un namespace è un contenitore di astratto o ambiente creato per contenere un raggruppamento logico di identificatori unici (cioè, nomi). ...

Per esempio, un unico luogo è possibile trovare spazi dei nomi utilizzabile è qualcosa di simile:

si definisce una costante o una variabile, o anche una classe che ha un nome generico. Se non si desidera rinominare questa costante/variabile/classe, ma è necessario averne un altro con lo stesso nome, è possibile definire tale nuova istanza in un diverso spazio dei nomi.

In ruby, un modulo è praticamente la stessa cosa di uno spazio dei nomi in C++.

esempio:

module Foo 
    BAZ = 1 
end 

module Bar 
    BAZ = 2 
end 

puts Foo::BAZ #=> 1 
puts Bar::BAZ #=> 2 

Quindi, lì, si ha costante BAZ dichiarato in due moduli (namespace aka in Ruby)

42

Ho intenzione di fornire una descrizione più banale.

Dire che mia moglie ha una sorella di nome Sue, e anch'io. Come posso distinguerli in una conversazione? Usando i loro cognomi ("Sue Larson" vs "Sue Jones"). Il cognome è lo spazio dei nomi.

Questo è un esempio limitato, naturalmente, e nella programmazione, i potenziali membri della famiglia potrebbero essere molto più numerosi del mio esempio, quindi il potenziale di collisioni è più alto. Gli spazi dei nomi sono anche gerarchici in alcune lingue (ad esempio java), che non è parallelo ai cognomi.

Ma altrimenti è un concetto simile.

+1

Grazie per la tua meravigliosa spiegazione. Così semplice se spiegato in questo modo. – Sam

+6

Un altro esempio: se nella stessa applicazione sono presenti 'Building :: Key' e' Piano :: Key', gli spazi dei nomi mantengono separate le classi 'Key'. –

2

Risposta più breve: i namespace creano scope.

+0

Cosa intendi per "ambito" in questo contesto? –

+0

L'ambito include il contesto in cui gli oggetti sono associati. Fai riferimento a http://winterdom.com/dev/cpp/nspaces. Sei d'accordo? – Ninad

Problemi correlati