Utilizzo di un nome di dominio come spazio dei nomi C ++

2

Quale sarebbe un buon sistema per utilizzare i nomi di dominio come spazi dei nomi C ++ al fine di evitare conflitti tra i nomi degli sviluppatori? L'idea sembra essere popolare nel mondo di Java.

Non possiamo utilizzare namespace example.com { ... } , poiché i punti non sono consentiti.

Una soluzione pratica, ma come trovo non molto elegante, sarebbe sostituire ogni punto con un carattere che di solito non fa parte di alcun dominio, come un trattino basso (ho letto da qualche parte che i domini potrebbero anche contenere underscore, ma Non vedo questo è ampiamente usato). Questo lo renderebbe: namespace example_com { ... } .

Potremmo usare gli spazi dei nomi nidificati, in tal modo sostituendo efficacemente il punto con il separatore di spazi dei nomi :: , quindi sarebbe: namespace example { namespace com { ... }} e ci faremo riferimento ad esso da example::com . Lo svantaggio di questo è che suggerisce che com è una parte di example . Ma vorrei considerare il dominio come un'unità una . Altrimenti, la notazione inversa del dominio andrebbe bene: com::example . Ma la mia impressione è che il modo rilassato in cui i domini possono essere registrati ha reso questa gerarchia priva di significato per la maggior parte. Che cosa significherebbe lo spazio dei nomi com (lo spazio dei nomi esterno)? Risposta: per codice scritto da chiunque abbia un dominio .com e che può essere quasi chiunque . Cosa significherebbe namespace net o info ? Non mi sembra utile.

Qualcuno ha un'idea migliore o può confutare la mia critica riguardo al significato dei domini di primo livello?

Aggiornamento : ecco alcuni retroscena della mia domanda. Sto supervisionando un piccolo team di sviluppatori. In qualche parte, lavorano su librerie con funzionalità concorrenti (questo è inteso, poiché stiamo sperimentando diversi modi di fare le cose). Quindi abbiamo già avuto scontri sul nome (immaginate le librerie chiamate libmatrix o anche libmisc ). La soluzione facile sarebbe uno spazio dei nomi per sviluppatore e tengo traccia dei nomi utilizzati. Tuttavia, preferirei qualcosa di più costruito per ultimo. Inoltre, è concepibile che collaboriamo con altri gruppi di una struttura simile, e quindi abbiamo bisogno di qualcosa di globale.

    
posta Lasse Kliemann 09.07.2016 - 15:49
fonte

2 risposte

4

The easy solution would be one namespace per developer, and I keep track of which names are used. However, I would prefer something more built-to-last.

In che modo la tua soluzione suggerita non è "costruita per durare"?

La cosa sui namespace è che è molto facile spostare le cose da un namespace all'altro. Boost fa questo tutto il tempo. La definizione primaria di qualcosa può vivere in uno spazio dei nomi, mentre il nome esposto all'utente proviene da uno diverso.

Se stai solo sperimentando per trovare modi per implementare le cose, allora ogni sviluppatore dovrebbe avere il proprio spazio giochi per namespace. Quando vuoi valutare un particolare esperimento, usi lo spazio dei nomi specifico che hanno usato. Quando arriva il momento di integrare una delle varianti nel progetto principale, puoi utilizzare using dichiarazioni per portare questi simboli nello spazio dei nomi del progetto.

In effetti, la sintassi inline namespace di C ++ 11 è particolarmente utile per questo, poiché può far sì che uno spazio dei nomi entri efficacemente in uno contenente uno. In questo modo, lo spazio dei nomi interno ha ancora tutte le regole ADL e così via come se vivesse in quella esterna.

Tutti i tuoi sviluppatori si svilupperanno sotto lo spazio dei nomi di root per il tuo progetto, ma ognuno di essi avrà i propri spazi secondari. Quando arriva il momento di selezionare quale libreria matematica (ad esempio) si desidera effettivamente utilizzare, è sufficiente dichiararla inline nello spazio dei nomi principale. Questo è anche un bene per il controllo delle versioni; scegli la versione corrente come inline d, mentre le versioni precedenti possono ancora essere rese disponibili senza la parola chiave inline .

Questo è "costruito per ultimo".

Moreover, it is conceivable that we cooperate with other groups of a similar structure, and then we need something global.

E come sarebbe un nome di dominio essere in qualche modo diverso da un nome arbitrario scelto? O qualcuno ha scelto un nome unilateralmente come spazio dei nomi di root o tutti voi avete accettato di lavorare in uno specifico spazio dei nomi di root. Ad ogni modo, qualcuno doveva scegliere una sequenza di caratteri.

Che importa se quella sequenza di caratteri è un nome di dominio o no? Non vedo come inkscape , ad esempio, sia più probabile che venga selezionato da una persona casuale per caso di inskcape.org .

L'utilizzo di un nome di dominio come nome spazio dei nomi concordato non renderà più semplice la collaborazione. Quindi quale scopo serve per usare un nome di dominio come nome di un namespace?

1) It is very unlikely that someone will use a domain that is not registered to them as namespace.

Per un progetto professionale, forse. Per un progetto indipendente in cui il proprietario si affida alle strutture di GitHub per le loro cose? No. Perché usare un nome di dominio enorme come projname.github.io.com per uno spazio dei nomi? Gli unici caratteri utili in questo nome sono projname ; tutto il resto è un rumore inutile.

Anche per un progetto professionale, cairo è davvero così probabile che possa entrare in conflitto con qualcuno che cairographics.org sia un'alternativa migliore? Sono 5 caratteri utili e 12 caratteri di rumore. E certo, gli IDE facilitano la loro scrittura grazie al completamento del tab, ma ciò non rende più facile la lettura .

Nomi di tale lunghezza incoraggerebbero qualcuno a fare namespace projname = projname.github.io.com; , se non fosse flat out using namespace projname.github.io; . Quindi cosa guadagni?

Questa è la differenza tra C ++ e Java. Se fai import projname.github.io.com.* , rimane nel tuo singolo file .java . C ++ ha intestazioni , che non appartengono a una singola unità di traduzione. E molto codice viene scritto nelle intestazioni.

In C ++, è molto più probabile che tu debba usare un nome completo per un tipo piuttosto che in Java.

2) If it happens that someone uses a domain actually registered to us, then it is pretty obvious that they will have to move, not us.

Perché devono "muoversi"? Perché è registrato per te? Se hanno ottenuto il loro primo, e il loro progetto è più popolare del tuo, chi si aspetterebbe che cambi e infranga il codice di molte persone?

Il punto di namespace non è quello di garantire la distinzione universale tra i progetti. Altrimenti useremmo UUID o hash SHA o qualcosa per gli spazi dei nomi di root.

    
risposta data 09.07.2016 - 17:23
fonte
0

Non sono un fan della confezione Java inversa DNS. Ci sono alcuni motivi per questo.

  • I nomi delle società cambiano (futuro problema IP?)
  • Directory inutili come "com" che non contengono mai nulla

Quando eseguo lo sviluppo C ++, di solito faccio qualcosa del genere:

:: :: applicazione pacchetto :: subpackage

src / applicazione / pacchetto / file.h

#ifndef SRC_APPLICATION_PACKAGE_FILE_H_
#define SRC_APPLICATION_PACKAGE_FILE_H_

namespace application {
namespace package {

class MyClass {
  private:
    ::application::package::OtherClass other_;
};

}  // subpackage namespace
}  // application namespace

#endif

facoltativamente puoi fare un

using ::application::package::OtherClass;

se fai un modello

Un buon esempio di classe potrebbe essere qualcosa del tipo:

::application::logging::Logger logger_;
    
risposta data 25.07.2016 - 17:48
fonte

Leggi altre domande sui tag