Gemeinsame Klassen

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.

Nicolas Brachfogel
Product Owner & Senior Developer - Nicolas Brachfogel kam 2017 als Senior Developer (4D Server und Netzwerke) zu 4D. Als Product Owner, der die Freigabe von Apple Silicon verwaltet, ist er für das Schreiben von User Stories und deren Umsetzung in funktionale Spezifikationen zuständig und stellt sicher, dass die Implementierungen der Funktionen den Kundenanforderungen entsprechen. Nicolas ist Absolvent des Institut Supérieur d'Informatique Appliquée (INSIA) und begann seine Karriere als Softwareentwickler im Jahr 2001. Nachdem er mehrere Jahre in Java und C++ programmiert hatte, spezialisierte er sich auf die Client-Server-Entwicklung für Videospielunternehmen. Als Server-Entwickler/Architekt arbeitete er erfolgreich an den Server-Architekturen vieler Spiele (Dofus Arena, Drakerz, Trivial Pursuit Go!).