Intro
VB6? Skoi VB6? C'est un langage de programmation qui date de quelque part avant les années 2000, donc tout le monde a oublié.
Tout le monde? Non, certaines applications sont encore maintenues dans ce langage qui compile de magnifiques exécutables pour Windows qui fonctionnent à condition d'avoir installé une série de pré-requis obscurs, mais là n'est pas la question qui nous occupe aujourd'hui.
La problématique qui nous occupe aujourd'hui et sa résolution serviront peut-être à quelqu'un (moi dans 6 mois, probablement).
Les collections
Bon je suppose que vous savez ce que c'est un tableau (ARRAY en English) dans un contexte de programmation, si vous savez pas c'est, cet article va rapidement s'avérer être encore plus inutile pour vous que pour ceux qui savent.
De toutes manières c'est simple, un tableau c'est une série de cases mémoires réservées. Puis voilà quoi. Il faut réserver à l'avance le nombre de case, puis si t'essayes de dépasser ce nombre il se passe un truc foireux qui dépend du langage. En C ton programme va planter, en Java la JVM va te montrer/laisse sa (stack) trace, idem dans la plupart des langages modernes, et même les moins modernes.
La plupart des langages de programmation fournissent en plus des librairies qui définissent des objets bien pratiques que sont par exemple les listes et les tables de hachage, qui n'a rien à voir avec le monde de la charcuterie où parfois on hache des trucs sur des tables.
Une liste permet d'ajouter des éléments comme dans un tableau mais avec une gestion automatique de la dimension. On peut ajouter autant qu'on veut dans une liste dans planter le programme ou chier des traces (normalement).
Une table de hachage ou map, ou hash map, permet de stocker des paires clé / valeur. Le terme dictionnaire est parfois utilisé parce que quand on y pense, dans un dictionnaire, on recherche une clé (un mot) qui n'apparaît qu'une fois dans le dit dictionnaire, et qui correspond à une définition (la valeur). J'explique parce que depuis les années 2000 plus personne n'utilise de dictionnaire.
Contexte: langage moderne
Sur un langage moderne on aurait quelque chose qui ressemble à cet horrible pseudo-code pourri en Français (qui est probablement une réalité quelque part *tousse* NE CLICK PAS ICI):
Declare superVariable comme Dictionnaire
superVariable.ajouter "Une clé" "Une valeur"
Afficher superVariable.lire "Une clé"
Si superVariable.lire "Une clé"
Afficher "La clé existe."
Fin Si
Le résultat d'exécution serait l'affichage de la valeur:
"Une valeur"
"La clé existe."
Parce que notre implémentation de table de hachage est censée permettre de lire et écrire dedans, compter le nombre d'éléments et vérifier si une clé existe déjà.
En Java
Map superVariable = new HashMap<>();
superVariable.put("Une clé", "Une valeur");
System.out.println(superVariable.get("Une clé");
if (superVariable.get("Une clé") != null) {
System.out.println("La clé existe.");
}
C'est pas beaucoup plus compliqué hein?
En Scala
C'est à la mode hein. F*ck Python.
val superVariable = Map("Une clé" -> "Une valeur")
println(superVariable("Une clé"))
if (superVariable.contains("Une clé")) {
println("La clé existe.")
}
C'est beau, c'est frais, miam.
En Visual Basic 6 
Euh...
Dim superVariable as New Collection
superVariable.Add "Une valeur" "Une clé"
Debug.print superVariable.Item "Une clé"
On Error Resume Next
superVariable.Item "Une clé"
If (Err.Number = 0) Then
Debug.print "La clé existe."
End If
Err.Clear
Baaah pourquoi c'est la valeur d'abord et pas la clé? J'ai mis au moins 17 minutes et trois cafés à m'en rendre compte. C'est logique de renseigner la clé d'abord non? C'est l'identifiant, le truc qu'on lit en premier, le truc qu'on voit en premier dans le dictionnaire... Pourquoi cet ordre?
Ensuite c'est quoi ce plan, appeler une clé qui n'existe pas largue une grosse erreur, qui arrête le programme. C'est radical hein.
Pour vérifier l'existence d'une clé il faut ajouter de la gestion d'erreur, ici on a "s'il y a erreur, CONTINUE YOLO LOLz èèè1" qui est un des meilleurs éléments du langages VB6, sans hésiter, c'est bien pratique dans la vraie vie aussi.
Après avoir eu une erreur, ou pas, on vérifier la variable Err. Si Err.Number = 0 c'est qu'on a pas eu d'erreur et que la clé existe. Quelle élégance.
La solution consiste ensuite à créer une fonction contain comme celle qui existe d'office en Scala:
Public Function Contains(ByVal col As Collection, ByVal key As Variant) As Boolean
On Error Resume Next
col.Item key
Contains = (Err.Number = 0)
Err.Clear
End Function
Comment récupérer une liste ou tableau avec les clés?
On peut pas.
Comment parcourir la Collection?
J'étais bluffé de découvrir que VB6 a une instruction Foreach:
For Each itm In superVariable
Debug.print itm
Next
Par contre impossible de déterminer la clé à laquelle itm correspond. C'est totalement impossible. Youpie.
Le pire workaround du monde et probablement la chose la plus stupide jamais inventée depuis les chiottes à la turque consiste à déclarer deux Collections: une avec les clés -> valeurs et une avec les valeurs comme clé, et les clés comme valeur. Vous suivez? Si les valeurs peuvent être extrêmement longues c'est un bonus.
Me dites pas merci c'était gratuit.
J'ai besoin de vacances
Sdomfqjsldmfkjqmsdkjf

Commentaires
Il faut JavaScript activé pour écrire des commentaires ici