Meriti di Namepsaces / Pacchetti


14

Alcuni linguaggi di programmazione (ad esempio Java e C ++) hanno funzionalità di linguaggio chiamate "pacchetti" o "spazi dei nomi". Quanto è davvero utile avere spazi dei nomi? È possibile contrassegnare funzioni e classi come appartenenti a una particolare libreria senza utilizzare una tale funzione linguistica, come fa SDL (ad es SDL_BlitSurface().). Gli spazi dei nomi non sono abbastanza utili da valerne la pena? Sono utili nelle librerie ma non nelle applicazioni? Sono utili ovunque tranne che nei piccoli progetti? Pensieri?

Risposte:


16

I prefissi dei nomi non sono la stessa cosa dello spazio dei nomi , tranne che è fatto in un modo che è meno utile e più difficile da leggere / analizzare? La domanda non risponde da sola?


Inserire un prefisso all'inizio del nome di un identificatore non è la stessa cosa che usare una funzione di linguaggio come gli spazi dei nomi. Ad esempio, in C ++, puoi dire che sei usingun particolare spazio dei nomi e quindi non devi inserire il prefisso all'inizio degli identificatori in quello spazio dei nomi.
compman,

2
@ user9521 - questo è il mio punto ...
Nicole il

+1 L'unico grande vantaggio degli spazi dei nomi è che puoi saltare / accorciare il prefisso quando non è necessario - nello spazio dei nomi in cui viene definita la particolare cosa a cui si fa riferimento, da using, da import xxxxxxxxx as yyy, ecc.

1
Dal momento che la maggior parte dei programmatori sono pigri, preferiresti dichiarare using SDL;o dovresti scrivere SDL_*dappertutto?
Berin Loritsch,

2
+1, ma penso che tu abbia realmente inteso "meno utile, più difficile da leggere e non verificato dal compilatore".
Larry Coleman,

5

La maggior parte (tutte?) Le lingue con spazi dei nomi tendono ad essere orientate agli oggetti. Molte volte un nome leggibile dall'uomo per un tipo è appropriato, anche se ci sono più implementazioni incompatibili. (questo porta ad altri problemi sul riutilizzo orientato agli oggetti, ma non è di questo che si tratta). Ad esempio, in Java si dispone di un timer che viene utilizzato per attività dell'interfaccia utente in background e un timer che viene utilizzato per attività in background (non legate ad AWT / Swing). Lo spazio dei nomi consente di avere questi oggetti con lo stesso nome che vivono in diverse API secondarie.

La ragione per cui gli spazi dei nomi sono nati ha avuto a che fare con l'irragionevole compito di anticipare ciò che altri sviluppatori chiameranno i loro oggetti. Il C ++ ha introdotto il concetto (o almeno è stata la prima lingua a cui sono stato esposto con il concetto), ed è stato utile anche se non c'erano linee guida sulle migliori pratiche d'uso. Java ha adattato il concetto e aggiunto alcune "best practice" che includevano il nome della tua azienda nello spazio dei nomi. In questo modo dovevi solo preoccuparti della tua compagnia.

Il prefisso può diventare piuttosto disordinato. Quando lo applichi? Quando si non applicarlo? Le strutture / classi / metodi globali ottengono il prefisso? E i metodi? Che dire delle proprietà nella struttura. Ho visto tutte queste cose nel codice, anche se per fortuna non tutte in una volta. Namespace fornisce una certa prevedibilità a tutte queste domande e lo rende una caratteristica del linguaggio piuttosto che una "best practice" personale.


Haskell ha spazi dei nomi (moduli) e non è orientato agli oggetti.
Jeremy Heiler,

3

Penso che gli spazi dei nomi siano un'ottima idea. Aiutano a prevenire i conflitti di denominazione limitando l'ambito di un nome. Nei pacchetti Java, la convenzione di denominazione dei pacchetti suggerita si basa su nomi di dominio, che dovrebbero essere univoci, il che aiuta a prevenire conflitti di denominazione su librerie personalizzate. Nel complesso, rendono la denominazione un po 'più unica in senso lato, pur consentendo al programmatore una buona libertà nel nominare i suoi pezzi senza dover seguire alcune oscure convenzioni di denominazione.


1
Tuttavia, nel caso della convenzione specifica di Java, non tutti hanno un sito Web. Inoltre, se dovessi mai spostare il tuo programma da un sito Web a un altro (ad es. Sourceforge su Github), avrebbe senso ma sarebbe scomodo cambiare i pacchetti se altre cose dipendono dal tuo codice.
compman,

1
La convenzione di Java si applica alla tua organizzazione, non al luogo in cui è ospitata. Puoi semplicemente dichiararti un'organizzazione e farla finita. C'è anche il problema degli URL che consentono i caratteri che non possono essere utilizzati nei nomi dei pacchetti. Ma non ci andremo. Quindi, per te, usa "me.user9521" come nome del pacchetto e sei pronto.
Berin Loritsch,

1
La convenzione non riguarda i nomi Web, ma i nomi di dominio. Puoi avere un dominio senza un sito web.
David Thornley,

1

Namespace / Modules / Packages sono utili per evitare conflitti di nomi. Lo stesso vale per il prefisso dei nomi, ma gli spazi dei nomi hanno l'ulteriore comodità di poter importare simboli nello spazio dei nomi corrente in modo da non doverti preoccupare dell'intero spazio dei nomi :: *.

Alcuni linguaggi (come Python) estendono questa capacità consentendo di importare solo simboli specifici nel modulo corrente o importare simboli con un nome diverso. Ciò è utile se sei interessato solo ad alcune classi / funzioni / costanti o se alcuni simboli sono in conflitto con simboli nel tuo spazio dei nomi, ma altri no.

Alcune lingue (come Ruby) ti consentono di includere i metodi di un modulo nella tua classe. Questo è utile per polimorfismo e generici. Ad esempio, se si dispone di più classi con iteratori che agiscono allo stesso modo, è possibile combinare metodi in tutte queste classi da un modulo separato che fornisce metodi per ordinare e filtrare i dati nell'oggetto. Ciò consente sia has arelazioni is a(ereditarietà) che relazioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.