Article View: de.comp.lang.c++
Article #222Re: Globale Objekte, exception aus Konstruktor
From: Ullrich von Bassewitz
Date: Sun, 06 Aug 1995 14:09
Date: Sun, 06 Aug 1995 14:09
65 lines
3579 bytes
3579 bytes
Ralf W. Stephan (ralf@ark.franken.de) wrote: > Ullrich von Bassewitz writes: > > Ralf W. Stephan (ralf@ark.franken.de) wrote: > > > Nein, das ist schlechtes Design. Globale Objekte sind Bad Things [tm] > > > in C++. Benutze lokale (in main()) Objekte und übergebe sie als > > > Referenzen an die Objekte, die es brauchen. > > Wieso ist das schlechtes Design? Die C++ I/O-Streams benutzen z.B. globale > > Objekte um sicherzustellen, dass cin, cout etc. bereits vor dem Aufruf von > > main() geoeffnet werden. Ist das auch schlechtes Design? > > Weiß ich nicht, aber Du wirst mir sicher zustimmen, wenn ich sage, daß > das ein Sonderfall ist, bzw. wann brauchst Du schon mal ein Objekt, bevor > main() startet? Die haeufigste Anwendung fuer globale Objekte sind Initialisierungen fuer bestimmte Module oder Objekte (zumindest ist das bei mir so und das habe ich auch bei Stroustrup so rausgelesen). Globale Objekte bieten sich immer dann an, wenn Du bestimmte Dinge durch- fuehren willst, bevor main() startet. Bei einer Klassenblibliothek von mir sind das z.B. Registrierungen fuer persistente Objekte. Haette nicht jedes Modul ein oder mehrere statische Objekte, die die notwendigen Registrierungen durchfuehren, dann muesste der Programmierer das in jedem Programm zu Fuss durch Aufrufe von einzelnen Funktionen machen - und das waere bei der Vielzahl der persistenten Objekte eine ermuedende und auch sehr fehler- anfaellige Geschichte. Das eine Initialisierung nicht durchgefuehrt wurde merkst Du naemlich in dem Fall erst recht spaet bzw. u.U. in der Testphase ueberhaupt nicht. Bei der Verwendung globaler Objekte zur Initialisierung eruebrigt sich das. In meinen Augen ist das eine sehr elegante Moeglichkeit... > Bestimmte Kodierungsstile werden oft deswegen als Bad Design bezeichnet, > weil sie letztendlich zu fehleranfälligem Code führen. Globale Objekte > werden oft mit einer init()-Memberfunktion initialisiert (anstatt im > Konstruktor), weil zB argc,argv erst später zur Verfügung steht. Ich habe bei mir kein einziges globales Objekt, das mit einer Init() Funktion initialisiert wird. Das was Du angibst (Zugriff auf argc und argv) ist einer der wenigen denkbaren Faelle, wo das notwendig sein sollte, dann aber liegt das Problem woanders, naemlich in der Trennung von Instantiierung und Initialisierung, nicht bei den globalen Objekten... Und wie oben genannt, waere (zumindest bei meiner Bibliothek) der _Verzicht_ auf globale Objekte der eindeutig fehleranfaelligere und umstaendlichere Weg. > Ebenso > ist die Einkapselung nicht mehr gegeben, wenn globale Strukturen überall > im Code vorkommen; das gilt doch auch schon für C. Globale Objekte sind bei mir praktisch immer statisch - d.h. nur auf Modul- Ebene sichtbar. Eine Kapselung ist also sehr wohl da. > Und ich persönlich > finde es einfach schöner... Ok, das lasse ich gelten :-) Gruss Uz -- Ullrich von Bassewitz uz@ibb.schwaben.com
Technical Details
Message-ID:
<DCw7BE.8n5@wuschel.ibb.schwaben.com>Path:
arc1-ca.pugleaf.net!wuschel.ibb.schwaben.com!uzReferences:
<3vnvio$f95@rzsun02.rrz.uni-hamburg.de> <1995Aug4.100635.24026@ark.franken.de> <DCszrC.IqG@wuschel.ibb.schwaben.com> <1995Aug5.131455.1936@ark.franken.de>Show Full Headers
Complete Article Headers
Newsgroups: de.comp.lang.c++ Path: arc1-ca.pugleaf.net!wuschel.ibb.schwaben.com!uz From: uz@wuschel.ibb.schwaben.com (Ullrich von Bassewitz) Subject: Re: Globale Objekte, exception aus Konstruktor X-Newsreader: TIN [version 1.2 PL2] Reply-To: uz@ibb.schwaben.com Organization: Ingenieurbuero von Bassewitz Message-ID: <DCw7BE.8n5@wuschel.ibb.schwaben.com> References: <3vnvio$f95@rzsun02.rrz.uni-hamburg.de> <1995Aug4.100635.24026@ark.franken.de> <DCszrC.IqG@wuschel.ibb.schwaben.com> <1995Aug5.131455.1936@ark.franken.de> Date: Sun, 6 Aug 1995 14:09:13 GMT