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 !

Jonathan Laurent

Read more posts about this author.

Comments