Warum sind globale Variablen schlecht?
-
Immer wieder liest man, dass man in seinen Programmen möglichst keine globalen Variablen verwenden soll, weil das 'schlechter Programmierstil' sei. Jetzt hätte ich vier Fragen zu dem Thema:
(1) Lässt sich überhaupt jede Aufgabenstellung komplett ohne globale Variablen lösen, oder gibt es nun mal Programme, die ohne globale Variablen unmöglich umsetzbar sind?
(2) Gelten auch lokale static Variablen als 'globale Variablen', also solche, die zwar nur innerhalb einer Funktion bekannt sind, aber ihren Wert beibehalten?
(3) Sind globale Variablen performance technisch auch schlechter als automatische Stack-Variablen? Die lokalen Varialben einer Funktion passen ja vermutlich alle auf eine Code-Page, aber wenn dann in der Funktion auf eine globale Variable zugegriffen wird, die ganz wo anders im Speicher liegt, verursacht das dann einen Page Fault oder Cache Miss?
(4) Gibt's da eine Orientierungshilfe, ab wann man in seinem Programm vermutlich 'zu viele' globale Variablen verwendet, und was gerade noch im vertretbaren Rahmen ist?
-
- gute Frage, theoretisch vielleicht ja, praktisch eher nein
- nein, aber die Problematik geht in die gleiche Richtung
- in der Regel ja
- frage dich bei jeder globalen Variable warum sie denn global sein muss
-
Globalisiert schrieb:
(1) Lässt sich überhaupt jede Aufgabenstellung komplett ohne globale Variablen lösen, oder gibt es nun mal Programme, die ohne globale Variablen unmöglich umsetzbar sind?
So gut wie alle, ja.
Globalisiert schrieb:
(2) Gelten auch lokale static Variablen als 'globale Variablen', also solche, die zwar nur innerhalb einer Funktion bekannt sind, aber ihren Wert beibehalten?
Definitiv.
Globalisiert schrieb:
(3) Sind globale Variablen performance technisch auch schlechter als automatische Stack-Variablen? Die lokalen Varialben einer Funktion passen ja vermutlich alle auf eine Code-Page, aber wenn dann in der Funktion auf eine globale Variable zugegriffen wird, die ganz wo anders im Speicher liegt, verursacht das dann einen Page Fault oder Cache Miss?
Globale Variablen haben nichts mit Performance zu tun, sie sind auch nicht technisch schlechter. Einfach schlechter Stil.
Globalisiert schrieb:
(4) Gibt's da eine Orientierungshilfe, ab wann man in seinem Programm vermutlich 'zu viele' globale Variablen verwendet, und was gerade noch im vertretbaren Rahmen ist?
Jede ist zuviel nach meinem Geschmack.
Auch guter Artikel:
http://c2.com/cgi/wiki?GlobalVariablesAreBad
-
also das ist natürlich nur mein halb wissen, aber eine globale variable sollte schon schneller sein, es entfallen doch die ganzen push und pop befehle. dachte immer der compiler tut sich damit ein bischen leichter
schlechter stil hin oder her am ende zählt doch eh nur performance
lg lolo
-
noobLolo schrieb:
also das ist natürlich nur mein halb wissen, aber eine globale variable sollte schon schneller sein, es entfallen doch die ganzen push und pop befehle. dachte immer der compiler tut sich damit ein bischen leichter
schlechter stil hin oder her am ende zählt doch eh nur performance
Wenn überhaupt, dann ist das absolute Mikronanominioptimierung, die du selbst bei zich lokalen Variablen in der Sekunde nicht merklich spürst.
-
Globalisiert schrieb:
(1) Lässt sich überhaupt jede Aufgabenstellung komplett ohne globale Variablen lösen, oder gibt es nun mal Programme, die ohne globale Variablen unmöglich umsetzbar sind?
Das ist keine sinnvolle Frage. Man braucht nur sehr, sehr wenig, um theoretisch sämtliche lösbaren Probleme auch lösen können.
(2) Gelten auch lokale static Variablen als 'globale Variablen', also solche, die zwar nur innerhalb einer Funktion bekannt sind, aber ihren Wert beibehalten?
Nein, global heißt "überall sichtbar". Im Gegensatz zu lokal.
Lokale statische Variablen teilen sich mit globalen Variablen einige Probleme, die durch die statische Speicherdauer verursacht werden, aber nicht die, die durch die globale Sichtbarkeit verursacht werden (wer hätte das gedacht!)(3) Sind globale Variablen performance technisch auch schlechter als automatische Stack-Variablen? Die lokalen Varialben einer Funktion passen ja vermutlich alle auf eine Code-Page, aber wenn dann in der Funktion auf eine globale Variable zugegriffen wird, die ganz wo anders im Speicher liegt, verursacht das dann einen Page Fault oder Cache Miss?
Vor allem liegen automatische Variablen ganz gerne in Registern. Kann trotzdem sein, dass ein guter optimierender Compiler für globale Variablenzugriffe vernünftigen Code generiert, so pauschal kann man das IMHO nicht sagen.
(4) Gibt's da eine Orientierungshilfe, ab wann man in seinem Programm vermutlich 'zu viele' globale Variablen verwendet, und was gerade noch im vertretbaren Rahmen ist?
Nö.
-
wenn n Systeme auf die selbe globale Var zugreifen und diese verändern können, gibt es ~ n^2 mögliche Paarungen von gegenseitiger Beeinflussung dieser n Systeme => quadratisch ansteigende Komplexität.
egal, ob globals die Performance zur Laufzeit beeinträchtigen oder nicht, die Performance zur Entwicklungszeit kann leiden, und die ist teuerer als Laufzeit.
-
Globalisiert schrieb:
(1) Lässt sich überhaupt jede Aufgabenstellung komplett ohne globale Variablen lösen, oder gibt es nun mal Programme, die ohne globale Variablen unmöglich umsetzbar sind?
Ich habe noch kein Programm geschrieben, das globale Variablen benötigt hat, wohl aber von Zeit zu Zeit durchaus den globalen Variablen ähnelnde Alternativen (dafür aber mit definierter Initialisierungsfolge).
Beispielsweise würde ich allgemeine Programmoptionen, die einmalig gelesen werden müssen, aber auf die von mehreren Stellen zugegriffen wird als Singleton umsetzen. Und Singletons sind nur unwesentlich besser als globale Variablen.
Globalisiert schrieb:
(2) Gelten auch lokale static Variablen als 'globale Variablen', also solche, die zwar nur innerhalb einer Funktion bekannt sind, aber ihren Wert beibehalten?
Nein. Falls man wirklich globale Variablen braucht, aber eine geordnete Reihenfolge der Initialisierung will, trickst man aber durchaus mit statics (z.B. eine Funktion die eine Referenz auf eine static liefert die ggf. in dieser Funktion initialisiert wird). Das ist etwa mit den Singletons gleichzusetzen.
Im Gegenteil zu globalen Variablen kannst du hier aber gewisse Probleme reduzieren.
Ich persönlich habe in meiner Programmierzeit mehr Probleme als Vorteile von globalen Variablen (sowie öffentlichen statischen Variablen in Schnittstellen) kennen gelernt.
Daher werde ich selbst wenn ich etwas vergleichbares Bräuchte - was recht selten eintritt, eine der oben genannten Alternativen verwenden. Und selbst da würde ich mir Gedanken machen, ob es wirklich sinnvoll und nötig ist (und möglichst auf wenige reduzieren).
-
Ich implementiere immer meine Settings in einem Singleton
-
Globale Variablen sind nicht schlecht. Zumindest nicht schlechter als alles andere. Der Irrglaube, dass globale variablen schlecht seien rührt von dem Abstraktions- und Komplexitätswahn vieler C++ Programmierer.
Viele C++ Programmierer (oder solche, die sich für die jenigen halten) glauben bis heute, dass man in C keinen sauberen/guten Code schreiben kann, da sie voll und ganz davon überzeugt sind die Weisheit mit dem Löffel gefressen zu haben als sie C++ gelernt haben.Am besten ignoriert man alle Vögel die einem dauernd irgendwas vorschreiben möchten ala "X ist schlecht, Y ist schlechter Stil, Z darfst du nicht".
Allein schon die Tatsache, dass solche Vögel einem dauernd etwas aufzwingen wollen sollte einen skeptisch machen. Alles was Zwang erfordert kann sich selber nicht durchsetzen und daher ist der Verdacht, dass diese Sache schlecht sein könnte, berechtigt.
Fazit: Benutze globale Variablen ruhig weiter wenn du magst. Du wirst schon selber merken, wann globale Variablen nicht mehr gut sind. Aber halte dich von den anderen Vögeln fern, die dir dauernd etwas aufschwatzen wollen. Jeder der meint, die richtige Lösung zu kennen und versucht diese aufzuzwingen hat keine Ahnung. Es gibt nicht DIE OPTIMALE LÖSUNG.
-
Hör nicht auf Dummschwätzer wie "Kenner der Tatsachen". Praktisch jeder erfahrene Programmierer (und jeder gute Lehrer/Professor) wird dir von globalen Variablen abraten, denn diese haben nur Nachteile, welche in dem von mir verlinkten Artikel beschrieben werden.
-
Janjan schrieb:
Hör nicht auf Dummschwätzer wie "Kenner der Tatsachen". Praktisch jeder erfahrene Programmierer (und jeder gute Lehrer/Professor) wird dir von globalen Variablen abraten, denn diese haben nur Nachteile, welche in dem von mir verlinkten Artikel beschrieben werden.
Vielen Dank, du bist das Paradebeispiel. Schon wieder einer der einem etwas aufschwätzen/verbieten will.
Vielleicht wirst du mal geistig reifer und akzeptierst die Tatsache, dass es nicht DIE perfekte Lösung gibt. Vielleicht wirst du auch einmal einsehen, dass du nicht die Weisheit mit dem Löffel gegessen hast. Du glaubst das richtige zu kennen aber Fakt ist, dass du nur das nachplapperst, was du irgendwo ein paar mal aufgeschnappt hast.
Nochmal (was zugleich die Zzusammenfassung meines letzten Postings darstellt): Lieber selber die Erfahrung machen und dann nach den eigenen Vorlieben entscheiden. Nur auf Leute hören, die einem etwas näherbringen wollen; alle Leute, die einem etwas vorschreiben wollen, ignorieren.
-
Son bißchen muß man dem Kenner aber Recht geben, da du seleber Teile des verlinkten Artikels ignorierst.
As with all HeuristicRules, this is not a rule that applies 100% of the time. Code is generally clearer and easier to maintain when it does not use globals, but there are exceptions.
-
Tyrdal schrieb:
Son bißchen muß man dem Kenner aber Recht geben, da du seleber Teile des verlinkten Artikels ignorierst.
As with all HeuristicRules, this is not a rule that applies 100% of the time. Code is generally clearer and easier to maintain when it does not use globals, but there are exceptions.
Das ist aber noch ein sehr weiter Schritt zu:
Kenner der Tatsachen schrieb:
Globale Variablen sind nicht schlecht. Zumindest nicht schlechter als alles andere.
-
wird dir von globalen Variablen abraten, denn diese haben nur Nachteile
Stimmt, aber diese 100% Pauschalisierung kann nicht aus dem Artikel stammen und ist IMO wie jedes Dogma schädlich.
-
Irgendwie muss man halt differenzieren.
Einerseits bringen globale Variablen Probleme mit sich. Daher sollte man Sie möglichst vermeiden. Aber nur weil etwas schlechter Stil ist, es generell abzulehnen ist auch Falsch.
Im endeffekt zählt Kosten-Nutzen. Wenn ich mir 3 h eine Lösung ohne globale Variablen überlegen muss, aber ich nach 10 Minuten eine Lösung mit Globals habe, dann kann man auch mal ein Global verwenden anstatt auf KRampf zu versuchen sowas zu verwenden.
Das gleiche gilt für andere Sachen die "Schlechter Stil" sind wie das verlassen von Schleifen mit break etc. Gerade für Anfänger ist es ratsam so zu Programmieren wie man gerade Lust hat und wie man weiterkommt, anstatt die sauberste und effizienteste Lösung sofort parat zu haben.
-
Fedaykin schrieb:
Im endeffekt zählt Kosten-Nutzen. Wenn ich mir 3 h eine Lösung ohne globale Variablen überlegen muss, aber ich nach 10 Minuten eine Lösung mit Globals habe, dann kann man auch mal ein Global verwenden anstatt auf KRampf zu versuchen sowas zu verwenden.
Das Problem ist aber, dass die Erfahrung lehrt, dass die 10 Minuten Lösung später einmal zu sehr schwer diagnostizierbaren Fehlern führen werden, wenn irgendwann mal unerwartete Seiteneffekte auftreten. Das muss nicht morgen sein, vielleicht erst in ein paar Jahren, wenn andere Entwickler an dem Code arbeiten und der ursprüngliche Programmierer längst weg ist. Und die werden dann sehr viel länger als 3 h an dem Problem sitzen.
Und deswegen ist guter Stil wichtig. Und guter Stil wird dadurch definiert, dass man damit erfahrungsgemäß später wenig Probleme hat. Und im Normalfall ist es auch nicht so schwer, sich daran zu halten: Ich möchte mal den Fall sehen, wo man durch Verwendung von globalen Variablen tatsächlich 2:50 h einspart und die Lösung wie eine Krampf aussieht.
-
Wenn aber heutzutage jede Sekunde bei der Entwicklung zählt und Termine so knapp bemessen werden das man lieber schnell, als sauber programmiert. Ist das ganze kein Wunder.
Zusätzlich ist es auch noch ein unterschied ob ich sowas in einer "Multi-Programmer" umgebung programmiere oder in einen Projekt für mich, wo ich absehe das in 3 Jahren das ganze eh nicht mehr anschaue.
Wie schon gesagt, es kommt auf Kosten-Nutzen an. Dort zählt auch die Zukunftsentwicklung rein.
Meine Beispiele sind rein theoretischer Natur. Bei globalen Variablen sehe ich das ganze auch eher unkritisch. Aber es wird andere Fälle geben wo sowas eher zuschlägt.
Ich möchte auch nicht sagen das man ohne Nachzudenken Globals verwenden sollte, sondern das man selber Abwägen soll, ob Sie jetzt Sinnvoll sind oder nicht. Nicht desto trotz ist es natürlich Sinnvoll zu wissen welche Risiken sie bergen. Wer mit dem Wissen immer noch Globals einsetzt, soll es halt tun.
-
Globale und lokale statische Variablen haben mir in der Vergangenheit die meisten Schmerzen bereitet. Mal keine eine lib nicht nebenläufig verwendet werden (aber es wurde eine Allokation gespart), mal ziehen eigentlich kleine Programmänderungen riesige Refaktorierungsmaßnahmen nach sich (don't - ever - call me, I'll call you!), oder man sucht sich den Wolf, um rauszufinden, welcher Schelm den globalen super pointer in undefinierten Zuständen hinterlässt.
Globale Variablen sind mit ebensolcher Vorsicht zu genießen wie goto. Wenn möglich, vermeiden.
-
Lieber selber die Erfahrung machen und dann nach den eigenen Vorlieben entscheiden. Nur auf Leute hören, die einem etwas näherbringen wollen; alle Leute, die einem etwas vorschreiben wollen, ignorieren.
Auch aus den Fehlern anderer kann gelernt werden. Man muss nicht jeden Fehler selbst machen, das kostet nur unnoetig Zeit und Nerven.
Wenn aber heutzutage jede Sekunde bei der Entwicklung zählt und Termine so knapp bemessen werden das man lieber schnell, als sauber programmiert.
Der groesste Kostenpunkt ist Wartung.