J'écris un type d'implémentation de file d'attente qui a une TryDequeue
méthode qui utilise un modèle similaire à diverses TryParse
méthodes .NET , où je retourne une valeur booléenne si l'action a réussi, et utilise un out
paramètre pour renvoyer la valeur réelle retirée de la file d'attente.
public bool TryDequeue(out Message message) => _innerQueue.TryDequeue(out message);
Maintenant, j'aime éviter les out
paramètres chaque fois que je le peux. C # 7 nous donne des délocalisations variables pour faciliter le travail avec eux, mais je considère toujours que les paramètres sont plus un mal nécessaire qu'un outil utile.
Le comportement que je veux de cette méthode est le suivant:
- S'il y a un article à retirer, renvoyez-le.
- S'il n'y a aucun élément à retirer (la file d'attente est vide), fournissez à l'appelant suffisamment d'informations pour agir correctement.
- Ne renvoyez pas simplement un élément nul s'il ne reste aucun élément.
- Ne lancez pas d'exception si vous essayez de retirer la file d'attente d'une file d'attente vide.
À l'heure actuelle, un appelant de cette méthode utilise presque toujours un modèle comme le suivant (en utilisant la syntaxe de variable C # 7 out):
if (myMessageQueue.TryDequeue(out Message dequeued))
MyMessagingClass.SendMessage(dequeued)
else
Console.WriteLine("No messages!"); // do other stuff
Ce qui n'est pas le pire, tout compte fait. Mais je ne peux pas m'empêcher de penser qu'il pourrait y avoir de meilleures façons de le faire (je suis tout à fait disposé à admettre qu'il pourrait ne pas y en avoir). Je déteste la façon dont l'appelant doit rompre son flux avec un conditionnel quand tout ce qu'il veut, c'est obtenir une valeur s'il en existe une.
Quels sont les autres modèles qui existent pour accomplir ce même comportement "essayer"?
Pour le contexte, cette méthode peut potentiellement être appelée dans les projets VB, donc des points bonus pour quelque chose qui fonctionne bien dans les deux. Ce fait devrait cependant avoir très peu de poids.
Option<T>
structure et renvoyez-la. Cesbool Try(..., out data)
fonctions sont une abomination.