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.Methoddans une propriété d'objet et utiliser l'opérateur()après le nom de la propriété, - ou appeler directement l'objet
4D.Methoden utilisant la fonctioncall()ouapply().
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
| Release | Modifications |
|---|---|
| 21 R3 | Ajout |
4D.Method.new( source : Text {; name : Text } ) : 4D.Method
| Paramètres | Type | Description | |
|---|---|---|---|
| source | Text | -> | Représentation textuelle d'une méthode 4D à encapsuler dans un objet |
| name | Text | -> | Nom de la méthode à afficher dans le débogueur. Si omis, le nom de la méthode sera affiché "anonyme" |
| Résultat | 4D.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".
Il est recommandé de nommer explicitement votre méthode si vous souhaitez :
- utiliser le nom persistant de la méthode dans la fenêtre d'évaluation du débogueur (les méthodes anonymes ne sont pas persistantes dans le débogueur).
- manipuler la méthode volatile en utilisant des commandes telles que
Method get pathetMethod resolve path(les méthodes anonymes n'ont pas de chemin).
L'objet 4D.Method résultant peut être vérifié en utilisant checkSyntax() et exécuté en utilisant (), .apply() ou .call().
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
| Release | Modifications |
|---|---|
| 21 R3 | Prise en charge des objets 4D.Method |
| 17 R3 | Ajout |
.apply() : any
.apply( thisObj : Object { ; params : Collection } ) : any
| Paramètres | Type | Description | |
|---|---|---|---|
| thisObj | Object | -> | Objet à retourner par la commande This dans la fonction |
| params | Collection | -> | Collection de valeurs à passer en paramètres à la fonction |
| Résultat | any | <- | 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.Functiontels que les objets4D.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
| Release | Modifications |
|---|---|
| 21 R3 | Prise en charge des objets 4D.Method |
| 17 R3 | Ajout |
.call() : any
.call( thisObj : Object { ; ...params : any } ) : any
| Paramètres | Type | Description | |
|---|---|---|---|
| thisObj | Object | -> | Objet à retourner par la commande This dans la fonction |
| params | any | -> | Valeurs à passer en paramètres à la fonction |
| Résultat | any | <- | 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.Functiontels que les objets4D.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
| Release | Modifications |
|---|---|
| 21 R3 | Ajout |
.checkSyntax() : Object
| Paramètres | Type | Description | |
|---|---|---|---|
| Résultat | Object | <- | 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é | Type | Description | |
|---|---|---|---|
| success | Boolean | Vrai si aucune erreur de syntaxe n'a été détectée, faux sinon | |
| errors | Collection d'objets | Disponible uniquement en cas d'erreur ou de warning. Collection d'objets décrivant les erreurs ou les warnings | |
| [].isError | Boolean | Erreur si True, sinon warning | |
| [].message | Text | Message d'erreur ou de warning | |
| [].lineNumber | Integer | Numé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
| Release | Modifications |
|---|---|
| 21 R3 | Ajout |
.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
| Release | Modifications |
|---|---|
| 21 R3 | Prise en charge des objets 4D.Method |
| 18 R2 | Ajout |
.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"