Première version

Vous allez peut-être trouver ce premier extrait à peu près illisible (c'est ce que j'en penserai à votre place). Les noms des variables et des gestionnaires ne donnent aucune idée de ce qu'ils représentent (C'est épouvantable mais vrai - on trouve beaucoup de code dans le monde réel qui ressemble à ça.)

global d
global r
global c
on unEvenement
 if count(r) = 0 then
   s()
 end if
 x = FALSE
 b = count(r)
 repeat while NOT(x)
   i = random(b)
   n = getAt(r, i)
   if n <> c then
     x = TRUE
     c = n
   end if
 end repeat
 
 deleteAt(r, I)
 if d then
   put ("La réponse est:" && n)
 end if
 return n
end

Deuxième version

La deuxième version apporte du sens dans les noms des variables et des gestionnaires. Cependant vous remarquerez que les noms ne vous donnent pas d'information sur le type de donnée qu'ils représentent, ni sur la portée. Ici c'est un choix de placer les déclarations globales juste avant le gestionnaire. Si ce script comportait plusieurs gestionnaires et que nous ne nous intéressions qu'à celui-ci en particulier, il serait aisé de passer à côté des déclarations globales. Dans ce cas, il aurait été malaisé de trouver quelles variables étaient locales et lesquelles étaient globales.

global debug
global disponible
global numeroprecedent
on getrandomsuivant
 if count(disponible) = 0 then
   initlist()
 end if
 done = FALSE
 n = count(disponible)
 repeat while NOT(done)
   randomindex = random(n)
   randomnum = getAt(disponible, randomindex)
   if randomnum <> numeroprecedent then
     done = TRUE
     numeroprecedent = randomnum
   end if
 end repeat
 
 deleteAt(disponible, randomindex)
 if debug then
   put ("La réponse est:" && randomnum)
 end if
 return randomnum
end getrandomsuivant

Troisième version

Enfin voici le même code, qui cette fois respecte nos conventions de nommage (définies précédemment). En lisant le code la portée des variables est explicite. Il devient aussi évident de différencier les listes des booléens ou des entiers.

global gfDebug
global glDisponnible
global gNumeroPrecedent
on GetRandomSuivant
 if count(glDisponnible) = 0 then
   InitList()
 end if
 fTermine = FALSE
 nDisponible = count(glDisponnible)
 repeat while NOT(fTermine)
   randomIndex = random(nDisponible)
   randomNum = getAt(glDisponnible, randomIndex)
   if randomNum <> gNumeroPrecedent then
     fTermine = TRUE
     gNumeroPrecedent = randomNum
   end if
 end repeat
 
 deleteAt(glDisponnible, randomIndex)
 if gfDebug then
   put ("La réponse est:" && randomNum)
 end if
 return randomNum
end mGetRandomSuivant

Conclusion

Bien que l'utilisation d'un telle convention puisse sembler ajouter beaucoup de travail, c'est quelque chose qui en vaut largement la peine. Après un moment cela devient un réflexe. En fait cela vous oblige à vous arrêter et à réfléchir sur ce que devrait être le nom "correct" de la variable ou du gestionnaire. Le gain se fait sentir lorsque vous essayez de relire du code que vous avez écrit précédemment. Si vous avez oublié le fonctionnement de certaines portions de code, vous serez surpris de voir combien il est aisé de comprendre comment marche du code qui suit ces conventions. Cela vous sera encore plus utile si vous faites partie d'une équipe qui a adopté ces conventions. Vous découvrirez que l'utilisation de ces conventions vous permet de comprendre le code de vos collaborateurs bien plus vite que si aucune convention n'avait été utilisée.