Voir le flux RSS

Johjo

[Actualité] Windev - ou l'art d'utiliser les procédures internes

Noter ce billet
par , 12/10/2017 à 00h24 (313 Affichages)
Avant-propos

Cet article traite des procédures internes qui sont apparues à partir de Windev 20. Les versions 19 et antérieures ne sont donc malheureusement pas concernées.

Les procédures internes

De temps en temps, le WLangage profite d'améliorations conséquentes qui lui redonnent un petit goût de fraicheur. Les procédures internes font partie de ces évolutions qui changent la donne. Je consacrerai (si je compte bien) trois articles aux procédures internes. Celui-ci qui les présente et deux autres qui permettront d'aller beaucoup plus loin.

Avant d'expliquer plus en détail, rappelons que dans Windev, on a plusieurs types de procédures :
  • les procédures globales. Elles sont stockées dans une collection de procédures (fichier *.wdg) et elles peuvent être appelées de n'importe où dans le projet ;
  • les procédures locales. Elles sont stockées dans les fenêtres (fichier *.wdw) et elles peuvent être appelées de n'importe où dans le code de la fenêtre. Elles ne peuvent pas être utilisées ailleurs. On peut toutefois contourner cette règle de plusieurs manières différentes. Mais mon éthique du code propre m'interdit de le faire (sauf si je n'ai pas le choix parce que je suis tombé sur du code sale) ;
  • les méthodes. Ce sont des procédures associées à une classe (fichier *.wdc). Elles peuvent être locales ou globales, publiques, protégées ou privées. Mais là, on rentre dans le domaine de la POO (Programmation Orientée Objet) et ce n'est pas le sujet de l'article ;
  • les procédures compilées dynamiquement. On utilise la fonction compile ;
  • les procédures appelées à la suite d'un événement sur un champ de l'application.


Et maintenant, nous avons les procédures internes qui peuvent être définies et utilisées dans les autres types de procédures citées précédemment. Mais une procédure interne peut aussi être définie dans une autre procédure interne.

Comment ça marche ?

Un petit exemple étant plus efficace qu'une longue présentation, voici un exemple de procédure interne :

Code windev : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
PROCEDURE ProcédureLocale()
    PROCEDURE INTERNE ProcédureInterne()
        RENVOYER "Hello world"
    FIN
 
    Trace(ProcédureInterne())

On définit ici une procédure locale qui s'appelle ProcédureLocale et dans celle-ci, on définit la procédure interne ProcédureInterne.

Dans quel cas s'en sert-on ?

On s'en sert dans plusieurs cas.

Tout d'abord, on peut s'en servir pour avoir un joli code bien écrit, autodocumenté (si vous ne connaissez pas ce terme, il faudra que je fasse un article dessus) et qui respecte la convention DRY (Don't Repeat Yourself, un autre article à prévoir).

Le code suivant :
Code windev : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
PROCEDURE ProcédureLocale()
    POUR i = 1 _A_ 10
        Trace(i)
        Trace(i * i)
        Trace(Racine(i + 1))
    FIN
 
    POUR i = 30 _A_ 40
        Trace(i)
        Trace(i * i)
        Trace(Racine(i + 1))
    FIN
 
    POUR i = 80 _A_ 100
        Trace(i)
        Trace(i * i)
        Trace(Racine(i + 1))
    FIN
deviendrait
Code windev : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
PROCEDURE ProcédureLocale()
    PROCEDURE INTERNE TracerEntierSousToutesCesFormes(pEntier est entier)
        Trace(pEntier)
        Trace(pEntier * pEntier)
        Trace(Racine(pEntier + 1))
    FIN
 
    POUR i = 1 _A_ 10
        TracerEntierSousToutesCesFormes(i)
    FIN
 
    POUR i = 30 _A_ 40
        TracerEntierSousToutesCesFormes(i)
    FIN
 
    POUR i = 80 _A_ 100
        TracerEntierSousToutesCesFormes(i)
    FIN

Le code devient ainsi plus clair, j'évite les répétitions de code.

On peut aussi s'en servir pour des usages plus avancés que je décrirai dans les articles suivants : les closures et ce que j'appellerai les pseudo-classes.

Premier piège et comment l'éviter

Plusieurs pièges vous attendent lors de l'utilisation des procédures internes. Voici le premier.

Une procédure interne ne peut pas appeler une autre procédure interne définie au même niveau qu'elle.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
PROCEDURE ProcédureLocale()
    PROCEDURE INTERNE PasLeDroit()
        Trace("Hello world")
    FIN

    PROCEDURE INTERNE Test()
        PasLeDroit()  // Cela ne fonctionne pas
    FIN

    Test()
Mais on peut s'en sortir en utilisant une variable de type Procédure. En effet, une procédure interne est une procédure avant tout.

Notez que je préfixe le nom des procédures internes par un i dans mon exemple pour les distinguer des variables de type procédure.
Code windev : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
PROCEDURE ProcédureLocale()
    PasLeDroit est une procédure
 
    PROCEDURE INTERNE iPasLeDroit()
        Trace("Hello world")
    FIN
    PasLeDroit = iPasLeDroit
 
    PROCEDURE INTERNE iTest()
        PasLeDroit()  // Cela fonctionne
    FIN
 
    iTest()

Conclusion

Cet article est une copie de l'article paru sur mon blog.

Voilà pour la première approche sur les procédures internes. Vous allez voir que ce n'est que la partie visible de l'iceberg et que de belles fonctionnalités bien cachées et non documentées vous attendent.

N'hésitez pas à me dire dans quel cas vous utilisez les procédures internes.

Merci pour votre lecture.

Envoyer le billet « Windev - ou l'art d'utiliser les procédures internes » dans le blog Viadeo Envoyer le billet « Windev - ou l'art d'utiliser les procédures internes » dans le blog Twitter Envoyer le billet « Windev - ou l'art d'utiliser les procédures internes » dans le blog Google Envoyer le billet « Windev - ou l'art d'utiliser les procédures internes » dans le blog Facebook Envoyer le billet « Windev - ou l'art d'utiliser les procédures internes » dans le blog Digg Envoyer le billet « Windev - ou l'art d'utiliser les procédures internes » dans le blog Delicious Envoyer le billet « Windev - ou l'art d'utiliser les procédures internes » dans le blog MySpace Envoyer le billet « Windev - ou l'art d'utiliser les procédures internes » dans le blog Yahoo

Mis à jour 12/10/2017 à 12h38 par Malick

Tags: windev
Catégories
Programmation , Windev

Commentaires