Bonjour,
Je lis ça et là qu'il ne faut pas utiliser GOTO.
Donc bêtement je fais ce qu'on me dit et essaye de ne pas l'utiliser mais ... pourquoi ?
Merci d'avance :-)
Bonjour,
Je lis ça et là qu'il ne faut pas utiliser GOTO.
Donc bêtement je fais ce qu'on me dit et essaye de ne pas l'utiliser mais ... pourquoi ?
Merci d'avance :-)
Bonjour,
je crois que l'exercice devient très intéressant quand on "inverse les rôles".
alors je m'y colle : pourquoi as-tu besoin de GOTO dans tes projets ? Quel est l'impérieux besoin qui les nécessitât ?
![]()
Bonjour
Unà joe.levrai.
Et pour répondre à Limace_hurlante : ce n'est pas que "c'est mal", mais que cela me "fait mal" (torticolis, maux de crâne, etc ...), comme tous les mécanismes de type "spaghettis".
Rien ne t'empêche d'utiliser de tels mécanismes, mais comprends alors bien que rares seront les masochistes qui accepteront d'analyser et/ou maintenir ton code .![]()
Bonjour,
Un code bien structuré mérite une bonne analyse. Le goto c'est utile dans le cours typique ou le jumping!
Le
Salut, un débat sur la chose
Merci de toute vos réponses !
Poin d'impérieux besoin, mais juste un instant de temps en temps ou l'amateur novice que suis se dit devant un truc comme ca (voir ci dessous) qu'il y a forcément moyen de faire sans le goto mais est-ce-que ca vaux la peine de chercher ? Est-ce que le GOTO c'est vraiment horrible, voila voila ...
(je précise au passage que je viens tout juste de comprendre que mon code ne marchera pas car on ne pourrait sois disant pas mettre de variable tableau en public dans les module de classe
Code : 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 For i = 1 To FeuilleDeRecherche.Range("A" & Rows.Count).End(xlUp).Row ' on fait une boucle qui va de la preimere ligne à la dernier ligne ecrite 'si (dans les 3 premiers caractère de la ligne i colone 1 il y a "PAU" ET que le code est écrit en gras alors If Len(FeuilleDeRecherche.Cells(i, 1).Value) < gandeurducode Then GoTo icI: If Left(FeuilleDeRecherche.Cells(i, 1).Value, grandeurDuCode) = CodeRecherche Then If QueLeGras = True And FeuilleDeRecherche.Cells(i, 1).Font.Bold = False Then GoTo icI Else ReDim Preserve LesControls(NVar).LaVariable(0 To j) usf.Controls(BoiteARemplir).AddItem FeuilleDeRecherche.Cells(i, k).Value 'alors on inscrit ce qu'il y a dans la collne 2 de la ligne i dans la liste déroulante LesControls(NVar).LaVariable(j) = i 'on enregistre le numero i de la ligne dans la variable J j = j + 1 ' on change de J pour le prochain tour de la boucle End If End If icI: Next i ' on change de ligne i
Je lis partout cette histoire de spagettis, mais qu'est-ce donc ?
De plus, les seul personne qui serait succeptible de maintenir mon code c'est moi ... j'essaie d’être clair dans mes commentaire pour me comprendre longtemps plus tard mais bon ...
MErci, j'avais cherché : "goto vba" mais j'avais omi de tenter avec d'autre langage de programmation
Pour ne pas avoir a rédiger ce qui l'est déjà depuis kala kala :Je lis partout cette histoire de spagettis, mais qu'est-ce donc ?
très exactement ceci :
https://fr.wikipedia.org/wiki/Syndro..._de_spaghettis
qui est entre autres le résultat de l'utilisation de cela :
https://fr.wikipedia.org/wiki/Programmation_spaghetti
EDIT : j'ajoute aux deux lectures ci-dessus la suivante :
https://fr.wikipedia.org/wiki/Th%C3%A9orie_du_chaos
Cette dernière ne concerne pas directement le sujet en lui-même, mais devrait t'aider à comprendre certains aspects (bien qu'ils puissent échapper à la perspicacité des uns ou des autres)
Après, ce n'est qu'une question de choix personnel du risque de se retrouver un jour gêné par une "construction" dans laquelle la modification ou le déplacement d'un seul élément peut mettre en péril l'ensemble des éléments, sauf à passer un temps quelquefois fou à déterminer toutes les conséquences possibles au sein d'imbrications, de ramifications, etc ....
Qu'un bug, un défaut, un cas particulier non prévu, etc ... intervienne et le risque devient alors grand de tenter un "rafistolage" qui ne mettrait pas en péril un autre élément, voire l'ensemble des éléments.
Voilà. Tout le reste ne serait que baratin.
Bonjour,Un programme spaghettis, est un programme linéaire d'un seule tenant. On titre sur un spaghettis et on déroule le code du sub au end sub!Un langage spaghettis c'est un train qui part de paris et s'arrête à lyon.Un goto c'est un aiguillage, si je place un changement de rail sur ma voie ferrée, je change la destination de mon train, Marseille par exemple. En soit c'est simple mais ce n'est plus le même programme. Je l'ai fait d'un claquement de doigt, mais ai'je vraiment analysé les conséquences?La modification du tracé exige une analyse et la réécriture d'une partie du code pas de jump dans toutes les directions qui rendent le code illisible et In maintenable!
Par exemple je viens de faire un explication spaghettis!
Dernière modification par Invité ; 31/01/2017 à 10h34.
Bonjour,
sans parler des solutions qui poussent a utiliser des goto, le cas dans lequel la solution goto est la plus efficace en VBA et celle recommandée est lors de la gestion des erreurs.
http://silkyroad.developpez.com/VBA/...rreurs/#LIII-A
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 On Error GoTo plop 'code plop: 'code
Cycle de vie d'un bon programme :
1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise
Pas de question technique par MP, je ne réponds pas
Mes ouvrages :
Migrer les applications VBA Access et VBA Excel vers la Power Platform
Apprendre à programmer avec Access 2016, Access 2019 et 2021
Apprendre à programmer avec VBA Excel
Prise en main de Dynamics 365 Business Central
Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
Pensez à consulter la FAQ Excel et la FAQ Access
Derniers tutos
Excel et les paramètres régionaux
Les fichiers Excel binaires : xlsb,
Autres tutos
Bonjour,
Je reprends à mon compte la remarque de Jacques (Unparia) concernant la maintenance du code.
Actuellement, je suis entrain de reprendre un code réalisé il y a cinq ans pour un client. A l'époque, cela me paraissait plus facile de mettre des Goto "dans tous les coins" pour atteindre et sélectionner directement des zones nommées dans un fichier aux multiples onglets. Aujourd'hui, c'est un casse-tête car il faut refaire chaque chemin pour voir à quoi correspondent les zones.
Je trouve plus simple de travailler avec des procédures paramétriques où je lui indique notamment les informations nécessaires au traitement (onglet, etc...) On sait immédiatement quelle partie du fichier est concernée et ce qu'on traite, c'est du temps gagné.
Bonjour à tous,
J'ai du, il y a quelques temps, faire face à un code écrit à grand renforts de Goto et de conversion de caractères.
Il s'agissait tout simplement d'un virus installant un cheval de Troie sur le pc.
Je le cite à titre d'exemple car si, pour faire un virus, l'on utilise des Goto, c'est uniquement dans le but de "tromper" son monde en augmentant la difficulté de "lire" le code.
Pour compléter l'explication de pijaku
Le but de la méthode des Goto dans les procédures malveillantes, c'est de créer ce qu'on appelle des "codes morts". Ces portions de codes ne servent à rien, et le jeu des Goto est là pour entrer dans ces portions de code mort, qui ne servent à rien, ne font rien que d'exécuter des banalités qui n'ont aucune action ..... jusqu'à arriver sur les 3 seules lignes de code qui ont une réelle action (malveillante au demeurant).
En gros, on noie un projet VBA avec du code obfusqué, illisible, avec des tonnes de "saut d'exécution" par le haut et par le bas ... pour rendre très compliqué la compréhension et la détection de l'infimie partie du projet qui n'est pas du code mort
Bonjour Joe,
Tout à fait.Le but de la méthode des Goto dans les procédures malveillantes, c'est de créer ce qu'on appelle des "codes morts".
Dans l'exemple que je cite, le code initial (que j'ai conservé) est de 321 lignes pour, au final, un code de 19 lignes utiles.
Alors dans l'idée de faire un code le plus lisible possible, je suis confronté à un cas ou j'ai deux possibilité de codage.
Quelle est la meilleure selon vous ? (le moins spaghetti)
Solution 1
Solution 2
Code : 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
20
21
22
23
24 private sub combobox_change 'bout de code ou l'on implémente pleins de text box call LancerLesVerifs end sub sub LancerLesVerifs 'bout de code ou l'on vérifie si les text box on le bon type de donées/ne sont pas vide if verif = true then call faireLEsCalculs end sub Sub FaireLEsCalculs 'bout de code ou l'on adiitione/multiplie etc les info qui sont dans les textbox et affiche un sous total call ToutCalculer end sub Sub ToutCalculer 'bout de code on l'on prend tous les sous-taux, on les additionne et les affiche end sub
Code : 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
20
21
22
23
24
25
26 private sub combobox1_change call Implementation if LancerLesVerifs = false exit sub Call FaireLEsCalculs call ToutCalculer end sub Sub Implementation 'bout de code ou l'on implémente pleins de text box end sub function LancerLesVerifs dim verif as boolean 'bout de code ou l'on vérifie si les text box on le bon type de donées/ne sont pas vide LancerLesVerifs = verif end function Sub FaireLEsCalculs 'bout de code ou l'on adiitione/multiplie etc les info qui sont dans les textbox et affiche un sous total end sub Sub ToutCalculer 'bout de code on l'on prend tous les sous-taux, on les additionne et les affiche end sub
Salut,
La seconde solution, car tu decomposes sans avoir forcement a enchainer tes etapes de code.
Cycle de vie d'un bon programme :
1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise
Pas de question technique par MP, je ne réponds pas
Mes ouvrages :
Migrer les applications VBA Access et VBA Excel vers la Power Platform
Apprendre à programmer avec Access 2016, Access 2019 et 2021
Apprendre à programmer avec VBA Excel
Prise en main de Dynamics 365 Business Central
Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
Pensez à consulter la FAQ Excel et la FAQ Access
Derniers tutos
Excel et les paramètres régionaux
Les fichiers Excel binaires : xlsb,
Autres tutos
Je réponds quant à moi sans hésitation que je ne vois pas le rapport avec le sujet (utilisation de GOTO) de cette discussion. Je le verrais assez si cette nouvelle question était en vue de comparer un code avec GOTO et un avec de quoi ne pas utiliser GOTO, mais ne vois pas une telle comparaison dans cette dernière question posée.
Quand Goto est plus rapide...
Code : 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
20
21
22
23
24
25 Sub test() Dim i&, a&, n&, t As Single n = 100000000 t = Timer Do a = a + 1 If a = n + 10 Then Exit Do Loop While a <= n Debug.Print Timer - t t = Timer For i = 1 To n a = a + 1 If i = n + 10 Then Exit For Next i Debug.Print Timer - t a = 0 t = Timer debut: a = a + 1 If a = n Then GoTo fin GoTo debut fin: Debug.Print Timer - t End Sub
Bonjour à tous,
pijaku, pourquoi avoir ajouté If i = n + 10 Then Exit xxx aux 2 premières boucles ?
Ca biaise le test. Elles ont 2 fois plus de comparaisons à faire, le test étant déjà inclus dans le next ou loop.
Ca aurait pu, pourquoi pas. Mais si on les commente goto repasse derrière chez moi.
eric
Edit :
j'ajoute même que dans le For a = a + 1 est en trop puisqu'il se retrouve à gérer une variable supplémentaire qu'on a déjà avec i en comparaison aux 2 autres boucles. Là le For est 3 fois plus rapide que le Goto.
Bonjour,
c'est vrai qu'avec Goto tes tests vont plus vite, car il n'y a pas de pseudo énumération (Boucle For/Next) ou de boucle conditionnelle (Do/Loop While)
Cependant, la question qui me vient, c'est de savoir si justement ce n'est la construction de l'exemple qui est biaisée ? Comme finir par fabriquer le résultat qu'on cherche à obtenir.
Ici, on se contente d'incrémenter des variables et de cesser "à un moment donné". Là, effectivement, on place deux Goto très proches qui sont plutôt là pour remplacer une boucle standard, que d'effectuer de réels sauts de code.
Qu'en est-il s'il fallait également effectuer des traitements annexes, ou même si on devait imbriquer plusieurs boucles ? Ou si on devait faire de saut entre des boucles non imbriquées ?
Je ne crois pas qu'on va plomber les performances de traitement (quoique...), mais on sera surtout obligé de monter des cascades de Goto qui là rendront toute la pertinence des arguments avancés dans cette discussion, quant à la perte de cohérence quand on lit/relit le code, ou qu'un jour on se décide à replonger dedans pour le faire évoluer.
EDIT :eriiic pour les if qui plombent les résultats. Ici, ils sont inutiles, mais dans des cas plus concrets on met souvent dans le Do/While une issue de secours. Mais pour la boucle For/Next c'est jamais bien utile si on a déjà sécurité l'étendue du For
Bonsoir,
En soit le goto, ce n'est pas vraiment le problème !
Après tout on revient aux prémices; notre bon vieux assembleur, qui quoique l'on dise est fortuitement d'actualité. Et oui le goto c'est son truc!
Le problème du goto c'est la maintenance curative et évolutive. Un code découpé et module et méthode sera et réutilisable ,maintenables et compréhensible.
Dans un programme spaghettis, je peux faire un branchement intempestif vers une autres étiquette afin d'ajouter un fonctionnalité, c'est facile mais ca peut rapporter trop gros!
Il faut avoir l'ambition de croire que notre programme nous survivrais; et que d'autre génération auront en charge de le maintenir.
Personnellement je garde espoirs.
Partager