Sto scrivendo un tipo di implementazione della coda che ha un TryDequeue
metodo che utilizza un modello simile a vari TryParse
metodi .NET , in cui restituisco un valore booleano se l'azione ha out
esito positivo e utilizzo un parametro per restituire il valore effettivo dequeued.
public bool TryDequeue(out Message message) => _innerQueue.TryDequeue(out message);
Ora, mi piace evitare i out
parametri ogni volta che posso. C # 7 ci fornisce delcarazioni variabili per facilitare il lavoro con loro, ma continuo a considerare i params più un male necessario che uno strumento utile.
Il comportamento che desidero da questo metodo è il seguente:
- Se c'è un oggetto da dequeue, restituiscilo.
- Se non ci sono elementi da accodare (la coda è vuota), fornire al chiamante informazioni sufficienti per agire in modo appropriato.
- Non restituire un articolo null solo se non ci sono articoli.
- Non generare un'eccezione se si tenta di accodare da una coda vuota.
In questo momento, un chiamante di questo metodo userebbe quasi sempre un modello come il seguente (usando la sintassi della variabile out C # 7):
if (myMessageQueue.TryDequeue(out Message dequeued))
MyMessagingClass.SendMessage(dequeued)
else
Console.WriteLine("No messages!"); // do other stuff
Non è il peggiore, tutto sommato. Ma non posso fare a meno di pensare che potrebbero esserci modi migliori per farlo (sono totalmente disposto a ammettere 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 "provare"?
Per il contesto, questo metodo può potenzialmente essere chiamato nei progetti VB, quindi punti bonus per qualcosa che funzioni bene in entrambi. Tuttavia, questo fatto dovrebbe avere un peso molto ridotto.
Option<T>
struttura e restituirla. Quellebool Try(..., out data)
funzioni sono un abominio.