Meriti di Namepsaces / Pacchetti

14

Alcuni linguaggi di programmazione (ad esempio Java e C ++) hanno funzionalità linguistiche chiamate "pacchetti" o "spazi dei nomi". Quanto è utile avere spazi dei nomi? È possibile contrassegnare le funzioni e le classi come appartenenti a una determinata libreria senza utilizzare tale caratteristica linguistica, come fa l'SDL (ad esempio SDL_BlitSurface() ). Gli spazi dei nomi non sono abbastanza utili da valere? Sono utili nelle librerie ma non nelle applicazioni? Sono utili ovunque tranne che in piccoli progetti? Pensieri?

    
posta compman 21.12.2010 - 18:11
fonte

4 risposte

16

Non sono i prefissi dei nomi la stessa cosa di namespacing , tranne per il fatto che è fatto in modo meno utile e più difficile da leggere / analizzare? La domanda non risponde da sola?

    
risposta data 21.12.2010 - 18:16
fonte
5

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

Il motivo per cui gli spazi dei nomi sono nati ha 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 ci sono state 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 preoccuparti solo della tua compagnia.

Il prefisso può diventare piuttosto complicato. Quando lo applicate? Quando lo usi non ? 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 tutto in una volta. Namespace offre una certa prevedibilità a tutte queste domande e lo rende una funzionalità linguistica piuttosto che una "best practice" personale.

    
risposta data 21.12.2010 - 18:29
fonte
3

Penso che i namespace siano una grande 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 sui nomi di dominio, che dovrebbe essere univoci, il che aiuta a prevenire i conflitti di denominazione sulle librerie personalizzate. Nel complesso, rendono la denominazione un po 'più unica in senso lato, pur consentendo al programmatore un po' più di libertà nel nominare i suoi pezzi senza dover seguire alcune oscure convenzioni di denominazione.

    
risposta data 21.12.2010 - 18:17
fonte
1

Namespace / Moduli / Pacchetti sono utili per evitare conflitti di nome. Quindi il prefisso del nome è lo stesso, ma gli spazi dei nomi hanno la comodità di essere in grado di importare simboli nello spazio dei nomi corrente in modo da non doverti preoccupare dell'intero spazio dei nomi :: *.

Alcune lingue (come Python) estendono questa capacità consentendo di importare solo simboli specifici nel modulo corrente o importare simboli come un nome diverso. Questo è utile se sei interessato solo a poche classi / funzioni / costanti o se alcuni simboli sono in conflitto con i simboli nel tuo spazio dei nomi, ma altri no.

Alcune lingue (come Ruby) ti permettono 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 nello stesso modo, è possibile combinare i metodi in tutte queste classi da un modulo separato che fornisce metodi per ordinare e filtrare i dati nell'oggetto. Ciò consente relazioni has a e relazioni is a (ereditarietà).

    
risposta data 21.12.2010 - 18:39
fonte

Leggi altre domande sui tag