Dans cet article, je vais vous présenter les variants. Vous connaissez, ces petites variables qui peuvent prendre n'importe quelles valeurs ? Et bien, depuis les versions 19 et 20 de Windev, les variants ont évolué pour devenir très intéressants.
Qu'est-ce qu'un variant ?
Un variant est un type du WLangage. Il vous permet de créer une variable qui pourra prendre n'importe quelle valeur, que ce soit une chaîne de caractère, un numérique, voire un tableau ou une structure.
MaVariable est un variant
On peut l'initialiser avec un numérique.
MaVariable = 5 // Notre variant est un entier
Ou une chaîne de caractère.
MaVariable = "cinq" // Notre variant est une chaîne
Ou un booléen.
MaVariable = Vrai // Notre variant est un booléen
On peut aussi l'utiliser comme un tableau. Dans ce cas, chaque élément du tableau est un variant et peut donc contenir des valeurs de plusieurs types.
MaVariable[1] = "un" // Notre variant est un tableau avec 1 élément
MaVariable[2] = 2 // ou deux éléments, de types différents
Ou comme un tableau associatif. Attention, les clés doivent toutes être du même type. Chaque élément sera un variant.
MaVariable["Un"] = 1
MaVariable["2"] = "deux"
Enfin, on peut l'utiliser comme une structure. Chaque membre sera un variant ou, plus exactement, une variable de type MembreVariant (c'est toujours utile lorsqu'on type les paramètres dans les procédures).
MaVariable.MaSousVariable = "un"
MaVariable.UneAutreSousVariable = 2
Pour ceux qui utilisent un langage de script, l'utilisation des variants vous rappellera des souvenirs.
Par contre, un variant ne peut pas contenir de procédure.
Un variant, c'est null
Un titre complet rien que pour cette fonctionnalité ! Un variant accepte la valeur null.
Lorsqu'on crée une variable de type variant, cette dernière a pour valeur null. On peut tester et afficher cette valeur (dans ce cas, null est affiché avec la valeur 0).
MaVariable est un variant
SI MaVariable = Null ALORS
Trace("C'est null les variants")
Trace(MaVariable) // Affiche zéro mais la valeur est bien null
FIN
Le côté pratique des variants
Lazy initialization
Les variants permettent des choses pratiques. Je m'en sers pour les Lazy initialization (initialisation paresseuse).
On déclare une variable globale (ou un membre privé si on est dans une classe).
MaValeurStockée est un variant = null // Le nom de la variable est explicite car elle est utilisée plus loin
Puis on crée une fonction qui permet d'initialiser et de lire la valeur de cette variable
LireMaValeurStockée est une procédure()
SI MaValeurStockée = Null ALORS
MultiTâche(500) // On simule un calcul très long, au moins cinq secondes
MaValeurStockée = "un"
FIN
RENVOYER MaValeurStockée
Et enfin, on peut lire la valeur
Trace(LireMaValeurStockée()) // Cet appel prendra bien cinq secondes à s'exécuter, fichtre !
Trace(LireMaValeurStockée()) // Mais, mais ??? celui-ci est beaucoup plus rapide ! Merci la lazy initialization !
JSON
Et enfin, la fonctionnalité la plus intéressante avec les variants de Windev, c'est qu'ils simplifient l'utilisation de JSON.
Pour ceux qui ne connaissent pas Json, c'est un format de données textuelles au même titre que le format XML, sauf qu'il est beaucoup plus simple et moins verbeux. Il se base sur le principe Clé / Valeur. Il est très utile dans l'échange de données, ainsi que dans les fichiers de configuration.
Et pour l'utiliser, deux fonctions sont nécessaires :
Par exemple
MonVariant est un Variant
MonVariant.UnEntier = 5
MonVariant.UneChaine = "hello world"
MonVariant.UnTableau[1] = "Salut"
MonVariant.UnTableau[2] = 5
MonVariant.UnTableau[3].UnSousMembre = "Un sous membre"
MonVariant.UnTableauAssociatif["un"] = "Bonjour"
MonVariant.UnTableauAssociatif["trois"] = "25"
MonVariant.UnTableauAssociatif["test"].UnSousMembre = "Un deuxième sous membre"
MonVariant.UnTableauAssociatif["test"].UnAutreSousMembre = "Un dernier sous membre"
Trace(VariantVersJSON(MonVariant, psdMiseEnForme))
Donnera comme trace :
{
"UnEntier":5,
"UneChaine":"hello world",
"UnTableau":
[
"Salut",
5,
{
"UnSousMembre":"Un sous membre"
}
],
"UnTableauAssociatif":
{
"un":"Bonjour",
"trois":"25",
"test":
{
"UnSousMembre":"Un deuxi\u00e8me sous membre",
"UnAutreSousMembre":"Un dernier sous membre"
}
}
}
Il y a plusieurs détails à noter dans l'exemple :
- Les caractères spéciaux sont encodés.
- Le paramètre psdMiseEnForme permet de rendre le JSON plus lisible pour un humain avec des retours chariots et des indentations.
Et l'exemple inverse :
MonJSON est une chaîne = "{ ""UnMembre"":""cinq"" }"
MonVariant est un Variant = JSONVersVariant(MonJSON)
Trace(MonVariant.UnMembre) // Affichera "cinq"
Voilà, vous en savez maintenant un peu plus sur l'utilisation de Json avec Windev.
Merci pour votre lecture.
Cet article vous a intéressé ? Vous voulez en savoir plus ? Suivez le lien !