Was ist mühsamer, als an jedem möglichen Ausstiegspunkt einer komplexen Methode immer wieder denselben Aufräumcode zu schreiben?
Ob Sie nun das Schließen von Dokumenten verwalten, prozessübergreifende Flags zurücksetzen oder Ressourcen freigeben – um sicherzustellen, dass Ihre Aufräumaufgaben einwandfrei ausgeführt werden – ganz gleich, wie oder wo Ihre Funktion beendet wird –, war schon immer eine sorgfältige strukturelle Planung erforderlich. Wenn eine Methode unerwartet abgebrochen wird oder auf einen vorzeitigen Return trifft, kann das Vergessen einer einzigen Aufräumzeile zu Speicherlecks oder gesperrten Ressourcen führen.
Ab 4D 21 R4 gehören diese Sorgen der Vergangenheit an. Begrüßen Sie den neuen Befehl „defer “: einen leistungsstarken, modernen Befehl zur Steuerung des Programmablaufs, der Ihren 4D-Code übersichtlicher, sicherer und wesentlich eleganter macht.
Schauen wir uns einmal an, wie er funktioniert und wie er die Art und Weise, wie Sie 4D-Code schreiben, verändern wird!
Was ist der Befehl „defer“?
Das Konzept ist wunderbar einfach: Mit dem Befehl „defer“ können Sie einen Ausdruck stapeln, der automatisch erst ausgeführt wird, wenn die aktuelle Methode oder Funktion beendet ist.
Wenn der Ausführungsfluss auf eine „defer“-Anweisung trifft, wird der Ausdruck nicht sofort ausgeführt. Stattdessen wird er sicher auf einen speziellen internen„Deferred Stack“ verschoben.
Die Magie entfaltet sich, wenn Ihre Methode oder Funktion beendet wird. Unabhängig davon, wie sie abgeschlossen wird, holt 4D automatisch alle Ausdrücke aus dem Deferred-Stack und führt sie in LIFO-Reihenfolge (Last In, First Out) aus.
Diese garantierte Ausführung wird in allen Beendigungsszenarien ausgelöst:
- Normale Beendigung: Wenn der Ausführungsfluss auf natürliche Weise endet.
- Vorzeitiger Abbruch: Wenn eine Return- Anweisung gefunden und verarbeitet wird.
- Unerwartete Abbrüche: Selbst wenn ein schwerwiegender Fehler auftritt und der Benutzer den Abbruch bestätigt, stellt 4D sicher, dass Ihre aufgeschobenen Ausdrücke ausgeführt werden, um die Umgebung sicher zu bereinigen.
Praktische Anwendungsfälle
Um die Leistungsfähigkeit von defer zu veranschaulichen, betrachten wir zwei klassische Beispiele, in denen dieser Befehl Ihre Entwicklung radikal vereinfacht.
Fehlerfreies Ressourcenmanagement
Beim Umgang mit externen Ressourcen wie XML-Bäumen, Datenbanktransaktionen oder Ähnlichem müssen Sie sicherstellen, dass diese ordnungsgemäß geschlossen werden, um Speicherlecks zu vermeiden. Mit defer können Sie Ihren Zuweisungs- und Ihren Bereinigungscode nebeneinander platzieren:
var $root:
:= ("rootName")
( ( ))
Text
$rootDOM Create XML Ref
// Ensure the XML tree will be closed and memory freed, no matter what happens next!
deferDOM CLOSE XML$root
// Do something with the $root tree...
Wiederherstellung von Umgebungs- und Datenbankzuständen
Manchmal muss Ihr Code vorübergehend einen globalen Datenbankparameter oder eine Umgebungseinstellung ändern (z. B. um für einen bestimmten komplexen Vorgang eine ausführliche Diagnoseprotokollierung zu aktivieren) und sicherstellen, dass dieser anschließend auf seinen ursprünglichen Wert zurückgesetzt wird. Der Befehl `defer` bewältigt diese Zustandswiederherstellung hervorragend:
// Get the current state of diagnostic log recording
$logRecording:=Get database parameter(Diagnostic log recording)
// Temporarily enable it for this specific process/method
SET DATABASE PARAMETER(Diagnostic log recording; 1)
// Guarantee the original state is restored as soon as the method/function exits!
defer(SET DATABASE PARAMETER(Diagnostic log recording; $logRecording))
// Execute your complex or heavy operations here...
Sichere Ausführung durch Design
Wir haben diese Funktion mit Blick auf Sicherheit und Robustheit entwickelt. Sie müssen sich keine Sorgen machen, dass eine fehlgeschlagene Bereinigungsaufgabe den Beendigungsablauf Ihrer Anwendung unterbricht.
Wenn ein vom Deferred-Stack ausgeführter Ausdruck einen Fehler auslöst, fängt 4D diesen automatisch im Hintergrund ab, ohne dass es zu einer Unterbrechung kommt. Die Ausführung des restlichen Stacks wird nahtlos fortgesetzt, genau so, als ob der Ausdruck innerhalb eines impliziten try-Blocks ausgeführt worden wäre.
Um Ihren Code übersichtlich zu halten und Endlosschleifen oder unvorhersehbares Verhalten zu vermeiden, haben wir außerdem einige Sicherheitsregeln implementiert:
- Keine Verschachtelung: Wenn ein verzögerter Ausdruck andere defer -Anweisungen enthält, werden diese verschachtelten Ausdrücke einfach ignoriert.
- Keine inneren Returns: Wenn eine Return-Anweisung versehentlich innerhalb eines verzögerten Ausdrucks aufgerufen wird, wird sie nicht ausgeführt.
Eine intelligente Kontextbewertung
Wenn Ihre verzögerten Ausdrücke ganz am Ende einer Methode/Funktion ausgeführt werden, behandelt 4D den Variablenkontext nahtlos: Standard-Lokale Variablen behalten die Werte, die sie genau in dem Moment hatten, als sie verzögert wurden, während Prozessvariablen, lokale Objektvariablen und klassische Datensätze ihren Endzustand bei Abschluss der Methode/Funktion widerspiegeln.
Zusammenfassung
Der ab 4D 21 R4 verfügbare Befehl „defer“ ist mehr als nur eine Annehmlichkeit; er ist eine strukturelle Verbesserung für Ihren Entwicklungsworkflow. Indem Sie Initialisierung und Bereinigung am Anfang Ihrer Logik zusammenfassen, wird Ihr Code lesbarer, wartungsfreundlicher und widerstandsfähiger gegenüber unerwarteten Laufzeitabbrüchen.
Sind Sie bereit, sauberere und sicherere 4D-Anwendungen zu schreiben? Teilen Sie uns Ihre Meinung im 4D-Forum mit!
Für diesen Beitrag sind derzeit keine Kommentare verfügbar.