Genug der preliminarischen Zorns: Der Fehler heißt: Globale Variablen nutzen, ohne die zwingende Notwendigkeit dazu zu haben.
Diejenigen, die seit Jahren "sauber" programmieren, mögen jetzt bitte wegschauen. Und diejenigen, die das im folgende Beschriebene tun, mögen ihren Programmierstil bitte ändern. Und der ersten Gruppe sei gesagt: Auch wenn Ihr's nicht glaubt, die in der zweiten Gruppe san die mehran.
Also. Grundkurs Programmierung. Was ist eine globale Variable? Eine globale Variable ist eine, die im ganzen Kontext eines Programmskripts verändert und abgerufen werden kann. Vulgo: Eine Variable, die oben steht, in der declaration-Section, außerhalb einer Funktion.
Um einen ganzen Haufen globale Variablen kommt man in Baan leider nicht rum. Die typische Deklaration von Tabellen am Anfang sind genau genommen globale Variablen (sie definieren eine Variable, die so heißt wie die Tabelle, den sog. Record-Pointer). Externe Variablen, die auf Forms oder Reports benötigt werden, sind ebenfalls zwingend global. Dann gibt's noch den Fall größerer Datenstrukturen, die man mangels komplexer Datentypen in der Regel über global definierte Arrays abzubilden hat.
Niemals aber, liebe Leute, niemals aber braucht man globale Variablen, um einen Bearbeitungszustand von einer Funktion an eine andere Funktion durchzureichen.
Also, warum dann um Himmels willen finde ich in 90% aller Anpassungen und Addons solche Konstrukte:
|Mein Programm:
declaration:
table txymmm471
domain tcyesno weiter.ok
functions:
function tu.was () {
select xymmm471.*
from xymmm471
order by xymmm471._index1
selectdo
tu.was.anderes ()
if weiter.ok = tcyesno.yes then
...
endif
endselect
}
function tu.was.anderes () {
....
if irgendwas then
weiter.ok = true
endif
}
Das große Problem bei diesen Konstrukten ist, dass sie bei jedem nicht-trivialen Programm völlig unübersichtlich werden. Jemand anderes, der den Programmcode ankucken muss, blickt absolut nicht mehr durch, wo die Bedingung ist,von der die Ausführung eines bestimmten Programmteils abhängt. Weil jede beliebige Funktion im Programm die globale Variable ändern kann, sind zudem Fehler im wahrsten Sinne vorprogrammiert.
Funktionen haben Rückgabewerte. In Baan 3GL/4GL sogar mehr als einen, weil man Parameter als "Referenz" übergeben kann. Eine Funktion sollte mit ihrer Umgebung immer nur über ihre Ein- und Ausgabeparameter kommunizieren, und niemals nicht irgendwelche Dinge "außerhalb" ihrer eigenen kleinen Welt ändern. Das lässt sich nicht immer durchhalten - gerade Tabellen sind nunmal grundsätzlich global. Aber Berechnungsergebnisse und vor allem ein Rückgabestatus müssen das eben nicht sein.
Obiges Beispiel schreibt Ihr also bitte in Zukunft wie folgt:
|Mein viel schöneres Programm:
declaration:
table txymmm471
functions:
select xymmm471.*
from xymmm471
order by xymmm471._index1
selectdo
if tu.was.anderes () then
...
endif
endselect
}
function domain tcbool tu.was.anderes () {
....
if irgendwas then
return (true)
endif
return (false)
}
Also: Die Funktion tu.was.anderes wird aufgerufen, und sie gibt dem
aufrufenden if-then-Block einen Wert zurück, den dieser auswertet.
Keine Kommentare:
Kommentar veröffentlichen