Blog des Gens Compliqués

Archéologie de la programmation: VB6 et les collections

18/11/2016 14:21:09+01:00|Par DkVZ
Informatique & Web
4 minutes de lecture (facile)

Table des matières

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).

Wait, what?
Parfois le dictionnaire ne peut plus rien y faire

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

Ajouter un commentaire

Votre commentaire a été ajouté
(enfin, je pense)