Autor Thema: Zugriff auf globale Variablen  (Gelesen 3424 mal)

Offline jr

  • Senior Mitglied
  • ****
  • Beiträge: 260
  • Geschlecht: Männlich
  • Bitte keine eierlegenden Wollmilchsäue...
    • Homepage
Zugriff auf globale Variablen
« am: 24.06.09 - 11:14:02 »
Hallo zusammen,

heute habe ich eine etwas ungewöhnliche Frage: Ich möchte auf eine Variable zugreifen, die manchmal da ist und manchmal nicht...  ;)

Also das Problem ist folgedes: Ich habe eine normale Lotus-Script-Funktion, eventuell in einer Klasse, kann aber auch Standalone sein. Diese Funktion ist in einer Bibliothek hinterlegt und kann normal benutzt werden. Unter gewissen Umständen wird die Funktion aber auch innerhalb einer Befehlsfolge eines Execute(...) ausgeführt.

Beispiel einer Funktion in Bibliothek "Lib":
Code
Sub Test()
   Print "Zwei"
End Sub

"Normale" Benutzung:
Code
Use "Lib"
Print "Eins"
Call Test()
Print "Drei"

Execute-Benutzung in einem komplett anderen Modul:
Code
frml = {Use "Lib" : Print "Eins" : Call Test() : Print "Zwei"}
Execute(frml)

Ich hoffe, ich konnte ein wenig verständlich machen was ich meine. Nun gibt es in der Execute-Umgebung z. b. eine globale Variable curLog, also ein Protokollierungsobjekt, und die Funktion kann auf das globale Objekt zugreifen, z. B. Call curLog.Error("Fehlerausgabe").

Beispiel:
Code
frml = { Print "Eins" : Call Test() : Call curLog.Error("Jetzt gibt es Fehler") : Print "Zwei" }
Execute(frml)

Das funktioniert auch einwandfrei. Meine Frage ist nun die: Kann ich auch innerhalb meiner Funktion Test(), die ja in einem ganz anderen Kontext programmiert ist, auf diese globale Variable zugreifen, wenn sie da ist? Wenn ich die Funktion normal aufrufe, dann fehlt diese Variable, weil sie nur im Kontext der Execute-Umgebung zur Verfügung steht. Was ich bräuchte, wäre also so ewas wie

Code
If (IsAvailable(curLog)) Then Call curLog.Error("...")

Ist so etwas möglich? Oder hat jemand eine andere Idee?



Ich hoffe, ich konnte einigermaßen klar machen, was ich möchte - ist nicht ganz einfach zu erklären...

Im Voraus vielen Dank für Eure Antworten.

Gruß,

Joachim

Wer in den Fußstapfen eines anderen geht, hinterlässt keine Spuren und kommt nie als Erster an.

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Zugriff auf globale Variablen
« Antwort #1 am: 24.06.09 - 11:56:11 »
Solang du nicht Option Declare einsetzt, könnte das funktionieren. Irgendwie.
Nichts gegen nicht-streng typisierte Sprachen grundsätzlich, in Lotus Script benutzt aber die Mehrheit Option Declare. Ohne dass ich das besonders päpstlich sehe, Option Declare beistzt Vor- und Nachteile. Insgesamt benutzen es aber die meisten.

Globale Variablen führen eigentlich immer zu schwer zu verstehenden Code. Und wenn du dirs genau überlegst kannst du die auch in diesem Fall irgendwie ersetzen. Schreib halt in sämtliche Funktionen oder Methoden die Variable als zusätzlichen Parameter und erzeuge sie als lokale Variable in der aufrufenden Funktion. Mag zwar Stoff für einen sehr langweiligen Nachmittag sein. Es lohnt sich aber.

Wenn später mal irgendwann jemand dein Projekt übernimmt, wird er in Funktion a eine Variable entdecken, die in Funktion b von Skript-Bibliothek 3 von 14 gesetzt worden ist. Definiert ist die globale Variable in Bibliothek 5 von 14.

Zwischendurch hat dann noch ein Azubi ein bischen in dem Projekt rumprogrammiert. Er hat den tollen Trick mit den globalen Variablen in Skriptbibliotheken entdeckt. Weil das erstmal so einfach erschien, hat er 4 zusätzliche solcher globalen Variablen erzeugt.

Irgendwann kommt dann ein junger Projektmanager, der irgendwo gelesen hat, dass globale Variablen schlecht sind. Er nimmt die häufigen Probleme mit globalen Variablen zum Anlaß, Budget für ein 6 monatiges Projekt zum Aufsetzen von Entwicklungsrichtlinien zu verlangen. Da schreibt er dann in schönsten Informatiker-Deutsch jeden Tag von 9 bis 17:30 Uhr vor sich hin und hat von sich den Eindruck, "strategische Arbeit" zu leisten. Mit einem sanften Lächeln übersieht er den Text des heutigen Tages. Es wird das letzte Mal sein, dass dieser Text gelesen wird.

STOPPE DEN WAHNSINN, SOLANGE DU NOCH KANNST.
« Letzte Änderung: 24.06.09 - 12:16:34 von Pitiyankee »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline jr

  • Senior Mitglied
  • ****
  • Beiträge: 260
  • Geschlecht: Männlich
  • Bitte keine eierlegenden Wollmilchsäue...
    • Homepage
Re: Zugriff auf globale Variablen
« Antwort #2 am: 24.06.09 - 12:22:12 »
Hallo,

lol - danke für Deine Antwort. Ein echtes Horrorszenario...  ;D

Option Declare benutze ich immer, schon aus Sicherheitsgründen, falls man sich mal verschreibt.
Das mit den globalen Varialben stimmt natürlich, es ist sehr unschön und mit einem Parameter könnte man das ganze vielleicht umgehen. Das globale Protokollierungsobjekt brauche ich aber trotzdem, weil es an Dutzenden Stellen benutzt wird und immer das gleiche Objekt benutzt werden soll. Aber auch das könnte vermutlich anders gelöst werden.

Es war halt mal so eine Idee und ich wollte eigentlich nur wissen, ob so etwas prinzipiell möglich ist. Aber wahrscheinlich ist die Parameter-Variante mit "Is Nothing"-Prüfung doch sinnvoller.

Nochmals Danke,

Joachim
Wer in den Fußstapfen eines anderen geht, hinterlässt keine Spuren und kommt nie als Erster an.

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Zugriff auf globale Variablen
« Antwort #3 am: 24.06.09 - 14:57:49 »
<blockquote>
Aber auch das könnte vermutlich anders gelöst werden.
</blockquote>
Ich würd nach Alternativen suchen.

Zumindest alle globalen Variablen in EINE Skriptbibliothek auslagern und die dann in den Skript-Bibliotheken, die diese globale Variable nutzen, inkludieren. Aber auch das hat Probleme, da Lotus Script nicht besonders gut ist beim Check auf doppelt eingeladene Skriptbibliotheken. Das hat negative Auswirkungen auf die Performance.

Lib 3 von 14 inkludiert Lib 14 von 14 (die mit den globalen Variablen)
Lib 9 von 14 inkludiert Lib 14 von 14.

Agent a inkludiert Lib 3 und Lib 9. Die Skriptbibliothek 14 wird dann möglicherweise 2x geladen. Ok. Solange man da keine Inkludierungskreise bildet (Lib 3 inkludiert 9. 9 inkludiert 14. 14 inkludiert 3), ist das nicht so schlimm. Inkludierungs-Kreise können katastrophale Folgen haben. Ich habs jedenfalls mal erlebt, dass da der Kreis mehrfach geladen wurde.

Globale Variablen in Skript-Bibliotheken ist wirklich ernsthaft ein Maintainability Problem. 




Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline jo@chim

  • Aktives Mitglied
  • ***
  • Beiträge: 246
  • Geschlecht: Männlich
Re: Zugriff auf globale Variablen
« Antwort #4 am: 30.06.09 - 09:53:54 »
Irgendwann kommt dann ein junger Projektmanager, der irgendwo gelesen hat, dass globale Variablen schlecht sind.
*lol* Den kenn ich, glaube ich... schöne Geschichte, direkt aus der dritten Entwickler-Vorhölle...
Gruss,
Achim
-------------------
IBM Certified Advanced Application Developer Lotus Notes and Domino 7

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz