|
Site |
Cours VB.net |
|
|
|
Le GoTo |
|
|
Et hop!! On saute..
Le Goto c'est quoi?
Faut-il utiliser le GoTo ?
Goto.
L'instruction GoTo permet de transférer le contrôle
à l'emplacement d'une étiquette(on dit parfois un label) locale.
Une étiquette permet de localiser un endroit du code Les étiquettes sont
toujours terminées par deux points(:).
Goto permet un saut non conditionnel : aller à, sauter vers une étiquette:
...
GoTo FIN
A=2
B=A+2
FIN:
FIN: est une étiquette, un mot en début de ligne qui désigne un endroit du code; pour créer une étiquette, taper en début de ligne un mot suggestif de l'endroit, puis ajouter ":".
Le programme saute de la ligne GoTo FIN à l'étiquette FIN: puis se poursuit après FIN (Les instructions entre GoTo FIN et FIN: ne sont pas exécutées :
Le GoTo est souvent utilisé avec une instruction If (pour rendre le saut conditionnel):
If A=0 Then GoTo FIN
..
FIN:
Pourquoi éviter le 'GoTo'.
L'utilisation du GoTo est peu élégante et à éviter:
Cela casse la structure du code qui se déroule de haut en bas, le cheminement du programme est moins évident, moins visible; s'il y a plusieurs GoTo le programme devient vite illisible.
On parle dans ce cas de "code spaghetti"
ou de "code
kangourou"
(à cause des sauts).
Dans la programmation structurée il faut bannir le 'GoTo'. On le remplacera avantageusement par des If..Then et des boucles.
Exemple:
On peut remplacer avantageusement la ligne:
If A=0 Then GoTo FIN
B=1
FIN:
par:
If A<>0 Then
B=1
End if
Autre exemple:
Saisir à l'aide d'une InPutBox un nombre. S'il n'est pas entre 1 et 31, ressaisir.
Avec GoTo:
Dim reponse As String
Question:
reponse= InPutBox ("Donner un nombre entre 1 et 31")
If Val(Reponse)<1 Or Val(Reponse) >31 Then GoTo Question
Sans GoTo:
Dim reponse As String
While Val(Reponse)<1 Or Val(Reponse) >31
reponse= InPutBox ("Donner un nombre entre 1 et 31")
Wend
Quant utiliser le 'GoTo'.
Il est cependant parfois utilisé pour la clarté du code, car il permet de sortir de plusieurs blocs de code qui se suivent.
Exemple: détection d'erreur avant l'écriture sur une fichier.
If Not Exit(File) Then
errorState=File.NotExist
GoTo FIN
End if
If Not Open(File) Then
errorState=File.NotOpen
GoTo FIN
End if
If Not Overwrite(File) Then
errorState=File.NotOverwrite
GoTo FIN
End if
FIN:
C'est propre.
Là aussi on aurait pu utiliser des If imbriqués:
If Exit(File) Then
If Open(File) Then
If Overwrite(File) Then
errorState=File.Ok
Else
errorState=File.NotOverwrite
End if
Else
errorState=File.NotOpen
End if
Else
errorState=File.NotExit
End if
La solution avec les GoTo à l'avantage d'être plus lisible.
Pour info, il existe une autre solution élégant et originale utilisant un Select Case: Les "Case" peuvent contenir n'importe quelle expression.
Select Case true
Case len(File) = 0
msgbox "Pas de nom de fichier"
Case Not Exit(File)
errorState=File.NotExist
Case Not Open(File)
errorState=File.NotOpen
Case Not Overwrite(File)
errorState=File.NotOverwrite
Case else
'placer les exceptions ici
End Select
|
|
|
|
|