Estou escrevendo um tipo de implementação de Fila que possui um TryDequeuemétodo que usa um padrão semelhante a vários TryParsemétodos do .NET , onde retorno um valor booleano se a ação for bem-sucedida e uso um outparâmetro para retornar o valor real de saída da fila.
public bool TryDequeue(out Message message) => _innerQueue.TryDequeue(out message);
Agora, gosto de evitar outparâmetros sempre que posso. O C # 7 nos fornece delcarações variáveis para facilitar o trabalho com eles, mas ainda considero os parâmetros mais um mal necessário do que uma ferramenta útil.
O comportamento que eu quero desse método é o seguinte:
- Se houver um item para desenfileirar, devolva-o.
- Se não houver itens a serem desenfileirados (a fila está vazia), forneça ao chamador informações suficientes para agir adequadamente.
- Não basta retornar um item nulo se não houver itens restantes.
- Não lance uma exceção se estiver tentando desenfileirar de uma fila vazia.
No momento, um chamador desse método quase sempre usava um padrão como o seguinte (usando a sintaxe da variável C # 7):
if (myMessageQueue.TryDequeue(out Message dequeued))
MyMessagingClass.SendMessage(dequeued)
else
Console.WriteLine("No messages!"); // do other stuff
O que não é o pior, ao todo. Mas não posso deixar de sentir que pode haver maneiras mais agradáveis de fazer isso (estou totalmente disposto a admitir que talvez não exista). Eu odeio como o chamador tem que interromper seu fluxo com um condicional quando tudo o que ele quer é obter um valor, se houver.
Quais são outros padrões existentes para realizar esse mesmo comportamento de "tentativa"?
Por contexto, esse método pode ser chamado potencialmente em projetos VB, portanto, pontos de bônus por algo que funciona bem em ambos. Esse fato deve ter muito pouco peso, no entanto.
Option<T>estrutura e retorne-a. Essasbool Try(..., out data)funções são uma abominação.