Edition du billet
05/11/2017 : Utilisation de la surcharge de procédure

Je vous partage aujourd'hui une petite astuce pour rendre votre code un peu plus lisible. A force de me lire, vous finirez par savoir qu'avoir un code clair et lisible est très important pour moi.

Cette idée m'est venue en apprenant à utiliser d'autres langages de programmation (Python en particulier qui est un langage que j'adore).

L'astuce d'aujourd'hui concerne la fonction ChaineConstruit.

Chaîne élégante

ChaineConstruit - Qu'est-ce que c'est ?

La fonction ChaineConstruit vous permet de créer des chaînes de caractères à partir d'un modèle. On pourra ensuite changer certains éléments de ce modèle lors de l'appel de ChaîneConstruit.

Voici un petit exemple :

Trace(ChaineConstruit("Le chien fait %1 mais pas %2", "Ouaf", "Miaou"))
// Affiche "Le chien fait Ouaf mais pas Miaou"

Je vous laisse lire la documentation de WinDev® sur ChaineConstruit pour en savoir plus.

Il existe aussi d'autres fonctions *Construit :

J'aurai pu utiliser dans l'exemple précédent la fonction TraceConstruit, mais pour mettre en évidence ce que je souhaite vous apprendre, nous allons considérer que cette fonction n'existe pas. Si vous suivez mes recommandations, vous ne devriez jamais utiliser les fonctions *Construit. Non pas parce qu'elles sont mauvaises mais parce qu'elles sont incompatibles avec ma méthode. Si vous n'utilisez pas ma méthode, alors, utilisez-les !

ChaineConstruit - la fonction aussi longue que ce qu'elle construit

WinDev est très verbeux. C'est le prix à payer lorsqu'on veut utiliser des termes clairs et francisés. La fonction ChaîneConstruit n'y fait pas exception. Lorsque vous lisez l'exemple précédent, la fonction ChaineConstruit prend environ 21% de la taille totale de la ligne de code. C'est beaucoup.

Cela pose problème car on perd de vue les éléments les plus importants :

  • Le contenu : La chaîne de caractères
  • L'action sur le contenu : La fonction Trace

Au lieu de cela, on se focalise sur ChaineConstruit.

Je vais vous montrer comment la rendre moins verbeuse

Faire disparaître ChaineConstruit mais l'utiliser quand même

Afin de faire disparaître ChaineConstruit, on va utiliser une petite variable dont je vous parle souvent : la variable de type Procédure.

Tout d'abord, nous allons créer une procédure globale qui va encapsuler notre ChaîneConstruit. En effet, on ne peut pas utiliser une variable de type Procédure (à ma connaissance) avec des fonctions du WLangage, hélas.

PROCEDURE ChaîneConstruit(ChaineInitiale <utile>, *) : chaîne
RENVOYER WL.ChaîneConstruit(MesParamètres)

J'utilise ici la surcharge de procédure. Cela signifie que ma fonction porte le même nom qu'une fonction du WLangage. Désormais, si j'appelle cette fonction, ce sera celle que j'ai définie qui sera utilisée. Pour utiliser l'autre fonction, il faut préfixer l'appel avec WL.
Vous noterez l'utilisation du paramètres * dont vous trouverez la documentation ici :

Avec cela, nous avons tout ce qu'il faut pour utiliser notre variable de type Procédure.

Dans le code du projet, vous allez écrire :

_ est une Procédure = yChaine.ChaîneConstruit

Vous aurez ainsi une procédure nommée _ définie de manière globale (puisque c'est dans le code du projet) qui aura exactement la même syntaxe que ChaîneConstruit.

Veuillez notez que j'ai préfixé l'appel de la fonction par yChaine. qui est le nom de la collection de procédures (utilisez le nom que vous souhaitez). En effet, WinDev refuse d'initialiser la variable si on indique seulement ChaîneConstruit, certainement parce que c'est le nom d'une fonction du WLangage.

Reprenons l'exemple du début avec notre nouvelle procédure :

Trace(_("Le chien fait %1 mais pas %2", "Ouaf", "Miaou"))
// Affiche "Le chien fait Ouaf mais pas Miaou"

Bingo ! C'est beaucoup plus lisible !

Téléchargez l'exemple de ce billet

Pour les abonnés, j'ai mis le projet exemple correspondant dans le dossier :

  • 2017-11-02 ChaîneConstruit élégant

Si ce n'est pas encore le cas, abonnez-vous et récupérez l'exemple gratuitement.

Aller plus loin

Les petits malins pourraient me dire :

Pourquoi ne pas avoir appelé la procédure globale directement avec le nom _ au lieu de ConstruitChaîne.

C'est une excellente remarque !

La raison est toute simple. Je veux que le fonctionnement de _ soit propre au projet. En effet, on n'est pas obligé d'utiliser la procédure ConstruitChaine avec. On peut utiliser d'autres procédures. Il faut donc supprimer toutes les dépendances avec une quelconque collection de procédures.

Dans un prochain billet, je vous montrerai la méthode que j'utilise pour traduire mes applications avec la fonction _.

Résumé

Nous avons vu dans ce billet que la fonction ChaineConstruit est particulièrement verbeuse et qu'il est possible de la remplacer par une variable de type procédure nommée _.

On a vu aussi qu'il est possible d'aller plus loin avec cette astuce et qu'elle peut éventuellement être utilisée dans la traduction d'une application.

Conclusion

N'hésitez pas à partager vos astuces avec les chaînes de caractères et si vous avez des questions à ce sujet, je me ferai une joie de vous répondre via les commentaires.

Merci à Xavier Paes pour m'avoir signalé l'existence des fonctions *Construit.
Merci à RitonEure pour avoir soulevé la question sur la surcharge de procédure.

J'espère que cet article vous a plu. Vous pouvez me donner votre avis via les commentaires ou via le sondage : Sondage - WinDev et vous.

Merci pour votre lecture.

Jonathan Laurent

Read more posts about this author.

Comments