Was haltet ihr von globalen Variablen?



  • hm...wenn ich eine variable global als const definiere ist es ja trotzdem eine globale variable...und was ist daran schlecht?



  • tomf schrieb:

    hm...wenn ich eine variable global als const definiere ist es ja trotzdem eine globale variable...und was ist daran schlecht?

    Es ist zwar eine 'variable' wir sagen dennoch lieber Konstante dazu. Um auszudrücken, dass sie konstant ist.

    In diesem Fall gelten die Argumente natürlich nicht - da alle von 'echten' globalen Variablen ausgehen.

    Aber selbst 'echte' globale Variablen sind nicht immer böse - man soll sich nur vor ihnen in acht nehmen - und sie in keiner / bzw. in so wenig wie möglich der 'bösen' Situationen (siehe Humes Post) verwenden.



  • Unser Lehrer behauptet immer, dass globale Variablen schei... sind!
    Er nennt sie " öffentliche Toiletten" !

    Vielleicht solltest du einen anderen Lehrer fordern, imo ziemlich übertrieben.
    Generell solltest du dir merken, sowenig globale Variablen wie möglich, soviel wie nötig. Leider glauben einige Leute, dass nötig bedeutet: "keine Ahnung wo ich das hinpacken soll".



  • groovemaster2002 schrieb:

    Unser Lehrer behauptet immer, dass globale Variablen schei... sind!
    Er nennt sie " öffentliche Toiletten" !

    Vielleicht solltest du einen anderen Lehrer fordern, imo ziemlich übertrieben.

    Ich finde 'öffentliche Toiletten' geil.
    Schließlich sind sie das ja wirklich. Jeder kann dort seinen Mist ablassen 😉



  • groovemaster2002 schrieb:

    Unser Lehrer behauptet immer, dass globale Variablen schei... sind!
    Er nennt sie " öffentliche Toiletten" !

    Vielleicht solltest du einen anderen Lehrer fordern, imo ziemlich übertrieben.
    Generell solltest du dir merken, sowenig globale Variablen wie möglich, soviel wie nötig. Leider glauben einige Leute, dass nötig bedeutet: "keine Ahnung wo ich das hinpacken soll".

    Wieso? Ich finde die Analogie nicht unpassend. Öffentliche Toiletten sind zu dreckig und eklig, als das man sie gerne oder gar leichtfertig benutzt. Wenn es möglich ist, sollte man dem Ruf der Natur einfach nicht folge leisten und warten bis man zu Hause seine geliebte Ferguson-Toilette aufsuchen kann. Auf der anderen Seite sind öffentliche Toiletten immer noch besser als gar keine. Im Notfall ist eine öffentliche Toilette allemal besser als das Geschäft auf dem Bürgersteig oder gar in Nachbars-Garten.

    Variablen sollten immer so lokal wie möglich sein. Solange es nicht wirklich gute Gründe gibt, sollte eine Variable nicht global sein. Habe ich aber in der Tat gute Gründe für eine globale Variable, dann ist eine globale Variable besser als irgendwelche zweifelhaften Kunstgriffe.



  • HumeSikkins schrieb:

    und warten bis man zu Hause seine geliebte Ferguson-Toilette aufsuchen kann

    Spricht da der Al Bundy Fan aus dir? 😃

    Ob die Analogie passt oder nicht ist mir relativ egal. Für mich klang es halt so, dass man überhaupt keine globalen Variablen benutzen soll. Und das finde ich falsch. Letztendlich sind globale Variablen simpel gesagt auch nichts anderes als lokale Variablen, jedoch mit einem grösseren Scope. Natürlich sind Variablen mit einem kleineren Scope immer vorzuziehen. Wenn man sich einfach an ein paar Restriktionen hält, zB globale Variablen nie in Klassen zu benutzen, dann verlieren globale Variablen schnell ihre "Bösartigkeit".
    Ich will damit nicht sagen, dass ich nur globale Variablen nutze. Im Gegenteil, wenns hochkommt sind das gerademal 4 oder 5. Eigentlich nutze ich sie nur, um einige Sachen vor bzw. nach main() zu machen. Oder wenn keine vernünftige Kon- bzw. Destruktion im Programmfluss möglich ist, und man sich dann notgedrungen manuellen Kon- bzw. Destruktoren ala Init/Exit bedienen muss.
    Jedenfalls sehe ich nicht ein, warum einige Leute immer wieder behaupten, globale Variablen sind böse, und sie damit auf eine Stufe mit goto stellen.
    Wenn ein Programmierer nicht weiss, welche Auswirkungen globale Variablen auf sein Programm haben, dann sollte er es besser lassen. Genauso können Zeiger auch böse sein. 😉



  • Ich verstehe die Problematik, aber sowas wie cout ist dann ja kein Problem oder?
    Schließlich ist cout ja auch global definiert.



  • Mis2com schrieb:

    Ich verstehe die Problematik, aber sowas wie cout ist dann ja kein Problem oder?
    Schließlich ist cout ja auch global definiert.

    ÄÄh nein, cout ist im Namespace std! Es ist ein großer Unterschied wenn du schreibst std::cout anstatt ::cout !



  • HumeSikkins schrieb:

    Funktionen die globale Variablen nutzen sind nicht re-entrant

    Sind nicht was? 😉

    Blue Panther schrieb:

    ÄÄh nein, cout ist im Namespace std! Es ist ein großer Unterschied wenn du schreibst std::cout anstatt ::cout !

    Wo ist denn der große Unterschied? Ich meine, auf so eine Variable trifft dann doch genau das gleiche zu (ich glaube aber, dass man die dann trotzdem global nennt... egal).



  • Saugie schrieb:

    HumeSikkins schrieb:

    Funktionen die globale Variablen nutzen sind nicht re-entrant

    Sind nicht was? 😉

    http://en.wikipedia.org/wiki/Reentrant

    Falls dich der Bindestrich stört, bitte ich vielmals um Verzeihung.

    Wenn man sich einfach an ein paar Restriktionen hält, zB globale Variablen nie in Klassen zu benutzen

    ?

    dann verlieren globale Variablen schnell ihre "Bösartigkeit".

    Es geht hier nicht um Bösartigkeit sondern um negative Auswirkung auf Wartbarkeit, Verständlichkeit, Wiederverwendbarkeit und Erweiterbarkeit von Code. Der Punkt ist schlicht und einfach, dass es für fast jedes Problem eine bessere Lösung als globale Variablen gibt. Schreibt man hingegen nur 1000 Zeilen Programme, die man nur alleine wartet und nie wirklich erweitern muss, dann kann man auch seelenruhig globale Variablen einsetzen. Sogar en masse.

    Jedenfalls sehe ich nicht ein, warum einige Leute immer wieder behaupten, globale Variablen sind böse, und sie damit auf eine Stufe mit goto stellen

    Weder goto noch gloabe Variablen sind inhärent böse. Für beides gibt es aber in der Regel bessere Mittel. Wichtig ist, dass man sowohl die Konsequenzen, als auch die Alternativen kennt und versteht. Nur so kann man eine fundierte Entscheidung treffen die über ein simples "du bist böse" hinaus geht.



  • groovemaster2002 schrieb:

    Letztendlich sind globale Variablen simpel gesagt auch nichts anderes als lokale Variablen, jedoch mit einem grösseren Scope.

    <IMHO>
    Jein. Um das sagen zu können müsste es lokale Funktionen geben. Sonst kann man die Scopes nicht so abstufen, dass globale Variablen tatsächlich zu einem Spezialfall werden. Das würde dann wohl so aussehen:

    void fun1() {
      int a;
      void fun2() {
        cout << a;
      }
      a = 23;
      fun2(); // gibt 23 aus
    }
    

    Gibts aber in C++ nicht.

    </IMHO>



  • HumeSikkins schrieb:

    Zitat:
    dann verlieren globale Variablen schnell ihre "Bösartigkeit".

    Es geht hier nicht um Bösartigkeit sondern um negative Auswirkung auf Wartbarkeit, Verständlichkeit, Wiederverwendbarkeit und Erweiterbarkeit von Code.

    Genau das hab ich ja mit "Bösartigkeit" gemeint.

    HumeSikkins schrieb:

    Weder goto noch gloabe Variablen sind inhärent böse. Für beides gibt es aber in der Regel bessere Mittel.

    Geb ich dir absolut recht. Nur leider hat man nicht immer die Zeit diese besseren Mittel auszuloten.



  • Das mit dem namespace habe ich jetzt mal vorausgesetzt. 🙄
    Ansonsten ist cout ja innerhalb des namespaces global, aber was ändert das groß?

    MfG MAV


Anmelden zum Antworten