Möchten Sie eine vereinfachte Methode zur Verwendung von gemeinsam genutzten Objekten, die der klassischen Objektsyntax folgt und bei Bedarf automatisch use/end use aufruft?
Schnallen Sie sich an, hier kommen die Shared Classes!
Gemeinsame Klassen erstellen und verwalten
Mit 4D 20 R5 haben wir ein neues Konzept eingeführt: Shared Classes.
Gemeinsame Klassen können nur zur Erstellung gemeinsamer Objekte verwendet werden und vereinfachen somit deren Verwendung. Um eine gemeinsam genutzte Klasse zu erstellen, müssen Sie lediglich das Schlüsselwort shared in den Konstruktor einfügen:
//class SharedClass
shared Class constructor()
Shared Classes können nicht zur Erstellung von Standardobjekten verwendet werden: Jedes Mal, wenn Sie new() aufrufen, um ein neues Objekt dieser Klasse zu erstellen, wird es ein Shared Object sein.
Erweiterung auf Klassenfunktionen
Das Schlüsselwort shared kann auch für Klassenfunktionen verwendet werden, was bedeutet, dass diese Funktion das Objekt verändert. Es besteht keine Notwendigkeit, use und end use innerhalb der Funktion aufzurufen, da sie automatisch aufgerufen werden, wenn die Funktion aufgerufen und beendet wird. Dies gilt natürlich auch für den Singleton-Konstruktor.
shared Function myFunction()
This.attribute:="whatever"
Natürlich sollten Sie vorsichtig sein, wenn Sie das Schlüsselwort shared für Funktionen verwenden, die es nicht benötigen, um zu vermeiden, dass andere Prozesse, die versuchen, das Objekt zu verwenden, blockiert werden.
Die korrekte Verwendung von gemeinsam genutzten Klassen und Funktionen sollte es Ihnen ermöglichen, Ihre gemeinsam genutzten Objekte wie normale Objekte zu behandeln, was Ihren Code vereinfacht.
Überlegungen zur Vererbung
Ein letzter Punkt, auf den Sie achten müssen, ist, dass nicht gemeinsam genutzte Klassen von gemeinsam genutzten Klassen erben können, aber gemeinsam genutzte Klassen können nicht von nicht gemeinsam genutzten Klassen erben. Planen Sie also Ihr Objektmodell entsprechend.
Beispiel
Angenommen, Sie müssen eine lange Berechnung durchführen und würden es vorziehen, einen Worker zu verwenden, um zu vermeiden, dass Ihre wichtigen Prozesse blockiert werden. Aber natürlich müssen Sie das Ergebnis der Berechnung irgendwann abrufen. Lassen Sie uns diese CalculationResult-Klasse verwenden:
// class CalculationResult
shared Class constructor()
This.isFinished:=False
Function makeCalculation()
...
This.finished:=True
shared Function set finished($finished : Boolean)
This.isFinished:=$finished
shared Function get finished()->$finished : Boolean
$finished:=This.isFinished
Um sie zu verwenden, können Sie einfach tun:
$calculation:=cs.CalculationResult.new()
CALL WORKER("AnyWorker"; Formula($calculation.makeCalculation()))
While (Not($calculation.isFinished))
//Code that will be executed while the calculation is in progress
End while
Ich hoffe, die gemeinsam genutzten Klassen helfen Ihnen, gemeinsam genutzte Objekte in Ihrer Anwendung zu verwenden. Wenn Sie Fragen haben, zögern Sie nicht, diese im 4D Forum zu stellen.