2009-02-02 3 views

risposta

35

Molti sviluppatori C++ non utilizzano i namespace, purtroppo. Quando ho iniziato con C++, non li ho usati per molto tempo, fino a quando non sono giunto alla conclusione che posso fare meglio usando i namespace.

Molte librerie funzionano attorno agli spazi dei nomi inserendo prefissi prima dei nomi. Ad esempio, wxWidgets mette i caratteri "wx" prima di tutto. Qt mette "Q" prima di tutto. Non c'è niente di veramente sbagliato in questo, ma richiede di digitare di nuovo quel prefisso, anche se può essere dedotto dal contesto in cui si intendono le dichiarazioni. I namespace hanno un ordine gerarchico. I nomi che sono lessicamente più vicini al punto in cui li fanno riferimento si trovano prima. Quindi, se si fa riferimento a "Finestra" all'interno del proprio framework GUI, troverà "my :: gui :: Window", invece di ":: Window".

Gli spazi dei nomi attivano alcune funzioni utili che non possono essere utilizzate senza di essi. Ad esempio, se si inserisce la classe in uno spazio dei nomi, è possibile definire funzioni libere all'interno di tale spazio dei nomi. Chiama quindi la funzione senza mettere lo spazio dei nomi in primo piano importando tutti i nomi, o selettivamente solo alcuni di essi nell'attuale scope ("using declaration").

Al giorno d'oggi, non faccio più alcun progetto senza usarli. Rendono così facile non digitare di nuovo lo stesso prefisso, ma hanno ancora una buona organizzazione ed evitano l'inquinamento del nome del namespace globale.

+5

Sì, e rende il codice MOLTO più chiaro. Una variabile globale non ti dice nulla, ma config :: max_threads ti dà almeno un indizio su da dove proviene. –

1

Hai solo bisogno di spazi dei nomi se esiste il rischio di conflitti di nomi: alcune funzioni o variabili o classi viste globalmente sono definite più di una volta. Altrimenti andrà tutto bene senza spazio dei nomi - basta nominare le classi in modo che non duplicino le classi delle librerie di runtime e rendere le funzioni/variabili globali come membri statici di alcune classi ragionevoli.

11

Dipende, se il codice è un codice di libreria, si prega di inserirlo in spazi dei nomi, che è la pratica in C++. Se il tuo codice è solo un'applicazione molto semplice che non interagisce con nessun'altra cosa, come una sorta di app di Hello World, non c'è bisogno di spazi dei nomi, perché è ridondante.

E poiché i namespace non sono richiesti, i frammenti di codice e gli esempi sul web raramente li usano ma la maggior parte dei progetti reali li usa.

2

Dipende davvero dal presupposto che ci siano conflitti.

Due scenari;

1) Se si sta creando codice che potrebbe essere utilizzato da altri (ad es. Librerie), potrebbero esserci conflitti di spazio dei nomi, quindi utilizzare il proprio spazio dei nomi è una buona idea.

2) Se si utilizzano librerie di terze parti, il loro codice potrebbe non essere assegnato ai nomi e potrebbe entrare in conflitto con il proprio.

Direi anche che se ti aspetti che il tuo codice sia considerevole e copra molte aree diverse (matematica/fisica/rendering), usare gli spazi dei nomi rende il codice più semplice da utilizzare, in particolare per i tipi che non sono ovviamente classificati.

+0

Il secondo punto è particolarmente vero quando si incorporano le librerie C, poiché mancano spazi dei nomi. –

+0

@Robert - Sì, buon punto. –

+2

Qui non c'è niente di "particolarmente vero" per le librerie C. Le librerie C buone sono assegnate ai nomi tramite prefissi. Buone librerie С ++ sono assegnate ai nomi tramite namespace. Le librerie Bad C e C++ non sono namespace. È una questione di qualità, non di linguaggio. – Constantin

1

ma questa pratica sembra essere raro nel C++ mondo

Davvero. Tutto il codice che vedo sembra essere avvolto in un namespace.
Io uso lo stesso tipo di convenzione che vedo in Java (ad eccezione di I drop the com).

In Java

package com.<Company>.<Product>.<Package>; 

In C++

namespace <Company> 
{ 
    namespace <Product> 
    { 
     namespace <Package> 
     { 
     } 
    } 
} 
2

Abbiamo avuto problemi che avvolgono codice gestito C++ che utilizza le nostre biblioteche comuni qui.

Alcune classi avevano lo stesso nome di classe System nella libreria .NET (ad esempio System.Console).
Abbiamo dovuto fare alcune brutte patch per risolvere questi problemi.

L'utilizzo degli spazi dei nomi all'inizio lo avrebbe impedito.

3

Ho appena scoperto c guida di stile di Google ++ e hanno namespace guidelines.

L'intera guida è la pena di leggere, ma per riassumere, dicono:

  • Aggiungi namespace senza nome a .cc file, ma non. h file.
  • Avvolge interi file (dopo include/dichiarazioni) .cc e .h in spazi dei nomi con nome.
  • Gli spazi dei nomi non incrementano il livello di rientro.
  • Alla parentesi di chiusura per un namespace scrivere } // namespace.
  • Non dichiarare nulla in std, perché non è definito.
  • utilizzando la direttiva using è vietato.
  • la dichiarazione using è consentita in funzioni, metodi e classi.
  • alias di spazi dei nomi sono consentiti ovunque.
+0

Perché non aggiungere spazi dei nomi non protetti ai file .h? – Casebash

1

Direi che è una buona idea, se non altro per tenere lontani i tuoi contenuti quando mischiati con altri codici di terze parti.

Cerco di andare ancora più lontano inserendo quante più variabili e funzioni possibile nelle classi. Ma a volte è più difficile da fare di quanto dovrebbe essere (rispetto ad altre lingue OO).