Namespace oder Klasse?
-
Folgendes Beispiel, Namespace oder Klasse?
typedef std::vector< std::vector< std::string > > table; class UserDB{ private: /// connection pool object to get databaseconnection. static DB* db; /// load session date from database void loadSession(UserDBEntry& user); public: /// restore User by User-ID and Password. User* restore( std::stringi& _uid, std::string& _pass); /// restore User by session-ID. User* restore( std::string& _sid ); /// insert or update User. bool store( UserDBEntry& user ); /// get table of Clients. table UserDB::getClientFor( UserDBEntry& user ); /// default constructor, get Database if not already there. UserDB(){ if ( db==NULL ){ Config conf("auth"); db = new DB (conf["db"]); } }; /// default destructor ( empty ). virtual ~UserDB(); /// Exceptionclass for UserDB-class. class Error : public std::exception{ /// reason for this exception. std::string reason; public: /// constructor with or without reason. Error( std::string _reason="" ) : reason(_reason) {}; /// destructor ( empty ) ~Error() throw() {}; /// overloaded method from std::exception to give reason. virtual const char* what () const throw() { return reason.c_str (); } }; };Ich würde sagen:
-Nur Methoden und statische Elemente-> Namespace
-Constructor wird benutzt -> Klasse
-Anwendung: UserDB db; db.store(this); ~db -> Namespace
-Der Zugriff auf die Datenbank der hier durchstatic DB* db;erreicht wird war ursprünglich durch eine Erbschaft von DB realisiert und das geht nur mit Klassen.

Danke,
Peanut
-
Dieses Kriterium hier gefällt mir gar nicht:
-Nur Methoden und statische Elemente-> Namespace
Das ist mir viel zu stark in Implementationen gedacht... löse Dich mal von der Sprache C++ und denke darüber nach, wie man zu Klassen und Namespaces kommt.
Ein Namespace entspricht zum Beispiel einem Package, also einer inhaltlich zusammengehörenden Menge von Klassen und Objekten.
Eine Klasse ist die Schablone für ein Objekt.
Du mußt Dich nun in Deiner Anwendung fragen: gibt es ein Objekt der Klasse UserDB? Angenommen Du denkst über Dein System nach, und irgendwo kommt der Satz vor: "Den aktuellen User mit seiner Session verwaltet das userDB-Objekt". [Oder so ähnlich - da ich das System nicht kenne, kann ich den Satz natürlich nicht bilden]
Wenn also dort ein userDB vorkommt, so hast Du eine Instanz - also ist UserDB eine Klasse.
An diesem Punkt solltest Du aufhören darüber nachzudenken, daß man die gleiche Funktionalität auch mit Namespaces realisieren kann. Ich kann das auch ohne Namespaces mit Prefixes in C machen - aber Du mußt einen Punkt finden, wo Dich auf eine Implementationsvariante festlegst. Und dies erreichst Du so: bei der Suche nach einem sprachlichen Mittel zur Umsetzung hörst Du bei dem höchsten von der Programmiersprache dafür angebotenen Hilfsmittel an. Und das ist hier die Klasse. Sie hat eine wesentlich höhere Bindung als ein Namespace.