È una buona cosa creare uno spazio dei nomi per le funzioni globali in C ++?

2

Sto creando un progetto OpenSource C ++ e lo voglio più comprensibile e pulito, quindi ho bisogno di alcuni punti di vista su come fare cose del genere:

Server.cpp:

void Server::setOption(type foo, type bar) {/* ... */}
void Server::start() {/* ... */}

App.cpp:

namespace App {
  void startServer() {
    Server s;
    s.setOption(o1, o2);
    s.start();
  }
}

Quindi nella funzione principale:

App::startServer();

O dovrei semplicemente scrivere l'intero codice in main?

    
posta Nurrl 02.09.2017 - 03:14
fonte

2 risposte

3

Ci sono un paio di problemi con quello stile, il primo è che Server cessa di esistere alla coppia di chiusura di App::startServer . Inoltre, non mi piace il costruttore nullo seguito da un metodo "set required things", seguito da un metodo "now I have my requirements".

Si noti inoltre che uno spazio dei nomi è fondamentalmente una classe (implicitamente) solo statica. Non ho bisogno di uno per avvolgere il avvio di Server . Se avessi un sacco di altre cose correlate a Server , loro potrebbero andare in uno spazio dei nomi lontano dal resto del programma, ma solo se hai un sacco di identificatori in ambito namespace e hai bisogno di dividere li sopra.

Lo cambierei in:

class Server {
    Server(foo_t foo, bar_t bar) 
      : m_foo(foo), m_bar(bar) /*or w/e*/ 
    { /* body of start */ }
}

int main (...) {
    ... 
    Server s(o1, o2);
    ...
}
    
risposta data 04.09.2017 - 11:33
fonte
6

La mia opinione è che se il codice è scritto per un programma e viene usato solo in uno script, allora puoi semplificare la vita lasciandolo nello spazio dei nomi globale. Tuttavia, se è possibile che le tue classi e funzioni comprendano una libreria (vale a dire, importate da più programmi o rilasciate nel mondo come funzioni utili), è necessario averli nei loro spazi dei nomi.

Sembra che tu stia già utilizzando più librerie (App.cpp e Server.cpp), quindi quello che dovrei fare prima è introdurre uno spazio dei nomi per l'intero progetto (es .: mettere tutto sotto namespace nurrl o qualcosa di più descrittivo) . Quindi se hai davvero bisogno puoi mettere App e Server nei propri namespace, accedendo a funzioni come nurrl::App::startServer()

PS: con il tuo codice precedente, vorrei che void startServer() facesse effettivamente parte di una classe App nello spazio dei nomi App , a giudicare dal nome che hai scelto

    
risposta data 02.09.2017 - 04:31
fonte

Leggi altre domande sui tag