Combien de fois avez-vous obtenu l’erreur« Not supported value type in a shared object » en essayant de placer un objet dans un objet partagé ?
Qu’avez-vous fait ? Vous avez écrit un code plus long pour transformer votre objet innocent en un objet partagé, peut-être en itérant sur toutes ses propriétés ?
Et si vous transfériez un objet partagé d’un groupe partagé à un autre?
Une chose intéressante à propos des objets: vous savez déjà qu’ils peuvent être utilisés comme une carte de hachage (un système clé/valeur), mais qu’en est-il de l’obtention de toutes les clés ou de toutes les valeurs avec une seule ligne de code?
Continuez à lire, car 4D v18 R3 est sorti et apporte de bonnes nouvelles !
COPIE d’objets et de collections partagés
copier un objet comme partagé
La commande OB Copy() a été améliorée pour accepter une nouvelle option qui peut avoir la valeur : ck shared .
Dans l’exemple ci-dessous, l’objet $person est copié comme objet partagé dans l’objet $copy.
Ensuite, nous pouvons mettre l’objet $copy dans l’objet partagé $personsList .
C_OBJECT$copy ($person;$copy;$personsList)
C_TEXT ($text)
$text :=Document to text(Get 4D folder(Current resources folder)+"person.txt")
//$person is a standard object
$person :=JSON Parse($text)
$personsList :=New shared object()
//$copy is a shared object
$copy :=OB Copy($person;ck shared)
Use ($personsList)
//We can put $copy in $personsList because $copy is a shared object
$personsList .person:= xml-ph-003
End use
assigner un objet partagé d’un groupe partagé à un autre
La commande OB Copy() a également été améliorée pour accepter un nouveau paramètre : groupWith (qui doit être un objet partagé ou une collection partagée).
Passer le paramètre groupWith permet de placer l’objet copié dans le même groupe partagé que groupWith.
Dans l’exemple ci-dessous, $sharedObj et $sharedColl appartiennent à deux groupes partagés distincts.
Nous ne pouvons pas mettre $sharedObj dans $sharedColl sans obtenir une erreur, mais nous pouvons facilement copier $sharedObj dans un nouvel objet appartenant au même groupe partagé que $sharedColl.
C_OBJECT($sharedObj;$objCopy)
C_COLLECTION ($sharedColl)
//$sharedObj belongs to a shared group
$sharedObj :=New shared object("lastname" ; "Smith" ; "address" ;New shared object("city" ; "New York"))
//$sharedColl belongs to another shared group
$sharedColl :=New shared collection(New shared object("lastname" ; "Brown"))
//$objCopy is in the same shared group as $sharedColl
$objCopy:=OB Copy($sharedObj;ck shared;$sharedColl)
//So we can put $objCopy into $sharedColl without error
Use ($sharedColl)
$sharedColl .
push($objCopy)
End use
et qu’en est-il des collections partagées ?
Les exemples ci-dessus sont liés à la commande OB Copy() .
La méthode du membrecollection.copy() a été améliorée exactement de la même manière.
manipuler un objet comme une carte de hachage
Il existe de nouvelles commandes pour faciliter la manipulation d’un objet en tant que carte de hachage. Si vous avez des objets dont les noms de propriété contiennent des données dynamiques, ces commandes sont faites pour vous !
Expliquons cela à l’aide d’un seul exemple.
Considérons cet objet $persons contenant des prénoms comme nom de propriété et l’âge comme valeur de propriété :
C_OBJECT($persons)
$persons :=New object
$persons ["John"]:=42 // John is 42
$persons ["Andy"]:=24 // Andy is 24
$persons ["Mary"]:=30 // Mary is 30
$persons ["Paul"]:=50 // Paul is 50
$persons ["Fred"]:=51// Fred is 51
Commande OB Keys
Cette commande renvoie les noms des propriétés d’un objet sous forme de collection :
ALERT("Il y a "+String(OB Keys($persons).length)+" personnes")
Commande OB Values
Cette commande renvoie les valeurs des propriétés d’un objet sous forme de collection :
ALERT("L'âge moyen est de "+String(OB Values($persons).average()))
Commande OB Entries
Cette commande renvoie une collection d’objets avec des propriétés clés (nom de la propriété) et une valeur (valeur de la propriété) :
C_COLLECTION($agesOK)
$agesOK:=OB Entries($persons).query("valeur>:1";45)
ALERT ("Il y a "+String($agesOK.length)+" des personnes qui ont plus de 45 ans")
ALERT ("Leurs noms sont : "+$agesOK.extract("clé").join("-"))
L’utilisation d’un objet, comme indiqué ci-dessus, permet un accès rapide et direct aux données, comme dans le cas d’un index.
C’est plus rapide que d’utiliser une collection d’objets avec les propriétés prénom et âge.
Notez également que ces commandes retournent une collection. Cela nous permet d’utiliser toutes les méthodes de membres disponibles sur les collections (telles que average(), query(), …).