Aller au contenu principal
Version : Suivant

Méthode

Un objet 4D.Method contient un morceau de code qui est créé à partir d'un texte source et qui peut être exécuté. Les méthodes 4D.Method s'exécutent toujours en mode interprété, quel que soit le mode d'exécution du projet (interprété/compilé). Cette fonctionnalité est spécialement conçue pour permettre d'exécuter des morceaux de code à la volée de façon dynamique.

Un objet 4D.Method est créé avec la fonction 4D.Method.new().

Les objets 4D.Method héritent de la classe 4D.Function. Ainsi, pour exécuter l'objet méthode, vous pouvez :

  • stocker un objet 4D.Method dans une propriété d'objet et utiliser l'opérateur () après le nom de la propriété,
  • ou appeler directement l'objet 4D.Method en utilisant la fonction call() ou apply().

Voir les exemples dans le paragraphe Exécution du code dans les objets Function.

Exemples

Création d'une méthode dynamique de base

var $myCode : Text
$myCode:="#DECLARE ($number1:Integer ;$number2:Integer):Integer "+Char(13)+"return $number1*$number2"

var $o:={}
$o.multiplication:=4D.Method.new($myCode) //place l'objet dans une propriété
var $result2:=$o.multiplication(2;3) // 6

var $result3:=4D.Method.new($myCode).call(Null ; 10 ; 5) // 50

Utilisation de This dans le code d'une méthode

var $myCode:="#DECLARE ($str1:text):text "+Char(13)+"return $str1+This.name"

var $o:={name: "John"}
$o.concat:=4D.Method.new($myCode)

var $result : Text
$result:=$o.concat("Hello ") // $result est "Hello John"

Utilisation d'un fichier texte avec contrôle syntaxique

//méthode 4d stockée dans un fichier texte
var $newBusinessRules:=New shared object
Use ($newBusinessRules)
$newBusinessRules.taxRate:=0.2
$newBusinessRules.discountFormula:="price * quantity * discountRate"
$newBusinessRules.approvalThreshold:=10000
$newBusinessRules.freeShippingThreshold:=150
$newBusinessRules.defaultCurrency:="EUR"
End use

Use (Storage)
Storage.businessRules:=$newBusinessRules
End use

Cette méthode est appelée dans le code :

var $myFile:=File("/DATA/BusinessRules.4dm")

var $myMethod:=4D.Method.new($myFile.getText())
// Vérification des erreurs de syntaxe
If ($myMethod.checkSyntax().success)
$myMethod.call()
End if

Objet Méthode

Les objets 4D.Method offrent les propriétés et fonctions suivantes :

.apply() : any
.apply( thisObj : Object { ; params : Collection } ) : any

exécute l'objet fonction auquel elle est appliquée, en passant les paramètres sous forme de collection, et renvoie la valeur résultante
.call() : any
.call( thisObj : Object { ; ...params : any } ) : any

exécute l'objet fonction auquel elle est appliquée, avec un ou plusieurs paramètre(s) passé(s) directement, et renvoie la valeur résultante
.checkSyntax() : Object
vérifie la syntaxe du code source de l'objet 4D.Method et renvoie un objet résultat
.name : Text
contient le nom de l'objet 4D.Method, s'il a été déclaré dans le paramètre name du constructeur new()
.source : Text
contient le code source de la fonction sous forme de texte

4D.Method.new()

Historique
ReleaseModifications
21 R3Ajout

4D.Method.new( source : Text {; name : Text } ) : 4D.Method

ParamètresTypeDescription
sourceText->Représentation textuelle d'une méthode 4D à encapsuler dans un objet
nameText->Nom de la méthode à afficher dans le débogueur. Si omis, le nom de la méthode sera affiché "anonyme"
Résultat4D.Method<-Nouvel objet méthode partagé

Description

La fonction 4D.Method.new() crée et renvoie un nouvel objet 4D.Method construit à partir du code source.

Dans le paramètre source, passez le code source 4D de la méthode sous forme de texte. Tous les caractères de fin de ligne sont pris en charge (LF, CR, CRLF) en utilisant la commande Char ou une séquence d'échappement.

Dans le paramètre optionnel name, passez le nom de la méthode à afficher dans le débogueur 4D ou l'explorateur d'exécution. Si vous omettez ce paramètre, le nom de la méthode apparaîtra comme "anonyme".

tip

Il est recommandé de nommer explicitement votre méthode si vous souhaitez :

L'objet 4D.Method résultant peut être vérifié en utilisant checkSyntax() et exécuté en utilisant (), .apply() ou .call().

note

Les objets méthode volatils nommés ne sont pas des méthodes projet, ils ne sont pas stockés dans des fichiers disque et ne peuvent pas être appelés par des commandes telles que EXECUTE METHOD. Par ailleurs, comme ils héritent de la classe 4D.Function, ils peuvent être utilisés partout où un objet 4D.Function est attendu.

Exemple

var $m:=4D.Method.new("#DECLARE ($t : Text) : Texte \nreturn Uppercase($t)")

var $res:=$m.call(Null ; "hello world") //HELLO WORLD

.apply()

Historique
ReleaseModifications
21 R3Prise en charge des objets 4D.Method
17 R3Ajout

.apply() : any
.apply( thisObj : Object { ; params : Collection } ) : any

ParamètresTypeDescription
thisObjObject->Objet à retourner par la commande This dans la fonction
paramsCollection->Collection de valeurs à passer en paramètres à la fonction
Résultatany<-Valeur retournée par l'exécution de la fonction

Description

La fonction .apply() exécute l'objet fonction auquel elle est appliquée, en passant les paramètres sous forme de collection, et renvoie la valeur résultante.

Dans le paramètre thisObj, vous pouvez passer une référence à l'objet qui sera utilisé comme This dans la fonction. Passez Null si vous ne voulez pas utiliser This mais que vous voulez envoyer des paramètres.

Vous pouvez passer une collection à utiliser comme paramètres dans la fonction en utilisant le paramètre facultatif params :

  • dans les objets 4D.Formula, les paramètres sont passés à $1...$n dans la formule.
  • dans les autres objets 4D.Function tels que les objets 4D.Method, les paramètres sont passés aux paramètres déclarés.

Notez que .apply() est similaire à .call() à la différence près que les paramètres sont passés en tant que collection. Cela peut être utile pour passer des résultats calculés.

Exemple

var $coll:=[10 ; 2]
var $myCode:="#DECLARE ($number1:Integer ;$number2:Integer):Integer\n"+\N-
"return $number1*$number2"

$m:=4D.Method.new($myCode; "m_multiple")
var $result:=$m.apply(Null ; $coll) //20

.call()

Historique
ReleaseModifications
21 R3Prise en charge des objets 4D.Method
17 R3Ajout

.call() : any
.call( thisObj : Object { ; ...params : any } ) : any

ParamètresTypeDescription
thisObjObject->Objet à retourner par la commande This dans la fonction
paramsany->Valeurs à passer en paramètres à la fonction
Résultatany<-Valeur retournée par l'exécution de la fonction

Description

La fonction .call() exécute l'objet fonction auquel elle est appliquée, avec un ou plusieurs paramètre(s) passé(s) directement, et renvoie la valeur résultante.

Dans le paramètre thisObj, vous pouvez passer une référence à l'objet qui sera utilisé comme This dans la fonction.

Vous pouvez passer des valeurs à utiliser comme paramètres dans la fonction à l'aide du paramètre facultatif params :

  • dans les objets 4D.Formula, les paramètres sont passés à $1...$n dans la formule.
  • dans les autres objets 4D.Function tels que les objets 4D.Method, les paramètres sont passés aux paramètres déclarés.

Notez que .call() est similaire à .apply() à la différence près que les paramètres sont passés directement.

Exemple

 var $m : 4D.Method
var $myCode:="#DECLARE ($number1:Integer;$number2:Integer):Integer\n"+\
"return $number1*$number2"

$m:=4D.Method.new($myCode; "m_multiple")
var $result:=$m.call(Null; 10; 5) //50

.checkSyntax()

Historique
ReleaseModifications
21 R3Ajout

.checkSyntax() : Object

ParamètresTypeDescription
RésultatObject<-Objet résultat de la vérification de syntaxe

Description

La fonction .checkSyntax() vérifie la syntaxe du code source de l'objet 4D.Method et renvoie un objet résultat.

L'objet retourné contient les propriétés suivantes :

PropriétéTypeDescription
successBooleanVrai si aucune erreur de syntaxe n'a été détectée, faux sinon
errorsCollection d'objetsDisponible uniquement en cas d'erreur ou de warning. Collection d'objets décrivant les erreurs ou les warnings
[].isErrorBooleanErreur si True, sinon warning
[].messageTextMessage d'erreur ou de warning
[].lineNumberIntegerNuméro de ligne de l'erreur dans le code

Exemple

var $m : 4D.Method
var $check : Object
$m:=4D.Method.new("var $a:=2026\r$a:=current date")
$check:=$m.checkSyntax()
If ($check.success=False)
ALERT("Syntax error: "+$check.errors[0].message)
End if

.name

Historique
ReleaseModifications
21 R3Ajout

.name : Text

Description

La propriété .name contient le nom de l'objet 4D.Method, s'il a été déclaré dans le paramètre name du constructeur new(). Sinon, la propriété n'est pas retournée.

Cette propriété est en lecture seule.

.source

Historique
ReleaseModifications
21 R3Prise en charge des objets 4D.Method
18 R2Ajout

.source : Text

Description

La propriété .source contient le code source de la fonction sous forme de texte.

La valeur renvoyée est le texte original utilisé pour créer l'objet 4D.Formula ou 4D.Method, mais reformaté.

Cette propriété est en lecture seule.

Exemple

var $myCode:="#DECLARE ():Real\n"+\
"return random*current time"
$m:=4D.Method.new($myCode)
$src:=$m.source //"#DECLARE() : Real\rreturn Random*Current time"