🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: de.comp.lang.c++
Article #222

Re: Globale Objekte, exception aus Konstruktor

#222
From: Ullrich von Bassewitz
Date: Sun, 06 Aug 1995 14:09
65 lines
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!uz
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>

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