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.