Sto scrivendo un tipo di implementazione Queue che ha un metodo TryDequeue
che usa un pattern simile a vari metodi .NET TryParse
, dove restituisco un valore booleano se l'azione è riuscita e uso un parametro out
per restituire il valore dequalificato effettivo.
public bool TryDequeue(out Message message) => _innerQueue.TryDequeue(out message);
Ora, mi piace evitare out
params ogni volta che posso. C # 7 ci fornisce le delcarazioni variabili per semplificare il lavoro con esse, ma considero i params più un male necessario che uno strumento utile.
Il comportamento che voglio da questo metodo è il seguente:
- Se è presente un elemento da riaccodare, restituirlo.
- Se non ci sono elementi da rimettere in coda (la coda è vuota), fornire al chiamante informazioni sufficienti per agire in modo appropriato.
- Non restituire solo un oggetto nullo se non ci sono elementi rimasti.
- Non lanciare un'eccezione se stai tentando di disconnetterti da una coda vuota.
Al momento, un chiamante di questo metodo utilizza quasi sempre un modello come il seguente (usando la sintassi variabile C # 7):
if (myMessageQueue.TryDequeue(out Message dequeued))
MyMessagingClass.SendMessage(dequeued)
else
Console.WriteLine("No messages!"); // do other stuff
Che non è il peggiore, tutto sommato. Ma non posso fare a meno di pensare che potrebbero esserci modi migliori per farlo (sono totalmente disposto a riconoscere che potrebbe non esserci). Odio come il chiamante deve interrompere il suo flusso con un condizionale quando tutto ciò che vuole è ottenere un valore se ne esiste uno.
Quali sono alcuni altri schemi esistenti per realizzare questo stesso comportamento "try"?
Per il contesto, questo metodo potrebbe potenzialmente essere chiamato in progetti VB, quindi punti bonus per qualcosa che funziona bene in entrambi. Questo fatto dovrebbe comunque avere un peso molto basso.