Das Auftauchen von Klassen in der 4D Entwicklungsumgebung hat die Programmierung moderner und leichter skalierbar gemacht. Klassen ermöglichen die Definition von Eigenschaften und Funktionen und unterstützen auch die Vererbung.
In Ihrer Anwendung haben Sie wahrscheinlich eine Klasse zur Verwaltung von wissenschaftlichen oder finanziellen Daten. Nehmen wir das Beispiel der Finanzdaten. Angenommen, Sie haben Funktionen zur Berechnung von Steuern erstellt. Wenn Sie auch mehrere Länder verwalten, haben Sie vielleicht Vererbung eingesetzt, um die verschiedenen Regeln zu verwalten. Wenn der Benutzer jedoch eines der in der Formel verwendeten Attribute ändert, müssen Sie dieses Ereignis verwalten, um das Ergebnis zu aktualisieren.
Mit 4D v19 R3 können Sie diesen Prozess dank der berechneten Eigenschaften vereinfachen: Sie können eine Get- und Set-Funktion für Ihre berechnete Eigenschaft definieren, und wenn Sie Ihre Eigenschaft zu einem Listenfeld hinzufügen, wird alles automatisch von 4D gehandhabt. Keine Geschäftslogik mehr in Ihrer Benutzeroberfläche.
HDI Berechnete Eigenschaften
Definition und Berechnungen
Um die Leistungsfähigkeit dieses Konzepts zu erklären, wollen wir es so einfach wie möglich machen und mit einem konkreten Beispiel beginnen:
Eine „Rectangle“-Klasse enthält zwei Attribute, width and height, und könnte Funktionen wie getSurface() und getPerimeter(), enthalten, die möglicherweise verwendet werden können.
Wäre es nicht besser, wenn surface und perimeter als reguläre Eigenschaften betrachtet würden, genau wie die anderen? Eigenschaften, die gelesen und möglicherweise geändert werden können? Und die anderen Eigenschaften, von denen sie abhängen, könnten ebenfalls automatisch geändert werden. Nun, dank der berechneten Eigenschaften ist das jetzt möglich.
Zauberei!
Hier sind zwei einfache Beispiele. In beiden Fällen können alle Attribute eingegeben werden.
Wenn Sie die width oder height ändern, werden die perimeters und surfaces neu berechnet. Umgekehrt gilt das Gleiche: Ändern Sie surface oder perimeter,, ändern sich widths und heights entsprechend.

Dies funktioniert auch innerhalb von Listenfeldern! Diese können weiterhin nach jeder Spalte sortiert werden!
Wo liegt die Magie?
In beiden Fällen gibt es kein Skript hinter den Kulissen! Alle Berechnungen werden einmalig in der Klasse Rectangle definiert! Ein großer Vorteil: Wenn Sie weitere Formulare mit diesen Attributen benötigen, brauchen Sie keinen Code zu schreiben (wie oben).
Schauen wir uns an, wie das gemacht wird!
Zugriff auf COMPUTED-Eigenschaften
GET
Mit der ersten Funktion, „get“, können Sie festlegen, wie die Eigenschaft berechnet wird. Zu diesem Zweck muss sie das Ergebnis der Berechnung zurückgeben.
Diese Funktion ist die einzige, die obligatorisch ist und durch ihr bloßes Vorhandensein das Vorhandensein der berechneten Eigenschaft und die Möglichkeit, sie zu verwenden, bestimmt.
The function gets surface ist innerhalb der Klasse Rectangle definiert.
Function get surface() -> $surface: Real
$surface := This.width * this.height
Nachdem die obige Funktion geschrieben wurde, können Sie nun die Oberflächeneigenschaft als reguläre Eigenschaft verwenden!
$rect:=cs.Rectangle.new(60; 20)
$surface :=$rect.surface
SET
Die zweite Funktion, „set“, wenn sie existiert, verwaltet die Änderung einer berechneten Eigenschaft. Die Änderung der Oberfläche ermöglicht die Neuberechnung der Werte für die Breite und Höhe des Rechtecks.
Function set surface($surface)
// Beibehaltung des Breiten-Höhen-Verhältnisses
$ratio :=This.width/This.height
This .height:=Square root($surface/$ratio)
This .width:=Square root($surface*$ratio)
Wenn Sie die obigen Funktionen geschrieben haben, können Sie nun die Eigenschaft surface wie eine normale Eigenschaft ändern! Die Attribute width und height werden entsprechend angepasst.
$rect:=cs.Rectangle.new(60; 20)
$surface :=$rect.surface // liefert die Oberflächeneigenschaft
ALERT ("Die Oberfläche dieses Rechtecks ist: "+String($surface)) // gibt 120 zurück
// Ändern wir die Oberfläche
$rect .surface:=1000
// Dann die neue Breite und Höhe anzeigen
$width :=$rect.width
$height:=$rect.height
ALERT ("Das Rechteck ist jetzt: "+String($width)+" x "+String($height)) // ergibt 54,77 x 18,25
Abfragen und Sortieren…
Sammlungen, die mit Objekten der Klasse Rectangle gefüllt sind, können über berechnete Eigenschaften abgefragt und sortiert werden!
Abfrage-Beispiel:
myRectangles:=myRectangles.query("Umfang < 200")
OrderBy-Beispiel:
myRectangles:=myRectangles.orderBy("Umfang absteigend")
…und JSON
Wenn Sie ein Objekt mit berechneten Eigenschaften verwenden, werden diese Eigenschaften berücksichtigt, wenn Sie es „stringifizieren“.
$rect:=cs.Rectangle.new(30; 40)
ALERT (JSON Stringify($rect;*))

Schlussfolgerung
Dieses einfache Beispiel zeigt, dass es möglich ist, komplexe Operationen durchzuführen, wobei die Komplexität verborgen bleibt.
Außerdem bietet es eine bessere Kontrolle über die Veröffentlichung von Daten in Abhängigkeit von Kontexten, Benutzerrechten usw., da die Regeln innerhalb der Klasse selbst definiert werden können.
Willkommen bei einer modernen Art der Programmierung!