LiveCode-Global?

1 Antwort

Vom Beitragsersteller als hilfreich ausgezeichnet

Grundsätzlich wird bei Variablen zwischen verschiedenen Gültigkeitsbereichen unterschieden, in denen sie existieren können.

a) Lokale Variablen

Sie existieren nur in dem Bereich (Handler- oder Skriptebene), in dem sie deklariert wurden.

In diesem Beispiel:

on doSomething
  local counter
  put 0 into counter

  repeat with index = 1 to 100
    add 1 to counter
  end repeat
end doSomething

wird eine lokale Variable namens counter innerhalb des Handlers doSomething angelegt. Das heißt, sie ist auch nur innerhalb dieses Handlers bekannt. Sobald der Code im Handler abgearbeitet wurde, wird die Variable wieder aus dem Speicher entfernt.

Würdest du sie hingegen außerhalb des Handlers anlegen, könntest du sie auch in anderen Handlers benutzen. Sie wäre also im gesamten Skript bekannt.

Beispiel:

local counter

on doSomething
  put 1 into counter
end doSomething

on doSomethingElse
  put 2 into counter
end doSomethingElse

Beide Handler würden bei jeweiliger Ausführung dieselbe Variable im Wert verändern.

Sofern du nicht im strict mode arbeitest, kannst du bei Variablen innerhalb eines Handlers übrigens auch die Deklaration via local weglassen. Allerdings ist es meines Erachtens besser für die Lesbarkeit des Skripts, lokale Variablen immer explizit zu deklarieren. Es ist schneller ersichtlich, in welchem Gültigkeitsbereich sie einzuordnen sind.

b) Globale Variablen

Mit dem Schlüsselwort global kennzeichnest du eine Variable als global verfügbar aus. Auf sie kann also in jedem Skript deiner Anwendung zugegriffen werden.

Im folgenden Beispiel würde die counter-Variable in zwei Skripten genutzt werden.

Skript 1:

global counter

on doSomething
  put 1 into counter
end doSomething

Skript 2:

global counter

on doSomethingElse
  put 2 into counter
end doSomethingElse

Hierbei muss beachtet werden, dass du die Variable immer erst für das jeweilige Skript bekannt machen musst. Wenn das Programm bei Ausführung auf das global-Schlüsselwort stößt, weiß es, dass es erst einmal in seiner internen Liste globaler Variablen nachschauen sollte. Wenn die Variable dort nicht gefunden wird, wird eine neue Variable erstellt und intern vermerkt. Wird sie hingegen gefunden, weiß das Programm, dass es nachfolgend mit dem Wert der bereits angelegten globalen Variable weiterarbeiten soll.

In der Praxisanwendung würde ich dir empfehlen, stets eher restriktiv zu arbeiten. Erstelle Variablen nur für den jeweiligen Gültigkeitsbereich, in dem du sie auch wirklich benötigst. Im besten Fall gelingt ein weitestgehend modularer Aufbau (das heißt, jedes Skript ist funktional unabhängig von anderen Skripten und könnte daher ebenso unabhängig getestet werden).

Bei ausschweifender Nutzung globaler Variablen hättest du den Nachteil, immer innerhalb des gesamten Projekts darauf achten zu müssen, einzigartige Variablennamen zu vergeben. Umso größer ein Projekt wird, umso schwerer wird es zudem, einen Überblick darüber zu behalten, wer/wie/wo auf deine globalen Variablen zugreift und sie manipuliert. Deine Skripte wären unüberschaubar verdrahtet.

Wenn du Werte hin- und herreichen möchtest, sind (Virtual) Custom Properties besser geeignet. Das sei an dieser Stelle aber nur ein Ausblick.