013
03.09.2003, 14:35 Uhr
virtual
Sexiest Bit alive (Operator)
|
Es geht eigentlich nur um die Sichtbarkeit von Symbolen. eine statische Member variable hat - abgesehen von der Sichtbarkeit - genau die gleichen Eigenschaften wie jede andere globale Variable auch. Also ich würde mal sagen: eine Statische Variable hat im gegensatz zu einer ordinären globalen Variable den klaren vorteil, daß sie nicht im globalen Namensraum liegt und damit eine bessere Trennung von Modulen ermöglicht.
Meine Meinung zu globalen Variablen:
Ich denke, ich würde jedem Anfänger davon abraten, sich in globale Variablen zu verlieben und daher den tip geben sie zu meiden ("Aus den Augen aus den Sinn". Die versuchung ist ja grade für Anfänger recht groß: sie verkürzen die Parameterlisten von Funktionen (denn die alternative ist in der Regel, diese Varaible als Parameter mit zu liefern), und Parameterlisten sind offenbar für Anfänger oft ein nicht zu unterschätzendes Problem.
Ich würde jedem Programmierer, egal ob Profi oder Anfänger davon abraten, globale Variablen in Komponenten zu verwenden, die man wiederverwenden möchte. Da sind sie tatsächlich eines der größten No-Nos überhaupt: (1) Zum einen könnte jemand anders ebenfalls eine globale Variable gleichen Namens in seiner eigenen Super-Library verwendet haben, womit man dann die eigene Komponente nicht mehr mit der Super-Library zusammen verwenden kann. (2) Globale Variablen wiedersprechen darüberhinaus dem Geheimnisprinzip, welches in der OO Welt postuliert wird. Ein Zugriff auf diese Variable kann im Zweifel nicht mehr duch deine Komponente Konrolliert werden und dann kann Dir einer ins Handwerk pfuschen. Wenn Du eine Accessorroutine hast, die Dir die Variable zurückgibt, kannst zu zB steuern, daß Zugriffe auf diese variable nie verändernd wirken sollen (const Pointer / Reference zurückgeben) (3) Abseits der reinen theorie bzgl. Design gibt es ganz hübsche Compilerbugs, die globale Variablen schlicht weg nicht möglich machen: wenn du zB eine Klasse als globaler Variable instanziieren möchtest, in einer dynamic Library, dann erfordert das vom Linker einen speziellen Precode, der sicher stellt, daß die Constructoren aufgerufen werden, sobald die Library eingebunden wird. Leider wird dies nicht von allen Compiler/Linker Optionen unterstützt (Beispiel: HP-UX mit gcc und nativem Linker). Dh wenn man protabel sein will, muß man im zweifel eh die Finger von globalen variablen lassen, aus ganz "irdischen" Überlegungen heraus.
Allerdings finde ich es durchaus iO, in einfachen Programmen, die nicht wiederverwendet werden, globale Variablen zu verwenden, wenn dies nachhaltig die Programmstruktur vereinfachen kann. Allerdings kommt sowas bei mir äußerst selten vor, weil wenn man sich erstmal an das NoNo bzgl. globaler Variablen gewöhnt hat, dann ist deren verwendung nur schwer wieder erlernbar. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |