Estoy escribiendo un tipo de implementación de cola que tiene un TryDequeuemétodo que usa un patrón similar a varios TryParsemétodos .NET , donde devuelvo un valor booleano si la acción tuvo éxito, y uso un outparámetro para devolver el valor en cola real.
public bool TryDequeue(out Message message) => _innerQueue.TryDequeue(out message);
Ahora, me gusta evitar los outparams siempre que puedo. C # 7 nos brinda delicaciones variables para facilitar el trabajo con ellas, pero sigo considerando los parámetros más un mal necesario que una herramienta útil.
El comportamiento que quiero de este método es el siguiente:
- Si hay un artículo que quitar, devuélvalo.
- Si no hay elementos que retirar (la cola está vacía), proporcione a la persona que llama la información suficiente para actuar de manera adecuada.
- No solo devuelva un elemento nulo si no quedan elementos.
- No arroje una excepción si intenta salir de una cola vacía.
En este momento, una persona que llama de este método casi siempre usaría un patrón como el siguiente (usando la sintaxis variable C # 7):
if (myMessageQueue.TryDequeue(out Message dequeued))
MyMessagingClass.SendMessage(dequeued)
else
Console.WriteLine("No messages!"); // do other stuff
Lo cual no es lo peor, todo dicho. Pero no puedo evitar sentir que podría haber mejores formas de hacer esto (estoy totalmente dispuesto a admitir que tal vez no exista). Odio cómo la persona que llama tiene que romper su flujo con un condicional cuando todo lo que quiere es obtener un valor si existe.
¿Cuáles son algunos otros patrones que existen para lograr este mismo comportamiento de "intento"?
Para el contexto, este método puede llamarse potencialmente en proyectos VB, por lo tanto, puntos de bonificación por algo que funciona bien en ambos. Sin embargo, este hecho debería tener muy poco peso.
Option<T>estructura y devuélvala. Esasbool Try(..., out data)funciones son una abominación.