ProgrammationDéveloppeur d'applications de bureau en Visual Basic

Comment les collections de type Queue et Stack sont-elles mises en œuvre et utilisées dans Visual Basic, quand choisir chacune de ces structures, et sur quoi est-il important de faire attention lors du travail avec des files d'attente et des piles ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

Historique de la question :

Les collections Queue et Stack sont des structures de données de base, mettant en œuvre respectivement les principes FIFO (First-In-First-Out) et LIFO (Last-In-First-Out). Elles sont utilisées depuis l'époque de VB6 classique, et avec l'arrivée de VB.NET, ces structures sont devenues des classes standards. Queue est utile pour les scénarios où les éléments doivent être traités dans l'ordre de leur arrivée (par exemple, une file d'attente de tâches), tandis que Stack est utilisé lorsque le dernier élément ajouté doit être traité avant les autres (par exemple, la pile d'appels ou l'annulation d'actions).

Problème :

On choisit souvent par erreur la mauvaise structure pour une tâche donnée ou on les utilise de manière non sécurisée dans des scénarios multithreads. Des erreurs peuvent également survenir lors de l'extraction d'une pile ou d'une file d'attente vide, entraînant des exceptions.

Solution :

En Visual Basic, il existe des classes correspondantes pour travailler avec ces structures :

  • System.Collections.Queue
  • System.Collections.Stack

Exemple de travail avec une file d'attente et une pile :

' Travail avec une file d'attente Dim q As New Queue() q.Enqueue("Premier") q.Enqueue("Deuxième") Dim item = q.Dequeue() ' item = "Premier" ' Travail avec une pile Dim s As New Stack() s.Push("A") s.Push("B") Dim top = s.Pop() ' top = "B"

Caractéristiques clés :

  • Queue assure l'ordre FIFO, Stack — LIFO.
  • Pour accéder au premier élément, utilisez Peek(), pour supprimer — Dequeue()/Pop().
  • Il est nécessaire de vérifier la propriété Count pour éviter des erreurs lors de l'extraction d'une collection vide.

Questions pièges.

1. Peut-on modifier une collection Queue ou Stack pendant l'itération à l'aide de For Each ?

Non, modifier (ajouter ou supprimer des éléments) une collection lors de son parcours avec For Each entraîne une InvalidOperationException.

Exemple de code :

Dim q As New Queue() q.Enqueue(1) q.Enqueue(2) For Each elem In q q.Enqueue(3) ' déclenchera une exception lors de l'itération Next

2. Que renvoie la méthode Peek() pour une Queue ou Stack vide ?

Peek lance une exception InvalidOperationException si la collection est vide, et ne renvoie pas de valeur par défaut.

Exemple de code :

Dim st As New Stack() Dim first As Object = st.Peek() ' Exception !

3. Quelle est la différence entre Queue(Of T) et Queue et pourquoi vaut-il mieux privilégier les collections génériques ?

Queue(Of T) est la version générique de Queue, elle est type-sûre et permet d'éviter le boxing/unboxing. Il est toujours préférable de choisir celle-ci lors de l'utilisation de types connus.

Dim numbers As New Queue(Of Integer)() numbers.Enqueue(5) ' Seulement Integer

Erreurs typiques et anti-patterns

  • Essayer d'extraire un élément d'une Queue/Stack vide sans vérifier Count.
  • Utiliser des collections non génériques lorsqu'une file d'attente ou une pile avec un type de données connu est présente (perte de sécurité de type, erreurs de cast).
  • Modifier une collection pendant l'itération.

Exemple de la vie réelle

Cas négatif

Dans une application où une file d'attente d'impression de documents est implémentée, le développeur stocke les tâches d'impression dans une Stack, plutôt que dans une Queue. En conséquence, les documents sont imprimés dans l'ordre inverse (le dernier ajouté est le premier à être servi).

Avantages :

  • Implémentation simple, toutes les opérations standard sont disponibles.

Inconvénients :

  • Perturbation de la logique de travail — l'utilisateur s'attend à ce que les documents soient traités dans l'ordre d'ajout, mais il reçoit un comportement inverse.
  • La séquence des événements est confuse et une rétroaction négative des utilisateurs survient.

Cas positif

Le même projet remplace Stack par Queue pour stocker les tâches d'impression. Maintenant, les documents sont imprimés en séquence de gauche à droite, comme l'utilisateur s'y attend.

Avantages :

  • Le comportement correspond aux attentes des utilisateurs.
  • Facilite la maintenance et les tests.

Inconvénients :

  • Une mauvaise gestion de l'accès concurrent à la file d'attente peut entraîner des conditions de course (cela peut être résolu avec des collections thread-safe ou de la synchronisation).