Globale Variable vermeiden. Methoden?

  • Hey Leute,

    ich habe mal eine prinzipielle Frage zu den Möglichkeiten globale Variablen zu vermeiden, wenn ich mir UDF erstelle. Bei Variablen, deren Wert dauerhaft verfügbar sein soll, habe ich schon einige Male mit einer Local Static Variable gearbeitet. Dabei wird immer eine Funktion mit Parametern aufgerufen, in der dann die jeweilige Routine für den Parameter ausgeführt wird. Ich habe gerade wieder darüber nachgedacht einige Skripte anzupassen und möchte nun aber vorher klären, ob das so überhaupt sinnvoll ist.
    Hier mal ein Bsp. dass ich auch verwende.

    Das HotKeySet-Beispiel aus der Hilfe zum Pausieren eines Programmablaufs

    Spoiler anzeigen


    Hier die Variante mit Local Static $g_bPaused statt Global $g_bPaused

    Spoiler anzeigen

    Hat diese Methode neben dem erhöhten Aufwand größere Nachteile oder ist gar falsch?
    Kennt ihr bessere Alternativen?

    Grüße autoiter

    • Offizieller Beitrag

    Zu umständlich!
    Einfach das Beispiel aus der Hilfe auf Local static umbauen:

  • Hihi, ja das ist deutlich eleganter :D
    Ich habe das einfach nach meinem Schema F gemacht, wenn ich aus verschiedenen Funktionen einen Status einer Variable oder Arraywertes auslesen will.
    Aber prinzipiell Ok?

    Grüße autoiter

    • Offizieller Beitrag

    Prinzipiell ist das ok, vor allem, wenn Du noch Parameter uebergeben willst (geht ja mit HotKeySet nicht).

    Wobei ich persönlich finde, dass man es mit dem vermeiden von globalen Variablen auch übertreiben kann.
    Natürlich sollten globale Variablen in UDFs nicht $i, $x, $y oder auch $iWidth oder so heißen, das führt zwangsläufig zu Problemen, aber wenn man die globalen Variablen zum Beispiel $g_iUDFnameWidth nennt, dann dürfte das kaum zu Namenskollisionen führen.
    Und wenn man dann die globalen Variablen oben in der UDF gut sichtbar deklariert und kommentiert, dann kann man sich beim verwenden der UDF auch gut darauf einstellen.
    Mir ist das lieber, als "wilde" Konstruktionen, die versuchen globale Variablen zu umgehen und damit den Code unleserlicher machen.
    Wie gesagt, ist das meine persönliche Meinung dazu.

  • Danke dir @Oscar für die Einschätzung. Ja, muss ich mir überlegen, ob ich meinem Spleen nachgebe und auf Teufel komm raus globale Variablen vermeide, oder ob ich mich an deine geschilderte Strategie halte. Schneller umgesetzt ist das allemal.

    Grüße autoiter

  • Hey vielen Dank @BugFix,
    das finde ich super. Vor allem bei mehreren Variablen wird das sicher viel kompakter. So etwas habe ich bisher mit unterschiedlichen Funktionen und jeweils einem Array gemacht. Da kam dann so etwas heraus:

    Spoiler anzeigen


    Ich werde deine Variante mal anwenden und sehen, wie mir das praktisch gefällt. Scripting.Dictionary gehört zu meinem passiven Wortschatz. Selbst aktiv angelegt und benutzt, habe ich noch keines..

    Grüße autoiter