Ok, das ist also wirklich eine Art Teufelsanwaltfrage.
Wann sind globale Variablen in Ordnung, und wenn nie, welche würden Sie als Alternative verwenden?
Ein interessanter Nebenfall zu dieser Frage: Wie unterscheidet sich ein öffentliches statisches Klassenfeld von einem globalen?
Antworten:
Soweit ich weiß, ist ein öffentliches statisches Feld im Grunde genommen ein globales Feld, da es von überall aufgerufen werden kann, mit der Ausnahme, dass es den Namespace nicht verstopft.
Das einzige Mal, dass ich persönlich "globale" Variablen in meinem Code verwende, sind öffentliche statische Felder, die unveränderlich sind. In diesem Fall besteht kein Grund zur Sorge, dass der Wert durch andere Teile des Programms verfälscht wird, und es ist natürlich viel schöner, als ein Dutzend Variablen mit denselben permanenten Werten in jeder Klasse zu haben.
quelle
Persönlich verwende ich Globals für die Laufzeitkonfiguration. Wenn eine Konfigurationseigenschaft beim Start der Anwendung geladen wird und sich nur selten (und nur von einer Stelle aus) ändert, ist es schrecklich und fehleranfällig, sie an alle Methoden weiterzugeben, die möglicherweise verwendet werden müssen es irgendwann. Besser ist es, etwas zu verwenden, das von jedem Ort in den Geltungsbereich gebracht werden kann, an dem es benötigt wird, da dies Ihre Methodensignaturen und Aufrufsites nicht überfrachtet und verdeckt.
quelle
CONFIG_
oder einemCFG_
Präfix.Mit Ausnahme von Echtzeit- / eingebetteten Systemen sollten Sie eigentlich nur globale Werte für konstante Werte verwenden. Wenn Sie das Gefühl haben, dass Sie Ihr Problem ohne sie nicht lösen können, tun Sie wahrscheinlich etwas falsch.
Sehen Sie sich auch das Singleton-Muster an . Es bietet eine bessere Lösung für globale Unternehmen in Situationen, in denen Sie einen globalen Zugriffspunkt benötigen.
quelle
TIMES_TO_ITERATE_THROUGH_THIS_PARTICULAR_LOOP
ist nur in der einen Datei / Klasse / Sektion relevant, in der 'diese spezielle Schleife' erscheint.Das Problem mit globalen Variablen besteht darin, dass Sie sie überall in Ihrem Code kennen müssen. Wenn Sie jedoch einmal entschieden haben, dass Sie etwas über ein bestimmtes globales System wissen müssen, können Sie es nur wenig weiter nutzen. Meiner Meinung nach sollten Sie daher nur sehr wenige globale Variablen haben, aber bei den wenigen, die Sie haben, sollten Sie die maximale Laufleistung herausholen.
Ein weiteres Beispiel für etwas, das mir so einfällt, ist die Verwendung von Mixins in Ruby.
quelle
Es dreht sich alles um Namespaces.
Stellen Sie sich für einen Moment vor, dass jeder auf der Welt den gleichen Nachnamen hatte. Was für ein Chaos.
(In Indien haben die Sikhs alle den gleichen Nachnamen: Singh - Schau mal)
quelle
Kurzfassung: Wenn es einfacher ist, über das Programm nachzudenken. In der Regel handelt es sich um eine weit verbreitete Art von globalem Status oder statischer Ressource.
Lange Version: Tom Hawtin sagte "mit gruseliger Aktion auf Distanz" ... das ist genau das Problem bei Globals - man muss wissen, wo und wie es verwendet wird, oder man kann einige wirklich seltsame und schwer aufzuspüren bekommen Bugs. Einheimische sind nichts anderes als eine Strategie, um den Umfang dessen zu reduzieren, was der Programmierer verstehen muss, um über das Programm nachzudenken.
Eine andere Seite des Problems mit dem Wissen, wo sie verwendet werden, ist, dass es zu doppelten Globalen kommen kann. In diesem Fall können die Dinge sehr seltsam werden, da die meisten Programme var1 abrufen und setzen, während var2 an einigen Stellen verwendet wird, um zu halten die gleichen Informationen. Insbesondere, wenn mehrere Personen an demselben Code arbeiten. IDEs können hilfreich sein, wenn es darum geht, die Verwendung zu finden, wodurch die Kosten für globale Anwendungen gesenkt werden. Für Duplikate tun sie jedoch nichts.
Je mehr Globals Sie haben, desto schwieriger ist es, den Überblick darüber zu behalten, was mit ihnen geschieht. Sie sollten wenige und weit voneinander entfernt sein.
quelle
Die beiden Fallstricke mit Globals und Singletons sind Testbarkeit und Bereitstellbarkeit.
Zum Testen habe ich zu viele überkomplexe Testgurte gesehen, um nur schlecht geplante globale und einzelne Lebensdauern zu bewältigen. Stellen Sie sicher, dass für solche Objekte klare und einfache Regeln für das Starten und Herunterfahren gelten.
In Bezug auf die Bereitstellbarkeit sind zwei Fälle zu berücksichtigen. Erstens, wie wird Ihr globales Objekt leben? Befindet es sich in einer statischen oder dynamischen Bibliothek? Wenn dieses globale Objekt für ein Plugin wiederverwendet wird, erhalten Sie zusätzliche Kopien? Was passiert zweitens, wenn dieses globale Objekt in einer parallelen Anwendung abgelegt wird? Ist es threadsicher?
Insgesamt denke ich, dass diese Gründe bedeuten, dass Globale und Singletons nur in Ausnahmefällen verwendet werden.
quelle
Bei der Entwicklung kritischer eingebetteter Systeme werden normalerweise globale Variablen verwendet.
Stapelgrößen sind winzig, alles ist statisch zugeordnet (
malloc()
ist verboten), globale Variablen sind außerhalb der Bibliothek, zu der sie gehören, verborgen.quelle
In einer schrecklichen VB6-Codebasis, die globale Systeme missbraucht, als gäbe es kein Morgen, bin ich schuldig, eine neue einzuführen:
Ich denke, es ist einer der wenigen gültigen Anwendungsfälle für ein globales Objekt.
quelle