Die Formel: Mehr Kraft hinter Einfachheit

Automatisch übersetzt von Deepl

Der Befehl Formula ist seit 4D v17 R3 verfügbar. Bisher haben Sie vielleicht daran gedacht, einem Objekt eine Formel als Methode zuzuweisen oder intelligente Objekte zu erstellen, die Werte berechnen oder alles tun können, was Sie brauchen. Das ist wirklich großartig, und es gibt mehr, als man auf den ersten Blick sieht!

Vincent de Lachaux – Entwickler und Experte für 4D – hat mir gezeigt, wie er diesen Befehl verwendet. Für diesen Blogbeitrag habe ich verschiedene Szenarien aus dieser Demo zusammengestellt, um Ihnen einen Einblick in eine andere Dimension dieses Befehls zu geben.

Beispiel 1 – Vereinfachung eines bestehenden Befehls

Einige 4D Befehle werden hunderttausendfach im Code verwendet. Wir übergebenoft die gleichen Parameter, mit einer Ausnahme.

Nehmen wir das einfache Beispiel des Befehls OBJECT get pointer. Ich möchte die Werte meiner Kontrollkästchen initialisieren, also schreibe ich:

(OBJECT get pointer(Object named; "checkbox"))->:=0

Oder ich schreibe eine Formel, die den Namen meines Objekts als Parameter annimmt:

interface.pointer:=Formula(OBJECT Get pointer(Object named;$1))

Wenn ich den Wert meines Kontrollkästchens zuweisen oder abrufen möchte, schreibe ich einfach:

(interface.pointer("checkbox"))->:=0
(interface.pointer("checkbox2"))->:=0

Wenn ich Tausende von Kontrollkästchen setzen muss, kann ich auch eine Formel erstellen, um die Dinge zu vereinfachen:

interface.setCheckbox:=Formula((OBJECT Get pointer(Object named;$1))->:=$2)

Um eine Reihe von Kontrollkästchen zu setzen, kann ich einfach schreiben:

interface.setCheckbox("checkbox1";0)
interface .setCheckbox("checkbox2";1)
interface .setCheckbox("checkbox3";0)
interface .setCheckbox("checkbox4";1)

Einfacher zu lesen – und viel einfacher zu schreiben, da ich die Klammern nicht zählen muss…

Beispiel 2 – Mit einem Datenbankparameter

Setzen Sie in Ihrem Code denselben Datenbankparameter mehrmals mit unterschiedlichen Werten. Nehmen wir ein konkretes Beispiel mit Tipps zur Verzögerungssteuerung. Sie möchten vielleicht, dass die Tipps in einigen Teilen Ihrer Formulare ohne Verzögerung angezeigt werden, während Sie in anderen Teilen 1s warten. Jedes Mal, wenn Sie den Datenbankparameter verwenden, müssen Sie sich den Wert merken oder ihn in einem anderen Teil des Codes suchen.

Warum nicht eine Formel erstellen?

interface.tipsNoDelay:=Formula(SET DATABASE PARAMETER(Tips delay;1))
interface .tips1sDelay:=Formula(SET DATABASE PARAMETER(Tips delay;60))

Wenn Sie dann den Wert ändern wollen, rufen Sie einfach die Formel auf:

interface.tips1sDelay()
// or

interface .tipsNoDelay()

Beispiel 3 – Formel als Variante verwenden

Sie können eine Formel erstellen, die die Werte verwendet, die als Parameter einer Methode übergeben werden(z. B. $1, $2), aber in der Methode, in der Sie Ihre Formel erstellen, müssen Sie $1 und $2 nicht eingeben. Die Variablen werden eingegeben, wenn die Formel ausgeführt wird. Sie können generische Methoden oder Formeln schreiben.

Hier ein einfaches Beispiel, das zeigt, dass der Typ bei der Ausführung definiert wird.

$obj:=New object("addition";Formula($1+$2))

$number :=$obj.addition(1;2) // ergibt 3
$text :=$obj.addition("hello "; "world") // ergibt hello world

Beispiel 4 – Testen einer Reihe von Bedingungen

Wenn Sie eine Folge von Bedingungen eingeben, z. B. If (() & ()), wertet 4D immer alle Bedingungen aus. Es hört nicht auf und wertet auch die folgenden Bedingungen aus. Wenn einige Bedingungen nur ausgewertet werden können, wenn die ganz links wahr sind, sind Sie gezwungen, eine tief verschachtelte Liste von Wenn-Bedingungen zu erstellen, um zu prüfen, ob das Objekt gültig ist, bevor Sie das Attribut testen. Das geht folgendermaßen:

If (Not(Undefined($o))
If ($o.value#Null)
If ($o.value<5)
// to do
End if
End if
End if

In diesem Beispiel hatten wir „nur“ 3 Bedingungen, aber Sie können leicht feststellen, dass es immer komplexer wird. Wie wäre es, alles in eine einzige Bedingung zu schreiben? Warum schreiben Sie nicht eine Methode, die Ihre Formeln nacheinander ausführt? Wenn das Ergebnis True ist, werten Sie die folgende Formel aus, wenn das Ergebnis False ist, brechen Sie ab und geben False zurück.

If (_AND (\
Formula (Not(Undefined($o)));\
Formula ($o.value#Null);\
Formula ($o.value<5)\
))
// to do
End if

Für die Methode _AND, sehr üblicher und einfacher Code:

$0:=True
For ($i;1;Count parameters;1)
$0 :=${$i}.call()
If (Not($0))
$i :=MAXLONG-1 // Stop if the condition fails
End if
End for

Ich hoffe, diese Beispiele geben Ihnen einen Einblick in andere Möglichkeiten, diesen Befehl zu verwenden. Sie können Ihre Formeln gerne im 4D Forum veröffentlichen… Ich bin sicher, Sie haben viele Ideen!

Vanessa Talbot
Product Owner - Vanessa Talbot kam im Juni 2014 zum 4D Programmteam. Als Product Owner ist sie für das Schreiben der User Stories und deren Umsetzung in funktionale Spezifikationen zuständig. Ihre Aufgabe ist es auch, sicherzustellen, dass die Implementierung der Funktionen den Anforderungen des Kunden entspricht. Seit ihrer Ankunft hat sie an der Definition der wichtigsten Funktionen in 4D gearbeitet. Sie hat an den meisten der neuen Funktionen für präemptives Multi-Threading gearbeitet und auch an einem sehr komplexen Thema: der neuen Architektur für erstellte Anwendungen. Vanessa hat einen Abschluss von der Telecom Saint-Etienne. Sie begann ihre Karriere am Criminal Research Institute als Entwicklerin für die audiovisuelle Abteilung. Sie hat auch in den Bereichen Medien und Medizin als Expertin für technischen Support, Produktion und die Dokumentation neuer Funktionen gearbeitet.