Globale Variablen vermeiden

    • Offizieller Beitrag

    Da ich das Thema gerade in einem Thread wieder entdeckt hatte hier mal ein Weg, wie man Variablen in lokalem Namensraum ablegen kann und doch Globalen Zugriff erlangt.
    Inwiefern es wirklich sinnvoll ist Globale Variablen zu meiden sei mal völlig dahingestellt. Dazu wurden schon Diskussionen ergebnisoffen im EN-Forum geführt.

    Das Bsp. ist denke ich selbsterklärend:

    Spoiler anzeigen
    [autoit]

    _A(2,3) ; = Summe + 6
    _A(4,4) ; = Summe + 16
    _A(5,4) ; = Summe + 20
    ConsoleWrite('Summe: ' & _ManageVars('Summe') & @LF)
    _B(5,3) ; = Summe + 2
    _B(12,3) ; = Summe + 9
    ConsoleWrite('Summe: ' & _ManageVars('Summe') & @LF)

    [/autoit] [autoit][/autoit] [autoit]

    Func _A($a, $b)
    Local $Summe = _ManageVars('Summe') ; == Wert abfragen
    If @error Then ; == $Summe wurde noch nicht verwendet - noch ohne Wert
    _ManageVars('Summe', False, $a * $b) ; == Wert setzen
    Else
    _ManageVars('Summe', False, $Summe + $a * $b)
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _B($a, $b)
    Local $Summe = _ManageVars('Summe')
    If @error Then
    _ManageVars('Summe', False, $a - $b)
    Else
    _ManageVars('Summe', False, $Summe + ($a - $b))
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Function Name....: _ManageVars
    ; Description......: Verwaltung von global anwendbaren Variablen in Lokalem Namespace
    ; Parameter(s).....: $_sVar Variablenname (mit oder ohne "$")
    ; .................: $_fGet "True" (Standard) fragt Wert ab, "False" um Wert zu setzen
    ; .................: $_vVal Wenn Wert gesetzt wird, der Variablenwert
    ; Return Value(s)..: (nur bei Get) Erfolg Der Variablenwert
    ; .................: Fehler 0 @error=1 angefragte Variable noch nicht hinterlegt
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _ManageVars($_sVar, $_fGet=True, $_vVal=0)
    Local Static $oVars = ObjCreate("Scripting.Dictionary")
    If $_fGet Then
    If $oVars.Exists($_sVar) Then
    Return $oVars.Item($_sVar)
    Else
    Return SetError(1,0,0)
    EndIf
    Else
    If $oVars.Exists($_sVar) Then
    $oVars.Item($_sVar) = $_vVal
    Else
    $oVars.Add($_sVar, $_vVal)
    EndIf
    EndIf
    EndFunc ;==>_ManageVars

    [/autoit]