Brauchen Sie einen Zauberstab? Hier sind berechnete Klasseneigenschaften!

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.

blank

Dies funktioniert auch innerhalb von Listenfeldern! Diese können weiterhin nach jeder Spalte sortiert werden!
blank

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 // get the surface property
ALERT("The surface of this rectangle is: "+String($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.

// this function will be called when surface is modified
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.

//Let's create a rectangle who's original width and height are 60x20
$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;*))

blank

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!
Für weitere Details lesen Sie bitte diese Dokumentation.
Roland Lannuzel
- Product Owner & 4D Experte - Nach seinem Studium der Elektronik arbeitete Roland als Entwickler und Berater in der industriellen IT-Branche, wo er Lösungen für Kunden mit einer Vielzahl von Datenbanken und Technologien entwickelte. In den späten 80er Jahren verliebte er sich in 4D und setzte es bei der Entwicklung von Geschäftsanwendungen wie Buchhaltungs-, Abrechnungs- und E-Mail-Systemen ein. 1997 trat er schließlich in das Unternehmen ein und leistete einen wertvollen Beitrag, indem er Spezifikationen, Testtools und Demos entwarf, Schulungen durchführte und auf vielen Konferenzen für die 4D Community sprach. Er gestaltet die Zukunft von 4D aktiv mit, indem er neue Funktionen und Datenbankentwicklungstools definiert.